第 3章 C语言的基本程序设计本章主要内容
3.1 C语言的语句概述
3.2 算法与结构化程序设计方法
3.3 顺序结构程序设计
3.4 顺序结构程序设计实训
3.5 选择结构程序设计
3.6 选择结构程序设计实训
3.7 循环结构程序设计
3.8 循环结构程序设计实训
3.1 C语言的语句概述
C语句可分为以下五类:表达式语句、函数调用语句、控制语句、复合语句、空语句。
1 表达式语句表达式语句由表达式加上分号“;”组成。
格式为,表达式;
例如,sum=a+b;
i++;
printf("Hello,everyone!\n ");
执行表达式语句就是计算表达式的值。最常用的表达式语句是赋值语句和函数调用语句 。
2 函数调用语句格式为,函数名 (实际参数表 );
执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求取函数值。 (在第六章函数中详细介绍 )
例,printf("C Program ");调用库函数,输出字符串。
3 控制语句控制语句用于控制程序的流程,以实现程序的各种结构方式。
C语言有九种控制语句。 可分成以下三类:
( 1)条件判断语句
if语句,switch语句
( 2)循环执行语句
do while语句,while语句,for语句
( 3)转向语句
break语句,goto语句,continue语句,return语句
4 复合语句在 C 语言中,把多个语句用一对大括号,{ }”括起来组成的语句称复合语句。 在程序中应把复合语句看成是单条语句,而不是多条语句,例如例如,{
x=y+z;
a=b+c;
printf("%d%d ",x,a);
}
是一条复合语句。复合语句内的各条语句都必须以分号
,;”结尾,在括号,}”外不能加分号。
5 空语句格式,;
功能,不进行任何操作,只起到占位的作用,在程序中可用来作空循环体。
例如,for(i=0;i<100;i++);
这里的循环体为空语句,for循环虽然执行了多次,
由于循环体为空,循环只是有延时作用而已。
[Return]
3.2 算法与结构化程序设计方法
3.2.1 算法
1 算法的概念数据结构 (data structure)是对数据的描述,在程序中要指定数据的类型和数据的组织形式;算法
(algorithm)是对操作的描述,即操作步骤。实际上,一个程序除了以上两个主要要素之外,还应当采用结构化程序设计方法进行程序设计,并且用某一种计算机语言表示。
程序=算法十数据结构十程序设计方法十语言工具和环境计算机的算法可分为两大类:数值运算算法和非数值运算算法。数值运算算法主要用于解决数值计算问题,
如求方程的根、求函数值、求定积分等。数值运算算法以外的算法均属于非数值运算算法,如排序问题采用的算法就是非数值运算算法。
【 例 3-1】 交换两个变量 a,b的值。
对于交换两个变量 a,b值问题,可以借助于临时变量 c,采用以下步骤实现:
S1,c=a; S1,c=b;
S2,a=b; 或 S2,b=a;
S3,b=c; S3,a=c;
【 例 3-2】 求 1+ 2+ 3+ … + 10的和。
设两个变量 S和 i,分别用以存放部分和及整数 l~ 10。
采取以下步骤实现目标:
S1,S= 0
S2,i=1
S3,S=S+ i
S4,i= i+ l
S5:如果 i不大于 10,则返回重新执行步骤 S3及其后续的 S4,S5。否则,算法到此结束,变量 S中保存的就是要求的和。
2 算法的特性
(1) 有穷性一个算法必须包含有限个操作步骤,且要在合理的时间范围内由计算机处理完成。
(2) 确定性算法中的每一个步骤都应当是确定的,而不应当是含糊的、
有歧义的。
(3) 有零个或多个输入所谓输入是指在执行算法时需要从外界取得必要的信息。
(4) 有一个或多个输出算法的目的是为了求解,“解”就是输出。一个算法得到的结果就是算法的输出。没有输出的算法是没有意义的。
(5) 有效性算法中的每一个步骤都应当能有效地执行,并得到确定的结果。
3 算法的表示算法的表示或者描述主要可以用以下几种方法:自然语言、
流程图,N-S结构图和伪代码。其中最常用的方法是流程图和
N-S结构图。
( 1)三种基本结构
l)顺序结构:其中 A和 B两个框是顺序执行的(其结构如图
3-1)。
2)选择结构或称分支结构:根据给定的条件 p是否成立而选择执行 A框或 B框,A框和 B框必有一个被执行(其结构如图 3-
2)。
3)循环结构(又称重复结构),即重复执行某一部分操作的结构。循环结构分两种:当型循环结构和直到型循环结构。
① 当型循环结构:如图 3-3(a)所示。
② 直到型循环结构:如图 3-3(b)所示。
A
B
图 3-1顺序结构 图 3-2选择结构
(a)当型循环 (b)直到型循环
( 2) 用 N-S结构图表示算法图 3-4为例 3-1的 N-S结构图。图 3-5为例 3-2的 N-S结构图。
c=a
a=b
b=c
图 3-4 例 3-1的
N-S结构图图 3-5例 3-2的
N-S结构图
3.2.2 结构化程序设计方法一个结构化程序就是用高级语言表示或实现的结构化算法。结构化程序设计方法包括以下几个步骤:自顶而下、逐步细化、模块化设计、结构化编码。
对于一个复杂的任务,先要对其进行详尽的分析,把它分解成若干个相互独立的子任务(模块):再把每一个子任务分解成若干个更小的子任务(子模块),直到子任务足够小,可以直接用简单的算法来实现为止;然后对每一个分解后的子任务(子模块)进行程序编码,
即模块化程序设计:最后按照刚才分解的相反顺序组合各个模块,最终解决问题。
这种设计时自顶而下、逐步细化,实现时自下而上、
逐步组合的结构化程序设计方法全局性强,有利于保证程序层次分明、结构清晰、算法正确。 [Return]
3.3.1 数据的输入输出
(一)字符输出函数
一般形式,putchar( c)
函数作用:向终端输出一个字符 字符型变量 整型变量数据的输入输出例,输出单个字符。
#include<stdio.h>
void main()
{
char a,b,c;
a=‘B’;b=‘O’;c=‘Y’;
putchar(a);putchar(b);putchar(c);putchar(‘ \
n’);
}
运行结果,BOY
putchar(a);putchar(?\n?);putchar(b);putchar(?\n?);putchar(c);putchar(?\n?);
运行结果,B
O
Y
数据的输入输出
(二)字符输入函数
一般形式,getchar()
函数作用:从终端(或系统隐含指定的输入设备)输入一个字符。
函数值:从输入设备得到的字符。
数据的输入输出例,输入单个字符。
#include<stdio.h>
void main()
{
char c;
c=getchar();
putchar(c);
putchar(‘ \n’);
}
运行程序:
从键盘输入字符 ‘ a’
按 Enter键屏幕上将显示输出的字符 ‘ a’
a
a
格式输入与输出
(一)格式输出函数
函数作用:向终端(或系统隐含指定的输出设备)输出若干个任意类型 的数据。
一般格式,printf(格式控制,输出表列)
%d:以带符号的十进制形式输出整数
%o:以八进制无符号形式输出整数
%x:以十六进制无符号形式输出整数
To be continued……
格式输入与输出
%u:以无符号十进制形式输出整数
%c:以字符形式输出,只输出一个字符
%s:输出字符串
%f:以小数形式输出单,双精度数,隐含输出六位小数
%e:以指数形式输出实数
%g:选用 %f或 %e格式中输出宽度较短的一种格式,不输出无意义的 0
格式输入与输出几种常见的格式符的修饰符:
L:用于长整型整数,可加在格式符 d,o,x,u前面
M(代表一个正整数):数据最小宽度
N(代表一个正整数):对实数,表示输出 n位小数;
对字符串,表示截取的字符个数
—:输出的数字或字符在域内向左靠格式输入与输出
(1)d格式符。用来输出十进制整数。
几种用法:
① %d,按十进制整型数据的实际长度输出。
② %md,
m为指定的输出字段的宽度。如果数据的位数小于m,
则左端补以空格,若大于m,则按实际位数输出。
例,printf( ″ %4d,%4d ″,a,b) ;
若a=123,d=12345,则输出结果为
123,12345
③ %ld,输出长整型数据。
例,long a=135790; /* 定义 a为长整型变量 */
printf( ″ %ld ″,a);
格式输入与输出
(2) o格式符。以八进制整数形式输出。
输出的数值不带符号,符号位也一起作为八进制数的一部分输出。
例,int a=-1;
printf("%d,%o",a,a);
-1在内存单元中的存放形式(以补码形式存放)如下:
1111111111111111
输出为,
-1,177777
不会输出带负号的八进制整数。对长整数(long型)可以用,%lo,格式输出。还可以 指定字段宽度 。
例,printf( "%8o ",a) ;
输出为,177777。 (数字前有 2个空格 )
格式输入与输出
(3)x格式符。以十六进制数形式输出整数。同样不会出现负的十六进制数。
例,int a=-1;
printf( ″ %x,%o,%d ″,a,a,a);
输出结果为,
ffff,177777,-1
可以用,%lx,输出长整型数,也可以 指定输出字段的宽度。
例,,%12x,
格式输入与输出
(4)u格式符,用来输出unsigned型数据。
一个有符号整数(int型)也可以用%u格式输出;
一个unsigned型数据也可以用%d格式输出;
unsigned型数据也可用%o或%x格式输出。
(5)c格式符,用来输出一个字符。
如:char d= ′ a ′ ;
printf( ″ %c ″,d);
输出字符 ′ a ′.
一个整数,只要它的值在0~255范围内,可以用,%c,
使之按字符形式输出,在输出前,系统会将该整数作为 ASCII码转换成相应的字符;一个字符数据也可以用整数形式输出。
格式输入与输出例,字符数据的输出。
#include<stdio.h>
void main()
{
char c=‘a’;
int i=97;
printf(“%c,%d \n”,c,c);
printf(“%c,%d \n”,i,i);
}
运行结果:
a,97
a,97指定输出字数的宽度,printf(“%3c”,c);
则输出:
a
格式输入与输出
(6)s格式符 输出字符串,
① %s 。例如:
printf( ″ %s ″,″ CHINA ″ )
输出字符串,CHINA,(不包括双引号)。
② %ms,输出的字符串占 m列,若串长大于 m,则全部输出,若串长小于 m,则左补空格。
③ %-ms,若串长小于 m,字符串向左靠,右补空格。
④ %m,ns,输出占 m列,只取字符串中左端 n个字符,输出在 m列的右侧,左补空格。
⑤ %-m.ns,n个字符输出在 m列的左侧,右补空格,若 n〉 m,m自动取 n值。
格式输入与输出例,字符串的输出。
#include<stdio.h>
void main()
{
printf(“%3s,%7.2s,%.4s,% -5.3s\n”,“CHINA”,
“CHINA”,“CHINA”,“CHINA”);
}
运行结果:
CHINA,CH,CHIN,CHI
格式输入与输出
(7)f格式符。用来以小数形式输出实数(包括单双精度)
有以下几种用法:
① %f 。不指定字段宽度,由系统自动指定字段宽度,使整数部分全部输出,并输出6位小数。应当注意,在输出的数字中并非全部数字都是有效数字。单精度实数的有效位数一般为7位。
② %m,nf 。指定输出的数据共占m列,其中有n位小数。如果数值长度小于m,则左端补空格。
③ %-m,nf 与%m,nf基本相同,只是使输出的数值向左端靠,右端补空格。
格式输入与输出例,输出实数时的有效位数。
#include <stdio.h>
void main()
{ float x,y;
x=111111.111;
y=222222.222;
printf( ″ %f ″,x+y);

运行结果:
333333,328125
格式输入与输出例,输出双精度数时的有效位数。
#include <stdio.h>
void main()
{ double x,y;
x=1111111111111.111111111;
y=2222222222222.222222222;
printf(“%f”,x+y);

运行结果:
3333333333333.333010
格式输入与输出例,输出实数时指定小数位数。
#include <stdio.h>
void main()
{
float f=123.456;
printf(“%f%10f%10.2f%.2f%-10.2f\ n”,f,f,f,f,
f);

运行结果:
123.455994 123.455994 123.46 123.46 123.46
格式输入与输出
(8)e格式符,以指数形式输出实数。
可用以下形式:
① %e。不指定输出数据所占的宽度和数字部分的小数位数,
例,
printf( ″ %e ″,123.456);
输出:
1.234560 e+002
6列 5列所输出的实数共占13列宽度。 (注:不同系统的规定略有不同 )
格式输入与输出
(9)g格式符,用来输出实数,
它根据数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种),且不输出无意义的零。
例,若f=123.468,则
printf( ″ %f %e %g ″,f,f,f);
输出如下:
123.468000 1.234680e+002 123.468
10列 13列 10列说明,
用%f格式输出占10列,用%e格式输出占13列,用%g
格式时,自动从上面两种格式中选择短者(今以%f格式为短)
故占10列,并按%f格式用小数形式输出,最后 3个小数位为无意义的0,不输出,因此输出 123.468,然后右补 3个空格。
%g格式用得较少。
格式输入与输出说明:
除了 X,E,G外,其他各式字符必须用小写。
可以在 printf函数中的“格式控制”字符串中包含转义字符。
一个格式说明必须以,%”开头,以 9个格式字符之一为结束,中间可以插入附加格式字符。
想输出 %,则应该在格式控制字符串中用连续两个 %表示。
格式输入与输出
(一)格式输入函数
函数作用:按照变量在内存的地址将变量值存进去。
一般格式,scanf(格式控制,地址表列)
同 printf函数是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址格式输入与输出例,用 scanf函数输入数据。
#include<stdio.h>
void main()
{
int a,b,c;
scanf(“%d%d%d”,&a,&b,&c);
printf(“%d,%d,%d \n”,a,b,c);
}
运行情况:
3 4 5 (输入 a,b,c的值 )
3,4,5 (输出 a,b,c的值)
a在内存中的地址
&是地址运算符格式输入与输出说明:
对 unsigned型变量所需要的数据,可以用 %u,
%d或 %o,%x格式输入。
可以指定输入数据所占的列数,系统自动按它截取所需数据。
如果在 %后有一个,*” 附加说明符,表示跳过它指定的列数。
输入数据时不能规定精度。
格式输入与输出使用scanf函数时应注意的问题,
(1)scanf函数中的“格式控制”后面应当是变量地址,
而不应是变量名。
(2) 如果在“格式控制”字符串中除了格式说明以外还有其他字符,
则在输入数据时在对应位置应输入与这些字符相同的字符。
(3) 在用“%c”格式输入字符时,空格字符和“转义字符”
都作为有效字符输入 。
(4) 在输入数据时,遇以下情况时认为该数据结束。
① 遇空格,或按“回车”或“跳格”( Tab)键;
② 按指定的宽度结束,如“%3d”,只取3列;
③ 遇非法输入。
3.4 顺序结构程序设计实训顺序结构程序设计可归纳为五步:
⑴ 包含头文件或宏定义(不是必有的)
⑵ 定义变量和类型
⑶ 变量赋初值(可定义时赋,或用赋值语句,或键入)
⑷ 计算处理(考虑类型转换、溢出)
⑸ 输出结果(考虑类型、精度)
根据上面介绍的步骤进行下面的程序设计。
【 例 3-7】 计算任意两整数的和、差、积、商。
【 例 3-8】 计算圆柱的体积。
【 例 3-9】 计算一元二次方程 ax2+bx+c=0的根。 (假设 b2-4ac>0)
【 例 3-10】 按不同格式输出整型与长整型。
【 例 3-11】 输入一个三位正整数,以倒序形式输出它的各位数。
[Return]
3.5 选择结构程序设计
3.5.1 if 语句
1 if语句的三种基本格式
(1) if型 (单分支 if 语句 )
1)格式
if (表达式 ) 语句;
2)执行过程如果表达式的值为真,则执行其后的语句,否则不执行该语句,执行后继语句。其执行过程如图所示:
3)使用说明:
这里的表达式一般是关系表达式、逻辑表达式,但还可以是算术表达式、赋值表达式或字符表达式,甚至也可以是一个变量,这正是 C语言灵活性的具体体现。 系统对表达式的值进行判断,若为非零就按真来处理,执行语句;若为零就按假来处理,不执行语句。
# include <stdio.h>
void main()
{
int num1,num2,sum;
printf("\n请输入两个数,");
scanf("%d %d",&num1,&num2);
sum = num1+ num2 ;
if(sum > 100)
printf("\n两数的和大于 100 \n ");
}
简单 if语句的示例内存
num1 num2
sum
56 78
134
请输入两个数,56 78
两数的和大于 100
【 例 3-12】 输入两个整数,比较它们的大小,并将其中的大数输出 。
分析:要定义的变量应最少为 a,b,因为要比较大小,所以还应有另外一个变量 max。
解,main()
{ int a,b,max;
printf(“please input two numbers:”);
scanf(“%d,%d”,&a,&b);
max=a;
if(max<b) max=b;
printf(“the max number is %d”,max);
}
输入两个实数,按代数值由小到大的顺序输出这两个数。
#include<stdio.h>
void main()
{float a,b,t;
scanf(″%f,%f″,&a,&b);
if(a>b)
{t=a;
a=b;
b=t;}
printf(″ %5.2f,%5.2f\n″,a,b);}
y
n
a>b
T=a
A=b
B=t
if-else语句的示例输入三个数 a,b,c,要求按由小到大的顺序输出。
If a>b 将 a和 b对换
If a>c 将 a和 c对换
If b>c 将 b和 c对换
a>b
a>c
b>c
a和 b交换 a和 c交换 c和 b交换
y
y
y
n
n
if-else语句的示例
#include <stdio.h>
void main ( )
{ float a,b,c,t;
scanf(″ %f,%f,%f″,&a,&b,&c);
if(a>b)
{t=a;a=b;b=t;}
if(a>c)
{t=a;a=c;c=t;}
if(b>c)
{t=b;b=c;c=t;}
printf("%5.2f,%5.2f,%5.2f\n",a,b,c);
}
if-else语句的示例
(2) if-else型(双 分支 if 语句)
1)格式:
if (表达式 ) 语句 1;
else 语句 2;
2)执行过程如果表达式的值为真,则执行语句 1,否则执行语句 2,语句 1或语句 2执行完之后,执行后继语句。其执行过程如图所示:
生活中的例子
if (我中了这一期体彩的 500万大奖 )
{
我买房;
我买车;
我去欧洲旅游;
}
else
{
我要修理一下自行车;
我买下一期体彩;
我继续烧香;
}
3)使用说明:
1、语句 1、语句 2后面都必须有,;”,它们可以是简单语句,也可以是复合语句。
2、若 if语句中,在表达式为真或为假时,都执行一个赋值语句,且是给同一个变量赋值,就可以用条件表达式来处理。如:
max=(a>b)?a:b;
当然,条件表达式很多时候不能取代一般的 if语句。
3,if 语句可以单独存在,但 else 语句不能单独存在。
例题,用 if-else语句修改例题 3- 12,如下:
Main()
{int a,b,max;
printf(“please input two numbers:”);
scanf(“%d,%d”,&a,&b);
if(a>b) max=a;
else max=b;
printf(“max=%d\n”,max);
}
#include <stdio.h>
void main()
{
int num;
printf("\n请输入一个整数,");
scanf ("%d",&num);
if((num % 2) == 0)
printf("%d 是一个偶数 。 \n",num);
else
printf("%d 是一个奇数 。 \n",num);
}
if-else语句的示例内存
num
57
请输入一个整数,57
57 是一个奇数。
不能上菜有胡萝卜吗?
有黄瓜吗?
制作胡萝卜沙拉有多重条件判断有可以上菜制作黄瓜沙拉制作黄瓜沙拉没有没有开始做黄瓜沙拉做胡萝卜沙拉有没有不能上菜可以上菜是否有胡萝卜有没有是否有黄瓜?
结束多重 if
要处理多重条件判断的情况,需要使用多重条件结构多重条件结构嵌套 if switch结构多重条件结构
if (表达式 1)
语句 1;
else if (表达式 2)
语句 2;
else if (表达式 3)
语句 3;
.
.
else
语句 n;
多重 if 结构是 if-else 的另一种形式,这种形式也称为阶梯式 if-else-if
多重 if 结构真 假真 假真 假多重 if 结构示例问题描述:
编写一个程序,根据用户输入的期末考试成绩,输出相应的成绩评定信息。成绩大于等于 90分输出“优”;成绩大于等于 80分小于 90分输出“良”;成绩大于等于 60分小于 80分输出“中”;成绩小于 60分输出“差”。
#include <stdio.h>
void main()
{
float grade;
printf("\n 请输入期末考试成绩,");
scanf("%f",&grade);
if(grade>100 || grade<0)
printf(“\n 输入错误! ");
else if(grade>=90)
printf("\n 优 ");
else if ((grade>=80))
printf("\n 良 ");
else if ((grade>=60))
printf("\n 中 ");
else
printf("\n 差 ");
printf("\n");
}
内存
grade
59
请输入期末考试成绩,59
差嵌套 if 结构 2-1
If语句的嵌套在 if语句中又包含一个或多个 if语句称为 if语句的嵌套。
形式:
if()
if() 语句 1
else 语句 2
else
if() 语句 3
else 语句 4
内嵌 if
嵌套 if 结构就是 将整个 if 块插入另一个 if 块中嵌套 if 结构 2-1
if (表达式 1)
if (表达式 2)
if (表达式 3)
语句 ;
else
语句 ;
真真真假
if (x > 0)
if (y > 1)
z = 1;
else /*这个 else 部分属于哪个 if? */
z = 2;
嵌套 if 结构 2-2
C语言规定,每个 else 部分总属于前面最近的那个缺少对应的 else 部分的 if 语句。
提倡使用大括号括起来以避免看起来有二义性。
#include<stdio.h>
void main()
{
int a,b;
printf("\n 请输入 A 和 B 的值,");
scanf("%d%d",&a,&b);
if(a!=b)
if(a>b)
printf("\n A>B\n");
else
printf("\n A<B\n");
else
printf("\n A=B\n");
}
嵌套 if 结构的示例内存
a b
68 93
输出:
A<B
-1 (x<0)
例 有一个函数 y= 0 (x=0),编一程序,输入一个 x
值,输出 y值 。 1 (x>0)
算法 1,算法 1:
输入 x 输入 x
若 x<0,则 y=-1 若 x<0,则 y=-1
若 x=0,则 y=0 否则:
若 x>0,则 y=1 若 x=0,则 y=0
输出 y 若 x>0,则 y=1
输出 y
5.3 if语句
#include<stdio.h>
void main()
{
int x,y;
scanf(“%d”,&x);
{
程序段
}
printf(“x=%d,y=%d\n”,x,y);
}
上例中的程序段有四个,请判断哪个是正确的?
程序 1,程序 2:
If(x<0) if(x>=0)
Y=-1; if(x>0) y=1;
else else y=0;
If(x==0) y=0; else y=-1;
Else y=1;
程序 3,程序 4:
Y=-1; y=0;
If(x!=0) if(x>=0)
If(x>0) y=1; if(x>0) y=1;
else y=0; else y=-1;
正确 正确
switch 结构 3-1
printf(“这是迈克尔,身高 180cm,加利福尼亚第 12 大街,);
printf(“这是丹尼尔,身高 193cm,现居住地不明,1998 年 12 月 12 日在佛罗里达被捕,);
printf(“这是吉姆,身高 175cm,
墨西哥州海鸥路弗罗拉公寓,于 2003 年
11 月 1 日在新泽西因抢银行被捕,);
printf(“未发现匹配项。对不起!,);
停止搜索停止搜索停止搜索停止搜索警察记录嫌疑犯照片不是这是吉姆,身高 175cm,
墨西哥州海鸥路弗罗拉公寓,
于 2003 年 11 月 1 日在新泽西因抢银行被捕不是是
switch-case 语句是多路判断语句
switch 语句计算条件表达式并对照多个常数值进行检查
switch 结构 3-2
switch (表达式 )
{
case 常量 1:
语句 ;
break;
case 常量 2:
语句 ;
break;
default:
语句 ;
}
计算表达式的值如果等于常量 1
如果等于常量 2
如果没有找到匹配的值
switch 结构 3-3
在使用 switch结构时应注意以下几点:
在 case后的各常量表达式的值不能相同,否则会出现错误;
在 case后,允许有多个语句,可以不用 {}括起来;
多个 case可以共用一组执行语句 ;
每个 case语句后都必须有一个 break语句,否则会出现错误;
各 case和 default子句的先后顺序可以变动,而不会影响程序执行结果;
default子句可以省略;
有以下程序
main()
{ int i;
scanf(“%d”,&i);
switch(i)
{
case 1,printf("%d",i);
case 2,printf("%d",i);
default,printf("%d",i);
}
}
若输入 i 的值为 1,则执行后输出的结果是?
switch 结构示例问题描述:
要求用户输入一个字符值并检查它是否为元音字母。
char in_char;
printf("\n 请输入一个小写字母,");
scanf("%c",&in_char);
switch(in_char)
{
case 'a',printf("\n 您输入的是元音字母 a\n");
break;
case 'e',printf("\n 您输入的是元音字母 e\n");
break;
case 'i',printf("\n 您输入的是元音字母 i\n");
break;
case 'o',printf("\n 您输入的是元音字母 o\n");
break;
case 'u',printf("\n 您输入的是元音字母 u\n");
break;
default,printf("\n 您输入的不是元音字母 \n");
}
内存
in_char
e
请输入一个小写字母,e
您输入的是元音字母 e
main()
{int score;
printf (“please input a score”);
scanf(” %d”,&score) ;
Score=score/10;
Switch(score)
{case10:
case9,printf(“grade=优秀 \n”);break;
case8,printf(“grade=良好 \n”); break;
case7,
case6,printf(“grade=中等 \n”); break;
case5:
case4,
case3:
case2:
case1:
case0,printf(“grade=差 \n”); break;
default:printf(“输入错误 \n”);
}
}
示例 2-1
问题描述:
要求判别键盘输入字符的类别。可以根据输入字符的
ASCII码来判别类型。在 0~ 9之间的为数字,在 A~ Z之间为大写字母,在 a~ z之间为小写字母,其余则为其它字符。
void main()
{
char c;
printf("\n 请输入一个字符,");
c=getchar();
if(c>='0'&&c<='9')
printf("\n 该字符是一个数字 。 \n");
else if(c>='A'&&c<='Z')
printf("\n 该字符是一个大写字母 。 \n");
else if(c>='a'&&c<='z')
printf("\n 该字符是一个小写字母 。 \n");
else
printf("\n 该字符是其他字符 。 \n");
}
内存
c
E
请输入一个字符,E
该字符是一个大写字母示例 2-2
问题描述:
编写一个简单的计算器,实现两个整型数的四则运算。
int a,b; char op;
printf("\n 输入操作数 1,运算符,操作数 2,");
scanf("%d,%c,%d",&a,&op,&b);
switch(op)
{
case '+',printf("\n %d+%d=%d\n",a,b,a+b);
break;
case '-',printf("\n %d-%d=%d\n",a,b,a-b);
break;
case '*',printf("\n %d× %d=%d\n",a,b,a*b);
break;
case '/',printf("\n %d/%d=%d\n",a,b,a/b);
break;
default,printf("\n 运算符错误 ! ");
}
输入操作数 1,运算符,操作数 2,45,*,2
45× 2 = 90
内存
a b
op
45 2
*
问题描述:
判定给定的年份是否为闰年。
提示:闰年的判定规则为:能被 4 整除但不能被 100 整除的年份,或能被 400 整除的年份。
#include <stdio.h>
void main()
{
int year;
printf("\n 请输入年份,");
scanf("%d",&year);
if((year % 4 ==0 && year % 100 != 0) || (year % 400 == 0))
printf("\n %d 年是闰年 \n ",year);
else
printf("\n %d 年不是闰年 \n ",year);
}
综合示例 1
请输入年份,2005
2005 年不是闰年问题描述:
输入一个 5位数,判断它是不是回文数。
例如,12321是回文数,个位与万位相同,十位与千位相同。
#include <stdio.h>
void main()
{
long ge,shi,qian,wan,x;
printf("\n 请输入一个五位整数,");
scanf("%ld",&x);
wan=x/10000; //分解出万位数
qian=x%10000/1000; //分解出千位数
shi=x%100/10; //分解出十位数
ge=x%10; //分解出个位数
if (ge==wan && shi==qian) /*个位等于万位并且十位等于千位 */
printf("\n 这个数是回文数 \n");
else
printf("\n 这个数不是回文数 \n");
}
综合示例 2
输出:
请输入一个五位整数,45654
这个数是回文数
3.7 循环结构程序设计循环的必要性 2-1
int result1,result2,result3;
int result4,result5;
result1 = 1 * 10;
printf("1 × 10 = %d \n",result1);
result2 = 2 * 10;
printf("2 × 10 = %d \n",result2);
result3 = 3 * 10;
printf("3 × 10 = %d \n",result3);
result4 = 4 * 10;
printf("4 × 10 = %d \n",result4);
result5 = 5 * 10;
printf("5 × 10 = %d \n",result5);
1 × 10 = 10
2 × 10 = 20
3 × 10 = 30
4 × 10 = 40
5 × 10 = 50
输出结果重复语句循环的必要性 2-2
1 × 10 = 10
2 × 10 = 20
3 × 10 = 30
4 × 10 = 40
5 × 10 = 50
0 + 1
1 + 1
2 + 1
上个数字 + 1
...
重复
(上个数字 +1) × 10
C 语言中的各种循环需要多次重复执行一个或多个任务的问题考虑使用循环来解决
3.7 循环结构程序设计
3.7.1 while循环语句
1格式
while (表达式 ) 语句块;
其中表达式是循环条件,语句为循环体。
2执行过程先计算表达式的值,若表达式的值为真 (非 0)时,执行循环体语句;然后重复执行上面的操作,直到表达式的值为假时结束循环,执行 while循环后面的语句。其执行过程可用图表示。
3 使用说明
1) while语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真 (非 0)即可继续循环
2) 循环体如包括有一个以上的语句,则必须用 {}括起来,
组成复合语句 。
3) 循环体中应有修改循环变量,使循环趋于结束的语句,
否则出现死循环 。
4) 循环之前要为有关变量赋初值 。
一般要设计循环程序,首先要根据问题找出,循环三要素,。 即:
1)有关变量的初始化,应放在循环之前 。
2)循环条件
3)循环内要重复执行的任务 。
例题 3- 21 计算 1+ 2+ 3+ … + 100的和
#include <stdio.h>
void main()
{int i,sum=0;
i=1;
while (i<=100)
{ sum=sum+i;
i++;
}
printf(″%d \\n″,sum);
}
101n n
说明,(1)循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现,(2)在循环体中应有使循环趋向于结束的语句

