程序的基本结构
- 顺序结构:指程序中的语句顺序执行,无转移、分支和循环。
- 分支结构:是程序根据条件判断,选择执行不同的程序段,即改变执行流程,实现程序分支。
- 循环结构:是程序根据条件是否成立,决定是否重复执行某段程序,这样可避免重复书写需要多次执行的语句,减少程序长度。
复合语句
把若干语句用花括号“{”和“}”扩起来便构成了复合语句,花括号内可以包含任何C语句,其一般形式如下:
{
语句1;
语句2;
…
语句n;
}
if条件分支语句
if流程
语句形式如下:
if(表达式)
语句
这是if语句最简单的一种形式,表达式可以是任何类型的表达式。
输入一个学生的三门功课考试成绩,计算其平均成绩,如果平均成绩大于等于90分,则显示“优秀”。
# include<stdio.h>
void main(){
float x1,x2,x3;
float average;
scanf("%f %f %f",&x1,&x2,&x3);
average = (x1+x2+x3)/3;
if(average>=90){
printf("优秀\n");
}
}
if-else流程
语句形式如下:
if(表达式)
语句1
else
语句2
输入两个整数a和b,若a小于b,交换两数,并输出交换后的a和b的值,否则输出“未交换”信息。
# include<stdio.h>
void main(){
int a, b;
int temp;
scanf("%d %d",&a,&b);
if(a<b){
temp = a;
a = b;
b = temp;
printf("a = %d b = %d\n",a,b);
}else{
printf("未交换\n");
}
}
else if流程
语句形式如下:
if(表达式1)
语句1;
else if(表达式2)
语句2;
…
else if(表达式n)
语句n;
else
语句n+1;
注意:整个if语句中只有一个分支被执行。
根据学生成绩score,按分数分段评定等级A~E。如果分数小于0,则输出“错误”信息。
# include<stdio.h>
void main(){
float score;
char grade;
scanf("%f",&score);
if(score>=90)
grade = 'A';
else if(score>=80 && score<90)
grade = 'B';
else if(score>=70 && score<80)
grade = 'C';
else if(score>=60 && score<70)
grade = 'E';
else
printf("error!\n");
}
多路开关语句
switch语句的一般形式如下:
switch(表达式):
{
case 常量1: 语句1;
break;
case 常量2: 语句2;
break;
…
case 常量n: 语句n;
break;
default: 语句n+1;
}
switch、case和default为关键字。switch后的表达式可以是整型或字符型表达式,不能是关系表达式或逻辑表达式。常量1~n可以是整数、字符或常量表达式。
编写一个实现两个数的算术运算的程序
#include<stdio.h>
void main(){
char op;
printf("输入两个实数和操作符:");
scanf("%f %f %c",&x,&y,&op);
switch (op)
{
case '+':
printf("x + y = %f\n",x+y);
break;
case '-':
printf("x - y = %f\n", x-y);
break;
case '*':
printf("x * y = %f\n",x*y);
break;
case '/':
if(y!=0){
printf("x / y = %f\n",x/y);
}else{
printf("除数不能为0\n");
}
break;
default:
printf("无效操作符\n");
break;
}
}
switch语句经常用来实现屏幕菜单。下面这段程序可以根据用户要求计算一个数的平方或立方,两个数的平方和。
#include<stdio.h>
void main(){
float x,y;
char ch;
printf("请输入你的选项:");
printf("\'1\':计算一个数的平方\n");
printf("\'2\':计算一个数的立方\n");
printf("\'3\':计算两个数的平方和\n");
scanf("%c",&ch);
switch (ch)
{
case '1':
printf("请输入这个数:\n");
scanf("%f",&x);
printf("%f的平方是%f\n",x,x*x);
break;
case '2':
printf("请输入这个数:");
scanf("%f",&x);
printf("%f的立方是%f\n",x,x*x*x);
break;
case '3':
printf("请输入两个数:");
scanf("%f %f",&x,&y);
printf("%f和%f的平方和是%f\n",x,y,x*x+y*y);
break;
default:
printf("无效操作符\n");
break;
}
}
for循环语句
for语句的一般形式为:
for(表达式1;表达式2;表达式3)
语句;
其中,“表达式1”一般为赋值表达式,为循环控制变量赋初值;“表达式2”一般为关系表达式或逻辑表达式,作为控制循环结束条件;“表达式3”一般为赋值表达式,为循环控制变量增量或减量;“语句”为循环体,可以是单语句,也可以是复合语句。
- for语句的任何一个表达式都可以省略,但不能省略分号“;”。
- for语句中可应用逗号表达式,使两个或多个控制变量同时控制循环。
- C语言的for语句允许在循环体内改变循环控制变量的值。
打印九九乘法表
#include<stdio.h>
void main(){
int i,j;
printf(" *");
for(i = 1; i<=9; i++){
printf("%4d",i);
}
printf("\n");
for(i = 1; i<=9;i++){
printf("%4d",i);
for(j = 1;j<=i;j++){
printf("%4d",i*j);
}
printf("\n");
}
}
编写程序显示输入的整数的二进制位组合
#include<stdio.h>
void main(){
int i;
unsigned number, temp;
scanf("%u",&number);
printf("%x\n",number);
for(i = 0; i<16;i++){
temp = (number&0x8000);
temp>>=15;
printf("%1x",temp);
number<<=1;
}
}
while语句和do-while语句
while语句
while语句的一般形式为:
while(表达式)
语句;
这种循环控制结构也称为“先判定”循环结构,特点是当条件成立时,执行循环结构;若一开始条件就不成立,则一次循环也不执行。
编写程序显示所有可见字符的ASCII码标准代码
#include<stdio.h>
void main(){
int i;
printf("ASCII code Decimal hexadecimal");
printf(" ASCII code Decimal hexadecimal\n");
i = 32;
while (i<=79)
{
printf("%6c %6d 0x%04x",i,i,i);
if((i+48)<127)
printf(" %6c %6d 0x%04x\n",i+48,i+48,i+48);
i++;
}
}
输入数字d(0~9),找出1~100中满足以下条件的数:该数的本身及它的平方中都含有数字d。
#include<stdio.h>
void main(){
int i, j, k, d, flag1, flag2;
scanf("%d",&d);
printf("d = %d",d);
for(i = 0; i<=100; i++){
j = i;
flag1 = 0;
while(j>0&&!flag1){
k = j%10;
j/=10;
if(k==d) flag1 = 1;
}
if(flag1){
j = i*i;
flag2 = 0;
while(j>0&&!flag2){
k = j%10;
j/=10;
if(k==d) flag2 = 1;
}
}
if(flag2){
printf("%-5d %-5d\n",i,i*i);
}
}
}
do-while语句
do-while语句的一般形式为:
do{
语句;
}while(表达式);
do-while语句可实现一种“后判定”循环结构。
跳过输入的任意多个空格字符,读入一个非空格字符。
#include<stdio.h>
void main(){
char ch;
do{
scanf("%c",&ch);
}while(ch==' ');
}
编程输入一串字符,以句点“.”作为结束标志,显示其中字母和数字的个数
#include<stdio.h>
void main(){
char ch;
int ch_num, dig_num;
ch_num=dig_num=0;
do{
scanf("%c",&ch);
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) ch_num++;
if(ch>='0'&&ch<='9') dig_num++;
}while(ch!='.');
printf("the number of chars is %d\n", ch_num);
printf("the number of digital is %d\n", dig_num);
}
循环嵌套
在一个循环体内又包含另一个循环结构,称为循环嵌套。内层循环体中再包含新循环结构,称为多重循环嵌套。
break、continue和goto语句
- break语句(跳转语句)可用于switch语句中,使某case子句执行完后,控制立即跳出switch结构,实现多路分支。此外,break语句也用于在for、while或do-while循环中,当需要循环在一定条件下提前终止时,break语句可用于立即跳出循环结构。
在多重嵌套循环中,break语句只能跳出它所在的那一层的循环。 - continue语句只能用于循环结构,continue语句不能强制立即跳出循环结构,而是忽略continue后面的语句,直接进入本循环结构的下一次循环操作。
编写一个程序,它能把输入的字符复制输出,但如果一个相同的字符连续输入几次,则只把它输出一次,如果读到字符‘.’就结束。
#include<stdio.h>
void main(){
char ch,temp;
temp = '.';
do{
scanf("%c",&ch);
if(ch==temp) continue;
temp = ch;
printf("%c",ch);
}while(ch!='.');
}
- goto语句是无条件转移语句。一般形式为:
goto 标号;
…
标号: 语句
结构化程序设计不提倡使用goto语句。