C語(yǔ)言控制語(yǔ)句
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <ctype.h> //提供isupper() islower() isspace()等函數(shù)
void char_count(void); // 對(duì)輸入的字符計(jì)數(shù)
void show_ascii(void); // 顯示輸入字符的ASCII碼
void show_dual(void); // 統(tǒng)計(jì)輸入隊(duì)列中的偶數(shù)
void func2(void); // 對(duì)部分字符進(jìn)行替換
void ei_count(void);
void tax1(void);
void char_count(void) {
char ch;
int s_count, n_count, o_count; // s_count記錄空格的數(shù)量,n_count記錄換行的數(shù)量,o_count記錄其他字符的數(shù)量
s_count = n_count = o_count = 0; // 賦值運(yùn)算從右向左執(zhí)行,所以三個(gè)變量都賦值0
printf("輸入任何內(nèi)容,以#作為結(jié)束\n");
while ((ch = getchar()) != '#') // 表達(dá)式ch=getchar()的值是ch被賦予的值
{
????if (ch == ' ') // if語(yǔ)句,()內(nèi)表達(dá)式為非0/true則執(zhí)行{}內(nèi)的語(yǔ)句,{}只有一句時(shí)可省略括號(hào)
????{
????????s_count++;
????}
????else if (ch == '\n') // else if 在if語(yǔ)句 ()括號(hào)為0/false時(shí)執(zhí)行判定
????{
????????n_count++;
????}
????else? // if和else if都為0/false時(shí)執(zhí)行,即ch不是空格也不是換行符
????{
????????o_count++;
????}
}
printf("s_count=%d\tn_count=%d\to_count=%d\n", s_count, n_count, o_count);
}
void show_ascii(void) {
char ch;
printf("輸入任何內(nèi)容,以#作為結(jié)束\n");
for (int i = 1; (ch = getchar()) != '#'; i++)
{
????printf("\'%c\':%d\t", ch, ch);
????if (i % 8 == 0) // 每顯示8個(gè)字符換行
????putchar('\n'); // putchar()打印字符,getchar()讀取字符
}
while (getchar() != '\n') // 上一個(gè)循環(huán)讀到#結(jié)束,如果#后面還有除\n以外的字符,通過(guò)getchar()舍棄整行內(nèi)容,跳到新的一行
????continue; // continue跳過(guò)當(dāng)前單次循環(huán)內(nèi)的剩余內(nèi)容進(jìn)行下一次測(cè)試條件,由于continue后并沒(méi)有其他語(yǔ)句,所以和只寫(xiě)分號(hào);的空語(yǔ)句作用相同,但可讀性高
}
void show_dual(void) {
int i,count, dual;
printf("請(qǐng)輸入整數(shù),輸入0結(jié)束\n");
for (count = dual = 0; scanf("%d", &i) == 1; count++)
{
????if (i == 0)break; //break退出當(dāng)前循環(huán)
????if (i % 2 == 1)
????????continue; //continue跳過(guò)塊內(nèi)剩余部分進(jìn)行下一次迭代、循環(huán),即跳過(guò)下面直到for循環(huán)}括回的語(yǔ)句,執(zhí)行count++和scanf()
????dual++;
}
printf("總數(shù)%d\t其中偶數(shù)%d\n", count, dual);
}
void func2(void) {
char ch;
int count = 0;
printf("請(qǐng)輸入內(nèi)容以#結(jié)束\n");
while ((ch = getchar()) != '#')
{
????switch (ch) // switch語(yǔ)句,計(jì)算()內(nèi)表達(dá)式的值和{}內(nèi)的case標(biāo)簽順序比較,如果有值相同的case會(huì)執(zhí)行:后面的語(yǔ)句,如果都不相同會(huì)執(zhí)行default后的語(yǔ)句,如果沒(méi)有default會(huì)結(jié)束switch,switch()括號(hào)內(nèi)的值必須為整數(shù)
????{
????????case '.': // case后面必須是整數(shù)常量或者由整數(shù)常量組成的表達(dá)式
????????????putchar('!');
????????????count++;
????????????break; // 使用break跳出switch,如果不使用會(huì)繼續(xù)向下執(zhí)行語(yǔ)句
????????case '!':
????????????putchar('!');
????????????putchar('!');
????????????count++;
????????????break;
????????default:
????????????putchar(ch); // default是最后一個(gè),所以不需要寫(xiě)break也會(huì)結(jié)束
????}
}
printf("發(fā)生了%d次替換", count);
}
void ei_count(void) {
char prev, ch;
prev = '\0';
int count = 0;
int lc = 0;
int uc = 0;
int sc = 0;
printf("統(tǒng)計(jì)ei出現(xiàn)的次數(shù),請(qǐng)輸入任意內(nèi)容以#或*結(jié)束\n");
while ((ch = getchar()) != '#' || ch != '*') // ||或邏輯運(yùn)算符,兩側(cè)的表達(dá)式均為0時(shí)||運(yùn)算結(jié)果才為0,運(yùn)算從左往右,遇到1停止并返回1,后面的表達(dá)式不執(zhí)行,邏輯運(yùn)算符|| &&為序列點(diǎn),左側(cè)執(zhí)行完后才會(huì)執(zhí)行后面的,所以右側(cè)的ch的值是左側(cè)ch=getchar()執(zhí)行后賦給ch的值
{
????if (ch == 'i' && prev == 'e') // &&與邏輯運(yùn)算符,兩側(cè)的表達(dá)式均為非0時(shí)&&運(yùn)算的結(jié)果才為1,否則為0,運(yùn)算從左往右,遇到0停止并返回0,后面的表達(dá)式不執(zhí)行
????{
????????count++;
????}
????if (isupper(ch)) // isupper()判斷參數(shù)ch是否為大寫(xiě)字母
????????uc++;
????else if (islower(ch)) { // islower()判斷是否為小寫(xiě)字母
????????ch = toupper(ch); // toupper()將小寫(xiě)字母轉(zhuǎn)換為大寫(xiě)字母
????????lc++;
????}
????else if (isspace(ch)) // isspace()判斷是否為空格\t\n
????????sc++;
????prev = ch;
}
printf("count = %d", count);
}
void tax1(void) {
const int BASE1 = 17850;
const int BASE2 = 23900;
const int BASE3 = 29750;
const int BASE4 = 14875;
const double TAX1 = 0.15;
const double TAX2 = 0.28;
double tax;
printf("稅率計(jì)算,請(qǐng)輸入收入(正整數(shù)):");
for (int i = 0, j = 0; scanf("%d", &i) == 1 && !(i <= 0); ) // !非邏輯運(yùn)算符,優(yōu)先級(jí)僅次于括號(hào),!(i<=0)等價(jià)于i>0
{
????printf("選擇檔位1-4(輸入其他退出):");
????if (scanf("%d", &j) != 1)break;
????switch (j)
????{
????????case 1:
????????????tax = i > BASE1 ? BASE1 * TAX1 + (i - BASE1) * TAX2 : i * TAX1; // 條件運(yùn)算符?: 三元運(yùn)算符, 判斷條件?表達(dá)式2:表達(dá)式3 ,如果判斷條件為非0/true則整個(gè)條件運(yùn)算的值為表達(dá)式2的值,如果判斷條件為0/false則整個(gè)條件運(yùn)算的值為表達(dá)式3的值
????????????break;
????????case 2:
????????????tax = i > BASE2 ? BASE2 * TAX1 + (i - BASE2) * TAX2 : i * TAX1;
????????????break;
????????case 3:
????????????tax = i > BASE3 ? BASE3 * TAX1 + (i - BASE3) * TAX2 : i * TAX1;
????????????break;
????????case 4:
????????????tax = i > BASE4 ? BASE4 * TAX1 + (i - BASE4) * TAX2 : i * TAX1;
????????????break;
????????default:
????????????goto end; // goto語(yǔ)句,跳轉(zhuǎn)到end對(duì)應(yīng)的行,不推薦使用goto
????}
printf("tax = %.2f\n", tax);
printf("輸入收入(正整數(shù))以繼續(xù)計(jì)算:");
}
end: printf("over\n");
}