运行结果,5050
3.7 循环结构程序设计
[<初始化 >]
while(循环条件 )
{
<循环体 >
}
循环条件中使用的变量需要经过初始化
3.7 循环结构程序设计
while (index < 100)
{
.,,
.,,
index++;
}
while 循环主体中的语句必须修改循环条件的值,否则会形成死循环
while (1) 真
#include<stdio.h>
void main ()
{
int num=1,result;
while (num<=10)
{
result=num*10;
printf("%d × 10 = %d \n",num,result);
num++;
}
}
while 循环示例 1
内存
num result
1 null102
输出:
1 × 10 = 10
2 × 10 = 20
3 × 10 = 30
4 × 10 = 40
5 × 10 = 50
6 × 10 = 60
7 × 10 = 70
8 × 10 = 80
9 × 10 = 90
10 × 10 = 100
11 100
3.7.2 do while循环语句
do-while语句的特点,先执行循环体,然后判断循环条件是否成立。
格式,do
循环体语句
while (表达式 );
执行过程,先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零 (“真,) 时,返回重新执行循环体语句,如此反复,直到表达式的值等于 0为止,此时循环结束。
3 使用说明
(1)do-while语句和 while语句的区别在于 do-while是先执行后判断,因此 do-while至少要执行一次循环体。而 while是先判断后执行,如果条件不满足,则一次循环体语句也不执行。
(2) 在 if语句,while语句中,表达式后面都不能加分号,而在 do-
while语句的表达式后面则必须加分号。
(3) do和 while之间的循环体由多个语句组成时,必须用 { }括起来组成一个复合语句。
(4) 编程时 do-while语句和 while语句一般可以相互转换。
(5) 循环之前要为有关变量赋初值。
用 do while语句改写例题 3- 21程序
#include <stdio.h>
void main()
{ int i,sum=0;
i=1;
do
{sum=sum+i;
i++;
}
while(i<=100);
printf("%d\\n″,sum);
}
运行结果,5050
while和 do-while循环的比较在一般情况下,用 while语句和用 do-while语句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。但是如果 while后面的表达式一开始就为假 (0值 )时,两种循环的结果是不同的。
while和 do-while循环的比较
(1) #include <stdio.h> (2) #include <stdio.h>
void main ( ) void main( )
{int sum=0,i; {int sum=0,i;
scanf(“%d″,&i); scanf(”%d″,&i);
while (i<=10) do
{sum=sum+i; { sum=sum+i;
i++; i++;
} while (i<=10);
printf(“sum=%d \\n″
,sum);
} printf(“sum=%d \\n”,sum);
}
101n n
运行结果:
1↙
sum=55
再运行一次:
11↙
sum=0
运行结果:
1↙
sum=55
再运行一次:
11↙
sum=11
说明,(1)当 while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同。否则,二者结果不相同。
3.7.3 for循环语句
for语句是C语言所提供的功能更强,使用更广泛的一种循环语句。
1格式
for(表达式 1;表达式 2;表达 3)
语句;
其中,“语句,即为循环体语句 。
(1) 先计算表达式 1的值 。
(2)再计算表达式 2的值,若值为真 (非 0)则执行循环体语句,否则结束循环,执行 for语句的后继语句 。
(3)然后再计算表达式 3的值,转回第 2步继续执行 。
例如:利用 for语句来计算 1+2+3+… 100的和 。
for( 表达式 1 ; 表达式 2 ; 表达式 3 )
{
语句;
}
for 循环的一般语法:
for 循环
counter = 0;
inum = 1;
cnt = 100;
counter == 10;
inum < 25;
cnt >0
counter ++;
inum = inum + 1;
cnt--
分号用于分隔 for 循环的三个表达式
1、计算表达式 1的值,通常为循环变量赋初值;
2、计算表达式 2的值,即判断循环条件是否为真,若值为真则执行循环体一次,否则跳出循环;
3、计算表达式 3的值,这里通常写更新循环变量的赋值表达式,然后转回第 2步重复执行;
工作原理
1 2
3
4
for 循环表达式 2?
执行 语句成立不成立执行 for循环之后的语句执行表达式 3
执行表达式 1 循环初始条件循环控制条件循环体
for语句等价于下列语句:
表达式 1;
while (表达式 2)
{ 语句;
表达式 3;
}
for语句最简单的形式:
for(循环变量赋初值;循环条件;循环变量增值 )
例如,for(i=1;i<=100;i++) sum=sum+i;
相当于:
i=1;
while(i<=100)
{sum=sum+i;i++;}
用 for语句简单,方便 。
例题:用 for语句改写例题 3- 21。
main()
{int I,sum=0;
for(i=1 ;i<=100;i++) sum+=i;
printf(“sum=%d\n”,sum);
}
3 使用说明
(1) for 语句最常用的格式是,for(循环变量赋初值;循环条件;循环变量的增值 ) 语句;
(2) 表达式 2一般为关系表达式或逻辑表达式。
(3) 表达式 3通常可用来修改循环变量的值,一般是赋值语句。
(4) for语句中的各表达式都可省略,但分号间隔符不能少。
(5) 这三个表达式都可以是逗号表达式,即每个表达式都可由多个表达式组成。
for 循环的表达式
for 循环中有三个表达式
for 语句中的各个表达式都可以省略
分号分隔符不能省略
for(<初始化循环变量 > ;<循环条件 > ; <修改循环变量的值 >)
{
<循环体语句 >;
}
可省略不能省略说明:
(1) for语句的一般形式中的“表达式 1” 可以省略,此时应在 for语句之前给循环变量赋初值。注意省略表达式 1时,其后的分号不能省略。如
for(; i<=100;i++) sum=sum+i;
执行时,跳过“求解表达式 1” 这一步,其他不变。
说明:
(2) 如果表达式 2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式 2始终为真。
例如,for(i=1; ;i++) sum=sum+i;
表达式 1是一个赋值表达式,表达式 2空缺。它相当于:
i=1;
while(1)
{sum=sum+1;i++;}
说明:
(3) 表达式 3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。 如:
for(i=1;i<=100;)
{sum=sum+i;i++;}
在上面的 for语句中只有表达式 1和表达式 2,而没有表达式 3。 i++的操作不放在 for语句的表达式 3的位置处,而作为循环体的一部分,效果是一样的,都能使循环正常结束。
说明:
(4) 可以省略表达式 1和表达式 3,只有表达式 2,即只给循环条件。 如:
for(;i<=100;) while(i<=100)
{sum=sum+i; 相当于 {sum=sum+i;
i++;} i++;}
在这种情况下,完全等同于 while语句。可见 for语句比 while语句功能强,除了可以给出循环条件外,还可以赋初值,使循环变量自动增值等。
说明:
(5) 3个表达式都可省略,如:
for(; ;) 语句相当于
while(1) 语句即不设初值,不判断条件 (认为表达式 2为真值 ),
循环变量不增值。无终止地执行循环体。
说明:
(6) 表达式 1可以是设置循环变量初值的赋值表达式,
也可以是与循环变量无关的其他表达式。 如,
for (sum=0;i<=100;i++)
sum=sum+i;
表达式 3也可以是与循环控制无关的任意表达式。
4 几种循环语句的比较
(1)for循环主要用于循环变量初值、步长、增量以及循环次数确定的循环。
(2)while或 do-while循环主要用于循环次数及判断条件要在循环执行过程中才能确定的循环。
(3)用 while和 do-while循环时,循环变量的初始化应在 while和 do-while语句之前完成。 for循环中,循环变量的初始化可在表达式 1中完成,也可放于循环之前。
(4) while和 do-while循环可以互相转换。 for循环也可以转换为 while和 do-while循环,但是 while和
do-while循环倒不一定能转换为 for循环。
(5) 三种循环中 for循环的功能最强,凡是其它两个循环能实现的,用 for循环也能实现。
3.7.4 break语句和 continue语句
1 break语句
(1) 格式
break;
(2) 执行过程
break语句只能用在 switch 语句或循环语句中,其功能是跳出 switch语句或跳出本层循环,转去执行后继语句。使用
break语句可以使循环语句有多个出口,在某些情况下使编程更加灵活、方便。
2 continue语句格式
continue;
(2) 执行过程
continue语句只能用在循环体中,结束本次循环,即不再执行循环体中 continue 语句之后的语句,转入下一次循环条件的判断与执行。应注意的是,本语句只结束本层本次的循环,
并不跳出循环。
continue 语句 2-2
while(… )
{
……
……
continue;
……
……
}
while(… )
{
……
……
break;
……
……
}
跳出整个循环继续下一次循环例,float pi=3.14159;
for(r=1;r<=10;r++)
{ area=pi*r*r;
if(area>100) break;
printf(″r=%f,area=%f\n″,r,area);
}
程序的作用是计算 r=1到 r=10时的圆面积,直到面积 area大于 100为止。从上面的 for循环可以看到:当 area>100时,执行 break语句,
提前结束循环,即不再继续执行其余的几次循环 。
问题描述:
求整数 1~ 100的累加值,但要求跳过所有个位为 3的数。
#include<stdio.h>
void main()
{
int i,sum = 0;
for(i=1; i<=100;i++)
{
if( i % 10 == 3)
continue;
sum += i;
}
printf("sum = %d \n",sum);
}
continue 语句示例内存
i sum
null 0131
循环执行到 i = 13
78
输出:
sum = 4570
1
循环执行到 i = 101
101 4570
3.7.5 循环的嵌套当循环体内某语句又是循环语句时,就构成了循环的嵌套。
内嵌循环的循环体中还可以出现循环语句,这就构成了多重循环。 C语言中,for语句,while语句,do-while语句可以相互嵌套,构成多重循环。 例如:
(1) for( ; ; ) (3) while()
{… {
while ( ) …
{…} for( ; ; )
… {…}
} …
}
(2)do { (4) for( ; ; )
… {…
for( ; ; ) for( ; ; )
{…} {…}
… …
}while(); }
都是合法的循环嵌套形式。 [Return]
问题描述:
用,*” 输出一个菱形图案,图案如下:
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
嵌套循环示例void main(){
int i,j,k;
for(i=1;i<=4;i++)
{
for(j=1;j<=4-i;j++)
printf(" ");
for(k=1;k<=2*i-1;k++)
printf("*");
printf("\n");
}
for(i=1;i<=3;i++)
{
for(j=1;j<=i;j++)
printf(" ");
for(k=1;k<=7-2*i;k++)
printf("*");
printf("\n");
}
}
输出:
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
控制打印的行数控制每行打印的空格数控制每行打印的 *号数控制打印的行数控制每行打印的空格数控制每行打印的 号数
3.8 循环结构程序设计实训
【 例 3-26】 编程计算 n!。
【 例 3-28】 输入一个正整数,计算并输出这个正整数的各位数字之和。
【 例 3-29】 用穷举法来判断并输出 100以内的素数。
[Return]
求 n!,即计算 p=1× 2× 3× … × n的值。
思路:求阶乘与求累加的运算处理过程类似,只要将,+”变为,*”。
设置:
乘数 i,初值为 1,终值为 n( n是循环控制终值,需要从键盘输入)
累乘器 p,每次循环令 p = p*i
main( )
{ int i,n; long p;
p=1;
printf("Enter n:");
scanf("%d",&n);
for (i=1; i<=n; i++)
p = p * i;
printf("p = %ld \n",p);
}
求 Fibonacci数列前 40个数。这个数列有如下特点:第
1,2两个数为 1,1。从第 3个数开始,该数是其前面两个数之和。 即,
F(1)=1 (n=1)
F(2)=1 (n=2)
F(n)=F(n-1)+F(n-2) (n≥3)
算法如图所示,
求 Fibonacci数列前 40个数。
#include <stdio.h>
void main()
{ long int f1,f2;
int i;
f1=1;f2=1;
for(i=1; i<=20; i++)
{ printf(″%12ld %12ld ″,f1,f2);
if(i%2==0) printf(″ \ n″);
f1=f1+f2;
f2=f2+f1;}
}
101n n
运行结果:
1 1 2 3
5 8 13 21
34 55 89 144
233 377 610 987
1597 2584 4181 6765
10946 17711 28657 46368
75025 121393 196418 317811
514229 832040 1346269 2178309
3524578 57022887 9227465 14930352
24157817 39088169 63245986 102334155
判断输入的某个数 m是否为素数。若是素数,
输出,YES”,若不是,输出
,NO”。
思路:素数是指只能被 1和它本身整除的数,如
5,7,11,17,… 等。
分别用 2,3,…,m-1尝试能否整除整数 m。
如果 m能被某个 数 整除,则 m就不是素数 。
这是一种 穷举算法
设除数为 j,从 2循环到 m-1
算法和程序:
#include "math.h"
main( )
{ int j,m,k;
printf("Enter an integer number,");
scanf("%d",&m);
for (j=2; j<=m-1; j++)
if (m%j==0) break;
printf("%d ",m);
if (j>=m)
printf("YES\n");
else
printf("NO\n");
}
输入一个数 m
for (j=2; j<=m-1; j++)
m%j==0
T F
退出循环
j>=m
T F
输出 "YES,输出 "NO"
运行 jc5_12