目录
四、最简单的C程序设计——顺序程序设计
前言:在前面我们已经学习了几段简单的C程序,在第2章中介绍了程序用到的一些基本要素(常量、变量、运算符、表达式等),他们是构成程序的基本成分。本章将介绍几种简单的C语言以及怎样编写简单的程序。
4.1语句概述
和其他高级语言一样,C语言的语句用来向计算机系统发出操作指令。一个语句经编译后产生若干条机器指令。一个实际的程序应当包括若干语句。应当指出,C语言都是用来完成一定操作任务的。声明部分的内容不应该称为语句。如"int a;"不是一条语句,它不产生机器操作,而只是对变量定义。
一个函数包含声明部分和执行部分,执行部分是由语句组成的。
程序应该包含数据描述(由声明部分来实现的)和数据操作(由语句来实现的)。数据描述包括定义数据结构和在需要时对数据赋予初始值。数据操作的任务是对已提供的数据进行加工。
C语句分为以下5类:
(1)控制语句。控制语句用于完成一定的控制功能。C只有9种控制语句,它们是:
语句 | |
---|---|
if( ) ... else ... | 条件语句 |
for( ) ... | 循环语句 |
while( ) ... | 循环语句 |
do ... while ( ) | 循环语句 |
continue | 结束本次循环语句 |
break | 中止执行switch或循环语句 |
switch | 多分支选择语句 |
goto | 转向语句 |
return | 从函数返回语句 |
(2)函数调用语句。函数调用语句由一个表达式加一个分号构成,例如:printf("This is a C statement.");
(3)表达式语句。表达式语句由一个表达式加一个分号构成,最典型的是,由赋值表达式构成一个赋值语句,例如: a = 3 是一个赋值表达式,而 a = 3; 是一个赋值语句。可以看出一个表达式的最好加一个分号就成一个语句了。一个语句必须在最后出现分号,分号是语句中不可缺少的组成部分,而不是两个语句间的分隔符号。
(4)空语句。;即只有一个分号的语句,它什么也不做。有时用来作流程的转向点(流程从程序其他地方转到此语句处),也可用来作为循环语句中的循环体(循环体是空语句,表示循环体什么也不做)。
(5)复合语句。可以用{ } 把一些语句括起来称为复合语句(又称分程序)。例如下面是一个复合语句:
{
z = x + y;
t = z / 100;
printf("%f",t);
}
注意,复合语句中最后一个语句中的分号不能忽略不写。
4.2赋值语句
赋值语句是由赋值表达式加上一个分号构成。
-
C语言中的赋值号“=”是一个运算符,在其他大多数语言中赋值号不是运算符。
-
关于赋值表达式与赋值语句的概念,其他多数高级语言没有“赋值表达式”这一概念。作为赋值表达式可以包括在其他表达式之中,例如:
if((a=b)) t=a;
按语法规定if后面的括号内是一个“条件”,例如可以是:“if(x>0) ...”。现在在x的位置上换上了一个赋值表达式“a=b”,其作用是:先进行赋值运算(将b的值赋给a),然后判断a是否大于0,如大于0,则执行t=a。在if语句中的“a=b”不是赋值语句而是赋值表达式,这样写是合法的。如果写成:
if((a=b;)>0) t=a;
就错了。在if的条件中可以包含赋值表达式,但不能包含赋值语句。由此可以看到,C语言把赋值语句和赋值表达式区分开来了,增加了表达式的种类,使表达式的应用几乎“无孔不入”,能实现其他语言中难以实现的功能。
4.3数据输入输出的概念及在C语言中的实现
在讨论输入输出时要注意以下几点:
-
所谓输入输出是以计算机为主体而言的。从计算机向外部输出设备(如显示器、打印机)输出数据称为输出,从输入设备(如键盘、鼠标、扫描仪)向计算机输入数据称为输入。
-
C语言本身不提供输入输出语句,输入和输出操作是由C函数库中的函数来实现的。在C标准函数库中提供了一些输入输出函数,例如printf函数和scanf函数。
不把输入输出作为C语句的目的:
使得C语言编译系统简单,因为将语句翻译成二进制的指令是在编译阶段完成的,没有输入输出语句就可以避免在编译阶段处理与硬件有关的问题,可以使编译系统简化,而且通用性强,可移植性好,在各种型号的计算机都能适用,便于在各种计算机上实现。
-
在使用系统函数库时,要用预制编译命令“#include”,将有关的“头文件”包括到用户源文件中。在头文件中包含了调用函数时所需的信息。在使用标准输入输出库函数时,要用到“stdio.h”文件中提供的信息。文件后缀中“h”是head的缩写,#include命令都是放在程序的开头,因此这类文件叫做“头文件”。在调用标准输入输出库函数时,文件开头应该有以下预编译命令:
#include<stdio.h> //或 include"stdio.h"
stdio是standard input & output的缩写,它包含了与标准I/O库有关的的变量定义和宏定义以及对函数的声明。
4.4字符数据的输入输出
putchar函数
putchar函数(字符输出函数)的作用是向终端输出一个字符。其一半形式为 putchar(c)它输出字符变量c的值,c可以是字符型变量或者整型变量。
用putchar函数可以输出能在屏幕上显示的字符,也可以输出控制字符,如putchar('\n')的作用是输出一个换行符,使得输出的当前位置移到下一行开头。
getchar函数
getchar函数(字符输入函数)的作用是从终端(或系统隐含指定的输入设备)输入一个字符。getchar函数没有参数,其一般形式为:getchar( ) 函数的值就是输入设备得到的字符 。
#include<stdio.h>
int main()
{
char c;
c = getchar(); //从输入设备得到一个字符c,键盘输入后,按回车即可
putchar(c); //输出字符c
puthar('\n'); //换行
return 0;
}
注意,getchar函数只能接收一个字符。getchar函数得到的字符可以赋给一个字符变量或者整数变量,也可以不赋给任何变量,作为表达式的一部分。
刚刚上面的代码也可以写成:
#include<stdio.h>
int main()
{
putchar(getchar());
//或者写成
// printf("%c\n",getchar());
return 0;
}
4.5格式输入输出
printf函数
printf函数是格式输出函数,它的作用是向终端(或系统隐含指定的输出设备)输出若干任意类型的数据(putchar只能输出字符,而且只能一个字符,而printf可以输出多个数据,且为任意类型)。
一般格式为:
printf( 格式控制,输出列表)
例子:
printf("%d,%c\n",i,c);
printf("%d %d\n",a,b);
printf("a=%d b=%d\n",a,b);
printf格式字符:
格式字符 | 说明 |
---|---|
d,i | 以带符号的十进制形式输出整数(正数不输出符号) |
o | 以八进制无符号形式输出整数(不输出前导符0) |
x,X | 以十六进制无符号形式输出整数(不输出前导符x0),用x则输出十六进制数的a~f 时以小写形式输出。用X时则以大写字母输出 |
u | 以无符号十进制形式输出整数 |
c | 以字符形式输出,只输出一个字符 |
s | 输出字符串 |
f | 以小数形式输出单、双精度数,隐含输出6位小数 |
e,E | 以指数形式输出实数,用e时指数以“e”表示(如1.2e+02),用E时指数以“E”表示(如1.2E+02) |
g,G | 选用%f或%e格式中输出宽度较短的一种格式,不能输出无意义的0,。用G时,若以指数形式输出,则指数以大写形式表示 |
printf的附加格式说明字符
字符 | 说明 |
---|---|
l、L | 用于长整型整数,可加在葛师傅d、o、x、u前面 |
m(代表一个正整数) | 数据最小宽度 |
n(代表一个正整数) | 对实数,表述输出n位数小数;对字符串,表示截取的字符个数 |
- | 输出的数字或字符在域内向左靠 |
在使用printf函数输出时,务必注意数据类型应与上述格式说明匹配,否则将会出现错误。
个人练习代码:(练习部分)
#include<stdio.h>
int main()
{
//d格式字符
int a = 123, b = 12345;
// %md m为指定字段的宽度。如果数据的位数小于m,则左端补以空格,若大于则按实际长度输出
printf("%4d,%4d\n",a,b) ; //_123,12345 _的位置代表有一个空格
//%ld 输出长整型数据
long l = 1234567;
printf("%8ld\n",l); //_1234567 这里注意哈,long->%ld ; int->%d和%ld都可
// o格式符 以八进制形式输出
int n = -1;
printf("%d,%o\n",n,n); //-1,37777777777
// 这里的 37777777777 是在 32 位系统上计算出的结果,取决于整数的大小
//(如果是 64 位系统,结果会不同)。
char c = 'a';
printf("%c\n",c); //a
printf("%s\n","CHINA"); //CHINA
printf("%3s,%7.2s,%.4s,%-5.3s\n","CHINA","CHINA","CHINA","CHINA"); //CHINA, CH,CHIN,CHI
//f格式符
// %m.nf,指定输出的数据共占m列,其中有n位小数。如果数据小于m,则左端补空格。
double x;
x = 1234.1234;
printf("%11.5lf,%.6lf\n",x,x); //_1234.12340,1234.123400 注意第一个数的输出,m的使用
return 0;
}
scanf函数
格式输入函数。
一般形式:scanf(格式控制,地址列表)
#include<stdio.h>
int main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c); // &是地址运算符,&a是指a在内存中的地址
printf("%d,%d,%d\n",a,b,c);
return 0;
}
“%d%d%d”表示要按十进制整数形式输入3个数据。输入数据时,在两个数之间可以以一个或多个空格间隔,也可以用Enter键、Tab键。
格式说明
与printf函数中的格式说明相似,以%开始,以一个格式字符结束,中间可以加入附加的字符。
scanf格式字符
格式字符 | 说明 |
---|---|
d,i | 用来输入有符号的十进制数 |
u | 用来输入无符号的十进制数 |
o | 用来输入无符号的八进制数 |
x,X | 用来输入无符号的十六进制数(大小写作用相同) |
c | 用来输入单个字符 |
s | 用来输入字符串,将字符串送到一个数组中,在输入时以非空白字符开始,以第一个空白字符结束。字符串的结束标志'\0'作为其最后一个字符 |
f | 用来输入实数,可以用小数形式或者指数形式输入 |
e,E,g,G | 与f作用相同,e与f、g可以相互替换(大小写作用相同) |
scanf的附加格式说明字符
字符 | 说明 |
---|---|
l | 用于输入长整型数据(可用%ld、%lo、%lx、%lu)以及double型数据(用%lf或%le) |
h | 用于输入短整型数据(可用%hd、%ho、%hx) |
域宽 | 指定输入数据所占宽度(列数),域宽应为整数 |
* | 表示本输入项在读入之后不赋给相应的变量 |
说明:
(1)对unsigned型变量所需的数据,可以用%u、%d或%o、%x输入。
(2)可以指定输入数据所占的列数,系统自动按它截取所需要的数据。例如:
scanf("%3d%3d",&a,&b); //输入 123456
系统会自动将123赋给变量a,456赋给变量b。此方法也可用于字符型:
char ch;
scanf("%3c",&ch); //输入abc
由于ch只能容纳一个字符,系统就把第一个字符'a'赋给字符变量ch。因为ch是char变量,只能存储一个字符。
(3)如果在%后有一个“ * ”附加说明符,表示要跳过它指定的列数。例如:
scanf("%2d %*3d %2d",&a,&b); // 输入12 345 67
//输出
a = 12;
b = 67;
系统会将12赋给整数变量a,%*3d表示读入3位整数但不赋给任何变量。然后再读入两位整数67赋给整数变量b。也就是说第2个数据“345”被跳过。在利用现成的一批数据时,有时不需要其中某些数据,可以用此法“跳过”他们。
(4)输入数据时不能规定精度。
scanf("%7.2f",&a); // 输入1234567
是不合法的。不能企图用这样的scanf函数输入一下数据而使a的值为12345.67。
使用scanf函数应注意的问题
-
scanf函数中的“格式控制”后面应当是变量地址,而不应是变量名。例如:
int a,b; scanf("%d%d",&a,&b); //这种写法是正确的 scanf("%d%d",a,b); //这种写法是错误的
-
如果在“格式控制”字符串中除了格式说明以外还有其他字符,则在输入数据时在对应位置应输入与这些字符相同的字符。例如:
scanf("%d,%d",&a,&b); //输入时应用这种形式:3,4 两个数据之间用逗号隔开 //如果输入时,不用逗号而用空格或者是其他字符都是不对的。
采用这种形式是为了使用户输入数据时添加必要的信息,使含义清楚,不易发生输入数据的错误。
-
在用“%c”格式输入字符时,空格字符和“转义字符”都作为有效数字输入。例如:
scanf("%c%c%C",&c1,&c2,&c3); //输入 :a b c 正确是输入方法应该是:abc //输出 c1 = a; c2 = ' '; c3 = b;
字符'a'送给c1,空格' '送给c2,字符'b'送给c3。%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔。
注意:如果在输入一个字符后习惯回车(也是一个字符),可以在中间价一个getchar()获取一个字符但不赋值给任何变量。
-
在输入数据时,遇到以下情况认为该数据结束。
-
遇空格,或按“回车”或“跳格”(Tab)键。
-
按指定的宽度结束。如“%3d”,只取3列。
-
遇非法输入。
-
4.6顺序结构程序设计举例
1、输入三角形的三边长,求三角形的面积。
#include<stdio.h>
#include<math.h> // 这里使用到了 sqrt 开平方根的函数 需要调用数学函数库中的函数
int main()
{
float a,b,c,s,area;
scanf("%f %f %f",&a,&b,&c);
s = 1.0/2*(a+b+c); //注意 使用1.0而不使用1 是因为 / 两边要保证数据类型一致。
area = sqrt(s*(s-a)*(s-b)*(s-c)); //自己百度查“三角形知三边如何求面积” 数学问题
printf("%f\n",area); //实际题目中,要看清楚输出有没有要求 比如保留多少位小数 %f默认保留6位小数
printf("%.2f\n",area); //保留两位小数输出
return 0;
}
2、从键盘输入一个大写字母,要求改用小写字母输出。
#include<stdio.h>
int main()
{
char c1,c2;
c1 = getchar();
c2 = c1 + 32;
printf("%c",c2);
return 0;
}
声明:本文章为个人学习笔记,资料整理参考谭浩强《C程序设计(第三版)》如有错误,欢迎大家指正!