C语言的语句
从程序流程的角度来看,程序分为三种基本结构,即顺序结构、分支结构(选择结构)、循环结构。通过这三种基本结构可以组成各种复杂程序。C语言提供了丰富的语句来实现这些程序结构。
总的来说C语言的语句可以分为五大类:
1.表达式语句
由表达式组成的语句称为表达式语句,在c语言中任意一个表达式加上分号就构成了一个表达式语句。
//格式为:表达式; c=a+b;//赋值语句 i++; //自增语句 a=1,b=a+2,c=a+b;//逗号表达式
注:我们常见的sizeof(double);事实上为int型表达式。
2.控制语句
控制语句用与控制程序的流程,以实现程序的各种结构,它们常常通过特定的语句定义符组成。
其中C语言拥有九种控制语句:
控制语句 |
名称 |
if 语句 |
条件语句 |
if(表达式)//单分支if语句 if(表达式) 语句块1; else 语句块2;//双分支if语句 if() 语句块1; else if() 语句块n; else 语句块n+1;//多分支if语句 |
注:if语句中括号内判断的为表达式的真假。 |
switch语句 |
多分支选择语句 |
switch(表达式) { case 常量表达式1:语句块1; case 常量表达式2:语句块2; ... case 常量表达式n:语句块n; default:语句块n+1; } |
注:switch语句常搭配break;continue; 使用。 |
for 语句 |
循环语句 |
for(表达式1;表达式2;表达式3) { 循环体语句; } |
注:for语句最简单的应用形式为 for(循环变量初始化;循环判断条件;循环变量值更改) |
功能:先执行表达式1语句,然后判断表达式2的值是否为真(非0)如果为真,则执行循环体语句,接着执行表达式3,之后再判断表达式2的值。如此重复操作,直到表达式2的值为0后终止循环,跳出循环体。 |
|
while语句 |
循环语句 |
while(表达式) { 循环语句; } |
注:诺循环语句为单条语句时可不使用花括号,诺为多条语句则必须使用一对花括号括起来形成复合语句 |
功能:先计算表达式的值,若表达式的值为真(非0)时,则执行循环体语句,然后再返回判断表达式的值,重复执行以上语句;当表达式的值为假(0)时,循环结束,转而执行while语句之后的语句。 |
|
do while语句 |
循环语句 |
do{ 循环体语句 }while(表达式); |
注:与while语句的差别在与do while语句是先进行一次循环再判断 |
功能:先执行循环体语句,然后计算表达式的值。若表达式值为真(非0), 则继续执行循环:若表达式的值为假(0),则结束循环,执行do-while 语句的后续语句。 |
|
break语句 |
终止执行switch或循环语句 |
continue语句 |
结束本次循环语句 |
goto语句 |
无条件转向语句 |
goto语句标号; |
注:此语句尽量少用,因为不利于结构化程序设计,使程序流程无规律、可读性差。 |
功能:先执行循环体语句,然后计算表达式的值。若表达式值为真(非0), 则继续执行循环:若表达式的值为假(0),则结束循环,执行do-while 语句的后续语句。 |
3.函数调用语句
函数调用语句由函数名,实际参数加一个分号构成。
函数名(实际参数表);
功能:执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求出函数值。
4.复合语句
用“{}”把多个语句括起来组成的一个语句被称之为复合语句。
注:在程序中应当把复合语句看成单条语句,而不是多条语句
{ int a; a=2; a=a+|; printf("%d“,a); } //这是一个整体,我们把它看成一条复合语句
注:复合语句内的各条语句都必须以分号“;”结尾;此外,在“}”外不能加分号。
在复合语句内定义的变量是局部变量,仅在复合语句中有效。
5.空语句
空语句由一个分号表示。
;
空语句是指什么也不执行的语句,它在语法上占据一个简单语句的位置。在程序中空语句常用于空循环体。
总体说明:分号是C语言语句结束的标志;C语言对语句的书写格式无固定要求,允许一行书写多条语句,也允许一条语句分行书写。
今日练习
请编写程序,找出⼀段给定⽂字中出现最频繁的那个英⽂字⺟,在⼀⾏中输出出现频率最
⾼的那个英⽂字⺟及其出现次数,其间以空格分隔。如果有并列,则输出按字⺟序最⼩的那个
字⺟。统计时不区分⼤⼩写,输出⼩写字⺟
输⼊样例:This is a simple TEST. There ARE numbers and other symbols .输出样例:e 7
答案及解题思路见下方,欢迎讨论。
最后的话 :如果大家觉得这篇文章对你们有帮助的话希望你们能够点点关注,你们的关注是我继续写下去的动力,谢谢大家。
答案及解析
思路:首先将输入字符串中的大写字母转换为小写字母,再将字符串个字符按ASCII码降序排序,然 后从前往后遍历字符串,统计出现频率最高的字母。
#include <stdio.h> #include <string.h> typedef struct { char c; int cnt; }Character; void Shellsort(char En[], int N); int main() { char En[1001]; Character C, Max; int i, j; char c; for (i = 0; (c = getchar()) != '\n'; i++) { En[i] = c; } En[i] = '\0'; for (i = 0; En[i] != '\0'; i++) { if (En[i] >= 'A' && En[i] <= 'Z') { En[i] = En[i] + 'a' - 'A'; } } Shellsort(En, strlen(En)); C.cnt = 1; for (i = 0; i < strlen(En) && (En[i] <= 'a' || En[i] >= 'z'); i++) {} Max.c = En[i]; Max.cnt = 1; for (i = i; i < strlen(En); i++) { if (En[i] >= 'a' && En[i] <= 'z') { C.c = En[i]; if (En[i - 1] == En[i]) { while (En[i - 1] == En[i]) { C.cnt++; i++; } } } if (Max.cnt <= C.cnt) { Max = C; } C.cnt = 1; } printf("%c %d", Max.c, Max.cnt); return 0; } void Shellsort(char En[], int N) { int i, j, Increament; char tmp; for (Increament = N / 2; Increament > 0; Increament /= 2) { for (i = Increament; i < N; i++) { tmp = En[i]; for (j = i; j >= Increament; j -= Increament) { if (tmp > En[j - Increament]) { En[j] = En[j - Increament]; } else break; } En[j] = tmp; } } }
总结:由于有空格,不能用 scanf 输入字符,可用 getchar 函数;题目要统计的是频率最高的字 母,不是字符串中的任意字符,统计时应判断该字符是否是字母;要注意输入有多个字符但仅有一 个字母的情况;要输出字母序最小的那个字母。