第3章 顺序结构程序设计 本章要点: 格式化输出函数──printf() 格式输入函数——scanf() 字符输出函数——putchar() 第3章 顺序结构程序设计 本章要点: 格式化输出函数──printf() 格式输入函数——scanf() 字符输出函数——putchar() 字符输入函数——getchar() 顺序结构程序设计 学习方法建议: 本章是程序设计的基础,建议重点掌握格式输入输出函数和字符输入输出函数的使用方法,掌握顺序结构程序的编写方法,本章难点是格式输入输出函数中的格式描述符的用法。
3.1 引例 1.问题分析——华氏温度与摄氏温度的转换。将华氏温度转换为对应的摄氏温度。已知华氏温度与摄氏温度的转换公式为:
程序代码 #include "stdio.h" void main() { double f,c; /*定义变量f和c分别表示华氏温度和摄氏温度*/ scanf("f=%lf",&f); /*输入华氏温度值*/ c=5*(f-32)/9; /*计算摄氏温度*/ printf("c=%.2f\n",c); /*输出摄氏温度*/ }
3.2 C语言的基本语句 C语言的语句可以分为以下5类: 1. 控制语句 控制语句用于完成一定的控制功能。C语言中有9种控制语句: ①if( )…else… (条件语句) ②for( )… (循环语句) ③while( ) … (循环语句) ④do…while( ) (循环语句) ⑤continue (结束本次循环语句) ⑥break (中止执行switch或循环语句) ⑦switch (多分支选择语句) ⑧goto (转向语句) ⑨return (从函数返回语句)
表达式语句由一个表达式加一个分号构成,最典型的是,由赋值表达式构成一个赋值语句。例如:a=3是一个赋值表达式,而a=3;是一个赋值语句。 2. 表达式语句 表达式语句由一个表达式加一个分号构成,最典型的是,由赋值表达式构成一个赋值语句。例如:a=3是一个赋值表达式,而a=3;是一个赋值语句。 3. 函数调用语句 函数调用语句由一个函数调用加一个分号构成,例如: printf("This is a C program. ");
空语句只有一个语句结束符“;”,它不执行任何操作,称为空语句。 5. 复合语句 4. 空语句 空语句只有一个语句结束符“;”,它不执行任何操作,称为空语句。 5. 复合语句 可以用{ }把一些语句括起来构成复合语句(又称分程序)。例如下面的语句是一个复合语句。 {t=x; x=y; y=t; } 注意:复合语句中最后一个语句中最后的分号不能忽略不写。 复合语句在语法上和单一语句相同,即单一语句可以出现的地方, 可以出现复合语句。 复合语句可以嵌套,即复合语句中也可出现复合语句。
3.3 字符数据的输入输出 3.3.1 putchar函数 putchar函数(字符输出函数)的作用是向终端输出一个字符。 其一般格式如下: 3.3 字符数据的输入输出 C语言本身不提供输入输出语句,输入和输出操作是由函数来实现的。在C标准函数库中提供了一些输入输出函数,由于C编译系统与C函数库是分别进行设计的,因此不同的C系统所提供函数的数量、名字和功能是不完全相同的。但有些通用的函数(如printf()和scanf()等),各种C系统都提供,成为各种C系统的标准函数。 3.3.1 putchar函数 putchar函数(字符输出函数)的作用是向终端输出一个字符。 其一般格式如下: putchar(ch) ; 它输出字符变量ch的值,ch可以是字符变量或整型变量。
【例3.1】 输出单个字符。 #include <stdio.h> main() { char a,b,c; a='B';b='O';c='Y'; putchar(a); putchar(b); putchar(c); putchar('\n'); putchar(a); putchar('\n'); /*输出a的值,并换行*/ putchar(b); putchar('\n'); /*输出b的值,并换行*/ putchar(c); putchar('\n'); /*输出c的值,并换行*/ }
3.3.2 getchar函数 getchar( ) ; (1)getchar( )函数只能用于单个字符的输入,一次输入一个字符。 (2)在输入时,空格、回车符都将作为字符输入,而且只有在敲回车键时,读入才开始执行。
【例3. 2】 将输入的小写字母转换成大写字母后输出。 #include <stdio. h>. /. 编译预处理命令:文件包含 【例3.2】 将输入的小写字母转换成大写字母后输出。 #include <stdio.h> /*编译预处理命令:文件包含*/ void main() { char ch1, ch2, ch3; ch1=getchar();/*输入小字母分别赋给变量ch1 ,ch2 ,ch3*/ ch2=getchar(); ch3=getchar(); ch1-=32; /*将小字母转换成大写字母*/ ch2-=32; ch3-=32; putchar(ch1); putchar(ch2) ; putchar(ch3); putchar('\n') ; } 运行结果为: 输入new↙ NEW
程序中如果使用putchar()函数和getchar()函数时,在程序(或文件)的开头必须加上编译预处理命令,即: 从键盘输入字符时,要求new连续输入再回车,如果输入 n↙e↙w↙,则字符n赋给ch1,字符↙赋给ch2,字符e赋给ch3,就不对了。 注意: 程序中如果使用putchar()函数和getchar()函数时,在程序(或文件)的开头必须加上编译预处理命令,即: #include “stdio.h” 或 #include <stdio.h>。 VC++6.0中不加也可以
3.4 格式输入与输出 3.4.1 printf()函数 printf()函数的作用是向计算机系统默认的输出设备(一般指终端或显示器)输出一个或多个任意类型的数据。 1.printf()函数 printf函数的一般格式为: printf (格式控制,输出表列); 功能:输出任何类型的数据。 例如:printf ("radius=%f", radius);
(1)格式控制 格式控制由双引号括起来的字符串,主要包括格式说明和需要原样输出的字符。 ①格式说明 由“%”和格式字符组成,如%d,%f等,作用是将要输出的数据转换为指定的格式后输出。 ②普通字符 需要原样输出的字符。如“printf("radius=%f", radius);”语句中的“radius=”就是普通字符。 (2)输出表列:是需要输出的一些数据,可以是常量、变量和表达式。
2.格式字符 (1)d格式字符:以十进制整数形式输出数据。 ① %d:按整型数据的实际宽度输出。 ② %md:m为一个正整数,用以指定输出数据所占的宽度。如果数据的位数小于m,则右对齐,左端补以空格,若数据位数大于m,则按实际位数输出。 ③%-md:m为一个正整数,用以指定输出数据所占的宽度。如果数据的位数小于m,则左对齐,右端补以空格,若数据位数大于m,则按实际位数输出。 ④ %ld:输出长整型数据。
【例3. 3】 观察printf( )的输出效果。 #include "stdio 【例3.3】 观察printf( )的输出效果。 #include "stdio.h" main( ) { int a=123; long b=12345; printf("a=%d\tb=%ld\n",a,b); printf("a=%2d\tb=%3ld\n",a,b); printf("a=%5d\tb=%8ld\n",a,b); printf("a=%-5d\tb=%-8ld\n",a,b); }
(2)c格式符:用来输出一个字符。 【例3. 4】 字符数据的输出。 #include "stdio (2)c格式符:用来输出一个字符。 【例3.4】 字符数据的输出。 #include "stdio.h" main( ) { char c='b'; int i=98; printf("%c,%d\n",c,c); printf("%c,%d\n",i,i); }
(3)s格式符:用来输出一个字符串。 ① %s,输出一个字符串 ② %ms,输出的字符串占m列,如字符串本身长度大于m,将字符串全部输出。若串长小于m,则右对齐左补空格。 ③ %-ms,输出的字符串占m列,如字符串本身长度大于m,将字符串全部输出。若串长小于m,则左对齐右补空格。 ④ %m.ns,输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。如果n>m,则m自动取n值,即保证n个字符正常输出。 ⑤ %-m.ns,其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,则m自动取n值,即保证n个字符正常输出。
【例3. 5】 字符串的输出。 #include "stdio. h" main( ) { printf("%2s,%8. 3s,% 【例3.5】 字符串的输出。 #include "stdio.h" main( ) { printf("%2s,%8.3s,%.4s,%-7.2s\n", "hello","hello","hello","hello"); }
(4)f格式符:用来输出实数,以小数形式输出。 ① %f,不指定字段宽度,由系统自动指定,使整数部分全部输出,并输出6位小数。双精度数也可以用%lf格式输出。 ② %m.nf,指定输出的数据共占m列,其中有n位小数。如果数值长度小于m,则左端补空格。 ③ %-m.nf与%m.nf基本相同,只是使输出的数值向左端靠,右端补空格。
【例3.6】 输出下列单精度实数和双精度实数。 #include "stdio.h" main ( ) { float f1,f2; double d1,d2; f1=111111.111; f2=222222.222; d1=1111111111111.111111111; d2=2222222222222.222222222; printf("%f\n",f1+f2); printf("%f\n",d1+d2); }
【例3.7】 输出实数时指定小数位数。 #include "stdio.h" main( ) { float f=123.456; 【例3.7】 输出实数时指定小数位数。 #include "stdio.h" main( ) { float f=123.456; printf("%f%10f%10.2f%.2f%-10.2f\n", f,f,f,f,f); }
(4)e格式符,以指数形式输出实数。 ① %e,不指定输出数据所占的宽度和数字部分的小数位数,数值按规范化指数形式输出(即小数点前必须有而且只有1位非零数字)。 ② %m.ne和%-m.ne,m、n和“-”字符含义与前面的相同。此处n指拟输出的数据的小数部分(又称尾数)的位数。
表3-1 printf函数格式字符 格式字符 作用 d或i 十进制整数形式带符号输出(正数不带符号) o 八进制整数形式无符号输出(不带前缀0) x X 无符号输出十六进制整数(不带前缀0x),其中字母小写 无符号输出十六进制整数(不带前缀0x),其中字母大写 u 十进制整数形式无符号输出 f 十进制小数形式输出单、双精度数(默认6位小数) e E 指数形式输出单、双精度数(默认6位小数)字母e小写 指数形式输出单、双精度数(默认6位小数)字母E大写 g G 自动选用f或e形式,字母e小写 自动选用f或e形式,字母E大写 c 输出1个字符 s 输出1个字符串 ld 长整型输出 lo 长八进制整型输出 lx 长十六进制整型输出 lu 无符号长整型输出 m格式字符 按宽度m输出,右对齐 -m格式字符 按宽度m输出,左对齐 m.m格式字符 按宽度m,n位小数,或截取字符串前n个字符输出,右对齐 -m.n格式字符 按宽度m,n位小数,或截取字符串前n个字符输出,左对齐
3.printf()函数应用举例 【例3.8】 用不同的格式输出同一变量。 #include "stdio.h" main( ) { char ch='b'; int x=65; printf("ch=%c,%4c,%d\n", ch, ch, ch); printf("x=%d,%c\n", x, x); }
【例3.9】 输出不同的数据类型的应用。 #include "stdio.h" main() { int a,b; float c; char ch ; a=123; b=-1; c=1.23; ch='a'; printf("a=%d, a=%4d\n", a, a ); /*输出整数a的值*/ printf("%d, %o, %x, %u\n", b, b, b, b); /* 输出b的值*/ printf("%f, %6.1f\n",c,c); /* 输出实数c的值 */ printf("%c\n", ch); /*输出字符变量ch的值*/ }
3.4.2 scanf()函数 1.scanf()函数 scanf函数的一般格式为 scanf(格式控制,地址表列); “格式控制”的含义同printf函数,“地址表列”是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。
scanf("%d%d%d",&a,&b,&c); printf("%d,%d,%d\n",a,b,c); } #include "stdio.h" main() { int a,b,c; scanf("%d%d%d",&a,&b,&c); printf("%d,%d,%d\n",a,b,c); } 其中:&a、&b、&c中的“&”是“地址运算符”,&a指a在内存中的地址。 scanf函数的作用是:按照a、b、c在内存的地址将a、b、c的值存进去,如图3-1所示。 运行结果为: 输入1 2 3↙ 1,2,3 图3-1 变量在内存中存放的情况
(1)格式说明 格式说明主要由“%”和格式符组成的,如%d,%f等,作用是将输入数据转换为指定格式后存入到由地址表所指的相应变量中。
表3-2 scanf()函数的类型字符 格式字符 作用 d,i 输入有符号的十进制整数 U 输入无符号的十进制整数 O 输入无符号的八进制整数 X,x 输入无符号的十六进制整数(大小写作用一样) C 输入单个字符 S 输入1个字符串 F 输入单精度实型数据,(可以用小数形式或指数形式) E,e,g,G 与f作用相同(大小写作用一样) lf、le、lg 输入双精度实型数据 ld、lo、lx、lu 输入长整型数据 hd、ho、hx 输入短整型数据
scanf()函数中的“格式控制”后面应当是变量地址,而不应是变量名。例如:scanf("%d%d",a,b); (2)地址表列 scanf()函数中的“地址表列”部分是由变量的地址组成的,如果有多个变量,则各变量之间用逗号隔开。地址运算符为“&”,如变量a的地址可以写为&a。 注意: scanf()函数中的“格式控制”后面应当是变量地址,而不应是变量名。例如:scanf("%d%d",a,b); 是不对的,应改为scanf("%d%d",&a,&b); 如果在“格式控制”字符串中除了格式说明以外还有其他字符,则在输入数据时在对应位置应输入与这些字符相同的字符。例如:scanf("a=%db=%d",&a,&b);应输入a=3b=4↙。 在用“%c”格式输入字符时,空格字符和“转义字符”都作为有效字符输入。
运行结果为: ABCDEF↙ ch1=A,ch2=C 2.scanf()函数应用举例 【例3.11】 附加格式说明符n(宽度)。 #include "stdio.h" main() { int a, b; char ch1,ch2; scanf("%2c%3c", &ch1, &ch2); printf("ch1=%c,ch2=%c\n", ch1, ch2); } 运行结果为: ABCDEF↙ ch1=A,ch2=C
【例3.12】 “*”号附加说明符的应用。 main( ) { int a,b; scanf("%2d%*3d%2d", &a, &b); printf("a=%d, b=%d\n", a, b); } 运行结果为: 从键盘输入: 23□482□60↙ a=23,b=60
3.5 程序设计举例 【例3.13】输入任意二个整数,求它们的和及平均值。 运行结果为: 3.5 程序设计举例 【例3.13】输入任意二个整数,求它们的和及平均值。 main() { int n1, n2, sum=0; float aver; printf("Please input two numbers:"); scanf("%d, %d", &n1,&n2 ); /*输入二个整数*/ sum=n1+n2; /*求和*/ aver=sum/2.0; /*求平均值*/ printf("n1=%d, n2=%d \n",n1, n2); /*输出结果*/ printf("sum=%d,aver=%5.2f\n", sum, aver ); } 运行结果为: Please input two numbers: 5,10↙ n1=5,n2=10 sum=15, aver= □7.50
运行结果为: 程序输入: 12 34↙ x=12, y=34 x=34, y=12 【例3.14】交换两个变量的值。 #include <stdio.h> main() { int x, y, temp; scanf("%d%d", &x, &y); printf("x=%d,y=%d\n", x, y); temp=x; x=y; y=temp; printf("x=%d, y=%d\n",x, y); } 运行结果为: 程序输入: 12 34↙ x=12, y=34 x=34, y=12
【例3.15】 输入一个double类型的数,使该数保留小数点后两位,对第三位小数进行四舍五入。 #include "stdio.h" main( ) { double x,y; printf("Input x:\n"); scanf("%lf",&x); printf("x=%f\n",x); y=(int)(x*100+0.5)/100.0; printf("y=%f\n",y); }
运行结果为: 请输入圆的半径:1↙ 请输入圆柱体的高:2↙ radius=1.00000 high=2.00000 carea = □□12.57, volume =□□□6.28 【例3.16】 输入圆柱体的半径和 高,计算圆柱体的侧面积和体积。 main() {float radius,high,carea,volume, pi=3.14159; printf ("请输入圆的半径:\n"); scanf ("%f" , &radius); /*从键盘输入一个实数赋给变量radius */ printf ("请输入圆柱体的高:\n"); scanf ("%f",&high); /*从键盘输入一个实数赋给变量high */ carea=2.0 * pi * radius * high; /*求圆柱体侧面积*/ volume=pi * radius * radius * high; /*求圆柱体体积*/ printf ("radius=%f\n", radius); /*输出圆柱体底面半径*/ printf ("radius=%f\n", high); /*输出圆柱体的高*/ printf("carea =%7.2f, volume =%7.2f\n", carea, volume); }
上机实验
一、实验目的 1.掌握printf()和scanf()的应用; 2.掌握getchar()和putchar()的应用。
二、实验内容 1.验证性实验 1)调式并运行下列程序。 #include "stdio.h" main() { int a,b; scanf("%d%d",&a,&b); printf("a=%d,b=%d",a,b); }
2)调式并运行下列程序。 #include "stdio.h" main() { int a,b; scanf("a=%db=%d",&a,&b); printf("a=%d,b=%d",a,b); }
3)输入并运行以下程序。 #include "stdio.h" main() { char c1,c2; c1=97;c2=98; printf("%c,%c\n",c1,c2); }
4)输入并运行以下程序。 #include "stdio.h" main() { int i,j,m,n; i=8;j=10; m=--i;n=j--; printf("i=%dj=%dm=%dn=%d\n",i,j,m,n); }
5)执运行下列程序,从键盘输入: 123 456 #include "stdio.h" main() { char c1,c2,c3,c4,c5,c6; scanf("%c%c%c%c",&c1,&c2,&c3,&c4); c5=getchar(); c6=getchar(); putchar(c1); putchar(c2); printf("%c%c\n",c5,c6); }
6)输入并运行以下程序。 #include "stdio.h" main() { char c1,c2; c1=getchar(); printf("%c,%d\n",c1,c1); c2=c1+32; printf("%c,%d\n",c2,c2); }
2.设计性实验 1)编写程序完成输入一个字母,输出它的后继字母。例如输入'a',则输出'b'。 2)编写程序完成输入两个整数,则输出他们的积。