1、专业选修课,课程:程序设计基础 教材:c语言程序设计实用教程,课程简介,本课程以完成“学生成绩管理系统”为主线,设立循序渐进的8个项目:总分与平均分的计算、成绩转换为等级、成绩分组汇总、成绩排序、有条件成绩汇总、排名、成绩单制作、文件管理。 将C语言的各个知识点融入这些任务中,其中前5个项目对初学者尤为重要,也将是这学期的重点。 理论和实践有机结合,缺一不可,“两手都要抓,两手都要硬”。目标就是学好C语言,为后续课程打下基础。,项目一 学生成绩的平均分与总分的计算,项目要求输入三个学生的成绩,求他们的总分及平均分。,项目分析第一、必须要学会输入成绩及输出结果; 第二、必须对输入的成绩进行总分及
2、平均分的计算。 所以,将这一项目分成二个任务介绍。,任务1 学生成绩的输入、输出,一、问题情景 一个班进行了一次考试,现要将几个学生的成绩输入电脑,并按要求输出。 二、具体实现 #include “stdio.h“ /文件预处理 main() / 函数名 /函数体开始 int x,y,z; /定义三个变量x,y,z printf(“请输入三个学生的成绩“); scanf(“%d%d%d“, /输出三个变量x,y,z的值 /函数体结束 程序运行结果:,从上面这段程序可分析出: 首先,要了解C语言的结构; 第二,要了解C语言的运行环境; 第三,要懂得如何定义变量,输入输出语句。,相关知识,(一)
3、C程序的结构,#include “stdio.h”,int x,y;,main( ),x=1; y=x+2; printf(“x=%dny=%dn”,x,y); ,文件预处理,主函数,数据声明部分,语句部分,1、一个C源程序由一个或多个函数组成。其中必须有一个函数名为main的函数,并且只能有一个main函数。 2、程序运行时从main函数开始,最后回到main函数,直到main函数结束。 3、C函数由语句构成,语句结束必须用“;”表示。 4、“”和“”分别表示函数执行的起点和终点。 5、“/”后面的语句为注释。 6、C程序书写格式自由,一行内可以写几个语句,但区分大小写字母。,说明,(二)
4、C程序运行环境及运行方法,点击【文件】【新建】,出现的对话框中用鼠标点击【文件】【C+Source File】,然后更改文件所保存的目录(若需要更改),需入文件名,然后点击【确定】。输入程序。当程序输入完毕后,点击 或按F7,进行编译和连接。如果没有错误,点击 或按Ctrl+F5,进行运行,就能得出程序运行的结果。,(三) 数据类型,C语言的数据类型可分为: 基本类型:又分为整型、实型、字符型和枚举型四种。其中枚举型这里暂不介绍。 构造类型:又分为数组类型、结构类型和共用类型三种。 指针类型。 空类型。,【常量】 在程序运行中,其值不能被改变的量称为常量。 常量可分为: 整型常量。例1,23,
5、-8。 实型常量。例 1.23,-9.8,.123,23.,0.0,2.23e-4(表示2.2310-4), 0.23e3(表示0.23103), 0.23E-3(表示0.2310-3),1.23E3(表示1.23103)。 字符常量。例 A,+,8。 符号常量。例 #define PI 3.14。则PI是一个符号常量,其值为3.14, 它不能在程序中被改变。(请见任务三中的例1-15改),【变量】 所谓变量就是在程序运行过程中,其值可以被改变的量。 一个变量由两个要素组成。即变量名和变量值。变量名:每一个变量都必须有一个名字,即变量名。变量名的命名规则: 由字母或下划线开头,后面跟字母、数字
6、和下划线。其有效长度, 随系统而异,但至少前8个字符有效。如果超长,则超长部分被舍弃。,C语言的变量名区分大小写。 即同一字母的大小写,被认为给是两个不同的变量。 例Total、total、toTal是不同的变量名。 给变量名命名时,最好遵循“见名知意”这一基本原则。 例如,name/xm(姓名)、sex/xb(性别)、age/nl(年龄)、salary/gz(工资)。,【变量】 所谓变量就是在程序运行过程中,其值可以被改变的量。 一个变量由两个要素组成。即变量名和变量值。变量名:每一个变量都必须有一个名字,即变量名。变量名的命名规则: 由字母或下划线开头,后面跟字母、数字和下划线。其有效长度
7、, 随系统而异,但至少前8个字符有效。如果超长,则超长部分被舍弃。,【变量定义与初始化】 数据类型 变量名=初值,变量名2=初值2; 例如:int x=1,y=2,z=3;float a=1.1,b=1.2,c=-0.1;char ch1=A,ch2=*;,练习:下面4个选项中,均是不合法的变量名是() 均是合法的变量名是()(A)A 1num s.c(B)123 do d/g(C)INT r-y 文件1(D)_12 drgs gd35,(四) 格式化输出printf()函数,printf()函数的一般格式 printf(“格式字符串”,输出项表); 1. 常用的格式字符串有: (1) 格式指
8、示符:%d 带符号十进制整数。%f带符号十进制小数形式(默认6位小数)。%c输出一个字符。 (2) 转义字符 例1-1中的printf()函数中的”n”就是转义字符,输出时产生一个“换行”。 (3) 普通字符除格式指示符和转义字符之外的其它字符。例1-1中的printf(“x=%d,y=%d,z=%dn”,x,y,z);的“x=”、“y=”、“z=”,格式字符串中的普通字符,原样输出。在汉字系统环境下,允许使用汉字。 2. 输出项表 输出项表是可选的。在输出项中,列出要输出的任意类型的数据。如果要输出的数据不止一个,相邻2个之间用逗号分开。,(1)printf(“我是一个学生n”); /没有输
9、出项 (2)printf(“%d”,1+2); /输出1+2的值 (3)printf(“a=%d b=%dn”,1,1+3); /输出1的值和1+3的值 注意:printf(“%d %fn”,1.212,5) ; 是错误的。,#include “stdio.h” main() printf(“%d %fn”,1.234,6); ,(四) 格式化输出printf()函数,【例1-2】 格式指示符与输出项数据类型不一致引起的错误。,【例1-3】格式化输出。,#include “stdio.h“ main() int x=1,y=2,z=3; /*定义x,y,z三个整型变量,并赋初值*/ float
10、 a=1.1,b=2.3; char c1=A,c2=B; /*定义c1,c2二个字符型变量,并赋初值*/ printf(“输出x,y,z的值n“); /原样“输出x,y,z的值“后换行 printf(“x=%d,y=%d,z=%dn“,x,y,z); /输出“x=1,y=2,z=3“后换行 printf(“输出a,b的值n“); printf(“a=%f,b=%fn“,a,b); printf(“输出c1,c2的值n“); printf(“c1=%c,c2=%cn“,c1,c2); /输出c1=A,c2=B后换行 程序的运行结果为:,(五)格式化输入scanf()函数,1. scanf()函
11、数的功能:从键盘上接收格式化输入。 2. scanf()函数的一般格式 scanf(“格式字符串”,输入项首地址表); (1)格式字符串:可以包含3种类型的字符:格式字符空白字符(空格、Tab键和回车键)非空白字符(又称普通字符),%d 十进制带符号的整型数 %f 十进制带符号的实型数 %c 输入一个字符,a. 格式指示符与printf( )函数的相似:,b.非空白字符在输入数据时,必须原样一起输入。,(2)输入项首地址表由若干个输入项首地址组成,相邻2个输入项地址之间用逗号分开。变量首地址的表示方法如下: &变量名 其中“&”是地址运算符。 例如,在例1-1中scanf(“%d%d%d”,&
12、x,&y,&z)中的“&x”是指变量x在内存中的首地址。其功能是从键盘上输入3个整型数,分别存入&x,&y,&z起始的存储单元中,即输入三个整数分别赋给x,y,z。,(五)格式化输入scanf()函数,scanf(“%d,%d”,scanf(“%d%d”,(五)格式化输入scanf()函数,有两个人A,B,在数学考试中获得87和76的成绩,请输入A,B两人的代号及成绩,输出成绩。,分析:此题就是考查输入输出语句,注意整数输入/输入的格式用%d,字符变量的输入/输出格式用%c,同时注意输入语句中的两个数据之间用什么符号隔开,则在程序运行输入数据时也要用同样的符号隔开两个数据。,#include
13、“stdio.h“ main() char c1,c2; int x,y; printf(“请输入A的成绩及代号:“); scanf(“%d:%c“,程序运行结果为:,补充,例:从键盘任意输入两个整数,求其和。,知识扩展 1.数据类型,1.整型数据的分类 根据占用内存字节数的不同,整型数据又分为3类:基本整型(类型关键字为int)。短整型(类型关键字为short int或short)。长整型(类型关键字为long int或long)。 在visual c+中,long型占字节,int型占4字节,short型占字节。还可以将变量定义为无符号整型。无符号型又分为无符号基本整型(unsigned i
14、nt)、无符号短整型(unsigned short)和无符号长整型(unsigned long)三种,只能用来存储无符号整数。默认为有符号。,2.实型数据的分类浮点型数据分为单精度(float型)、双精度(double型)和长双精度型(long double)三类形式。,如何定义两个双精度实型变量x和y?,?,3.字符型数据 字符型数据分为有符号字符型(关键字为signed char或char)和无符号字符型(unsigned char)两类。 计算机并不是将该字符本身存放到存储单元中(存储单元只能存储二进制信息),而是将字符的代码(ASCII码)存储到相应的存储单元中。 附录A是字符与代码的
15、对照表,这是国际通过的ASCII代码. 在所有的编译系统中都规定以一个字节来存储一个字符。,知识扩展 2.转义字符,有些以“”开头的特殊字符称为转义字符,n 换行 t 横向跳格 r 回车 反斜杠 ddd 1到3位八进制数所代表的字符 xhh 1到2位十六进制数所代表的字符,输出时几种常见的格式符的修饰符:,l:用于长整型整数,可加在格式符d,o,x,u前面 m(代表一个正整数):数据最小宽度 n(代表一个正整数):对实数,表示输出n位小数;对字符串,表示截取的字符个数 -:输出的数字或字符在域内向左靠,知识扩展 3.格式化输出,1.d格式符 (1)%md: m为指定的输出字段的宽度。如果数据的
16、位数小于m,则左端补以空格,若大于m,则按实际位数输出。,例: printf(“%4d,%4d”,a,b);若a=123,b=12345,则输出结果为,(2)ld:输出长整型数据。例: long a=135790; /* 定义a为长整型变量*/printf(“%ld”,a);也有mld。,123,12345,【例1-6】 类型转换字符d的使用,#include main() int a=123; long b=123456; printf(“a=%d,a=%5d,a=%-5d,a=%2dn”,a,a,a,a); printf(“b=%ld;b=%8ld,b=%-8ld,b=%2ldn”,b,b
17、,b,b); printf(“a=%ldn”,a); printf(“b=%dn”,b); ,2. 格式符。以八进制整数形式输出。 输出的数值不带符号,即只能输出正数。,例:int a=9;printf(“%d,%o”,a,a); 输出为:9,11,3.格式符。以十六进制数形式输出整数。同样不会出 现负的十六进制数。,例: int a=17;printf(“%x,%o,%d”,a,a,a); 输出结果为:11,21,17,4.c格式符。用来指定输出字符数据的宽度m。,例:#include void main() char c=a; printf(“%3cn”,c); 输出结果为: a (前有2
18、个空格),5.格式符。用来以小数形式输出实数(包括单双精度) 有以下几种用法: 。不指定字段宽度,由系统自动指定字段宽度,使整数部分全部输出,并输出位小数。应当注意,在输出的数字中并非全部数字都是有效数字。单精度实数的有效位数一般为位。m.nf。指定输出的数据共占列,其中有位小数。如果数值长度小于,则左端补空格。-m.nf与.基本相同,只是使输出的数值向左端 靠,右端补空格。,【例1-7】 输出实数时指定小数位数。 #include void main() float f=123.456; printf(“%f %10f %10.2f %.2f %-10.2fn“,f,f,f,f,f); ,运
19、行结果: 123.455994 123.455994 123.46 123.46 123.46,6.格式符。以指数形式输出实数。 例:(,);输出: 8列 5列所输出的实数共占列宽度。(注:不同系统的规定略有不同),1.输入整型数:格式符有%d。 2.输入float型数据:%f。 3.输入double型数据:%lf。 4.输入字符型数据:%c。 注意:不能有格式符%m.nf,知识扩展:scanf格式控制,如:scanf(“%7.2f”,1.根据以下定义语句和数据的输入方式,scanf语句的正确形式应为 。 已有定义:float a,b; 数据的输入方式:4.523.5 A、scanf(“%f,
20、%f”,练习:,2.若有如下程序 #include void main() int i,j; scanf(“i=%d,j=%d”, 要求给i赋10,给j赋20,则应从键盘输入 。输出是 。,3.已知i、j、k为int型变量,若从键盘输入:1,2,3,使i的值为1,j的值为2,k的值为3,则输入语句应写为 。,一个字符常量将该字符的相应的ASCII代码放到存储单元中。这样使得字符型数据和整型数据之间在一定条件下可以通用。,知识扩展 字符数据与整型数据在一定条件下可以通用,书上22页第4题,#include”stdio.h” void main( ) char c1,c2; c1=a; c2=b;
21、 printf(“%c %cn”,c1,c2);,知识扩展 4.单个字符的输入输出,(1) 字符输出函数一般形式:putchar(c)函数作用:向终端输出一个字符,字符型变量/常量整型变量/常量,【例1-8】 输出单个字符。 #include void main() char ch1,ch2,ch3; ch1=S;ch2=u;ch3=n; putchar(ch1);putchar(ch2); putchar(ch3);putchar(n); putchar(ch1);putchar(n); putchar(ch2);putchar(n); putchar(ch3);putchar(n); ,(
22、2)字符输入函数一般形式:getchar()函数作用:从键盘输入一个字符。 函数值: 从输入设备得到的字符。,【例1-9】 getchar( )应用 #include void main ( ) char ch; printf(“请输入一个字符”); ch=getchar(); /* 从键盘输入一个字符并赋给变量ch */ putchar(ch); putchar(n); /* 将ch的值并换行 */ putchar(getchar( ); /* 从键盘输入一个字符并输出 */ putchar(n); ,字符串常量是一对双引号括起来的一串字符. 合法的字符串常量:“How do you do.
23、”, “CHINA”, “a” , “$123.45” 可以输出一个字符串,如printf(“How do you do.”); 规定:系统在每个字符串的最后自动加入一个字符作为字符串结束的标志。,知识扩展 5.字符串常量,如:如果有一个字符串常量” ,实际上在内存中是:,它占内存单元不是个字符,而是个字符,最后一个字符为。但在输出时不输出。,区分字符常量与字符串常量a与”a”。 是字符常量,“”是字符串常量。 “a”实际包含2个字符:a与0。,结论:不能把一个字符串常量赋给一个字符变量。,任务2 总分及平均分的计算,一、问题情景 一个班进行了一次考试,现要将几个学生的成绩输入电脑,并计算他们
24、的平均分及总分,然后按要求输出。 二、具体实现,#include “stdio.h“ main() int x,y,z; float sum,avg; /定义二个实型变量sum,avg printf(“请输入三个学生的成绩“); scanf(“%d%d%d“, /输出 ,程序的执行情况如下 :,首先,算术运算和算术表达式; 第二,赋值运算和赋值表达式; 另外,还需掌握在本任务中没有体现,但在C程序中却经常要用到的C语言特有的运算和运算符。,三、相关知识,(一) 算术运算与算术表达式 1. 五种基本的算术运算符+(加法)、-(减法)、*(乘法)、/(除法)、%(求余数),这里,需要特别提出的是:
25、 (1)关于除法运算/C语言规定:两个整数相除,其商为整数,小数部分被舍弃。例如:5/2=2。-5/3=-1。,(2)关于求余数运算% 要求两侧的操作数均为整型数据,否则出错。例如:5%3=2,3%5=3,-5%3=-2,-5%(-3)=-2。但是:,5.2%3,(一) 算术运算与算术表达式,2. 表达式和算术表达式 (1)表达式的概念 用运算符和括号将运算对象(常量、变量和函数)连接起来的、符合C语言语法规则的式子,称为表达式。 (2)算术表达式的概念 表达式中的运算符都是算术运算符。例如:3+2*5、(x+y)/2+3、5%2+3都是算术表达式。,3. 运算符的优先级与结合性 (1)算术运
26、算符的优先级是:先*,/,%,再+,-。 (2)有括号的先做括号。左结合性。,练习,1.若a是int型变量,则执行表达式a=25/3%3后a的值为 。 2.以下表达式值为3的是 。 A)16-13%10 B)2+3/2 C)14/3-2 D)(2+6)/(12-9),(一) 算术运算与算术表达式,4. 数据类型转换,高 double floatlongunsigned低 int char,short,在C语言中,整型、实型和字符型数据间可以进行混合运算。在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算。转换规则如右图。转换过程是由计算机自动完成的。,图中横向的箭头表示必须的转换。
27、纵向的箭头表示运算对象为不同类型时的转换。,如:运算10+a,先将a转换为int型数据97,再与int型数据10相加,结果为int型数据107。 运算2+0.5,先将int型的2转换为double型,再与double型的0.5相加,结果为double型数据。,练习:表达式1812*sqrt(4.0)/8值的数据类型为() A)int B)float C)double D)不确定,结论:如果参加+,-,*,/ 运算中有一个数为实数,则结果是double类型!,强制类型转换运算符的作用是:将一个表达式转换成所需类型一般形式:(类型名)(表达式),强制类型转换运算符,例如: (double) 将转换
28、成double类型 (int)(x+y) 将x+y的值转换成整型 (float)(5%3) 将5%3的值转换成float型,若有定义语句:int a=2,b=3;float x=3.5,y=2.5; 则表达式(float)(a+b)/2+(int)x%(int)y的值为 。,练习,(二) 赋值运算和赋值表达式,1. 赋值运算 “=”就是赋值运算符,它的作用是将一个表达式的值赋给一个变量。 赋值运算符的一般形式为:变量=赋值表达式 2. 复合赋值运算 复合赋值运算是C语言特有的一种运算。 复合赋值运算的一般格式为:变量 复合运算符 表达式 复合算术运算符有五种,分别是:+=,-=,*=,/=,%
29、=,例如: x=5 /将5赋给变量x x=6+7 /将6+7的值赋给变量x,x+=3 等价于 x=x+3x+=5+8 等价于 x=x+(5+8)x*=y+2 等价于 x=x*(y+2)x/=x+y 等价于x=x/(x+y)x/=8 等价于x=x/8x%=7 等价于 x=x%7x%=(4-2) 等价于x=x%(4-2),x+y=z,5=x,注:赋值符号左边必须是一个变量。,【例1-12】阅读下列程序,#include “stdio.h“ main( ) int x,y,z; float a,b,c; /定义三个单精度型变时a,b,c x=1; y=2; z=3; a=1.1; b=2.1;c=3
30、.5; x=x+y+z; /将x+y+z的值赋给变量x,即x=6 printf(“x=%dn“,x); y*=y+1; /将y*(y+1)赋给y, y=2*(2+1),即y=6 printf(“y=%dn“,y); z=(int)a%(int)b; /z=1%2,即z=1 printf(“z=%dn“,z); a+=a+b+c; /a=a+(a+b+c), a=1.1+(1.1+2.1+3.5),即a=9.9 printf(“a=%fn“,a); ,(三) C语言特有的运算和运算符,1. 自增(+)、自减(-)运算 作用: 自增运算使单个变量的值增1,自减运算使单个变量的值减1. 用法与运算规
31、则 自增、自减运算符都有两种用法: 1) 前置运算运算符放在变量之前:+变量、-变量 先使变量的值增(减)1,然后再以变化后的值参与其他支算,即先增减,后运算。,#include “stdio.h“ main() int x=2,y,z; printf(“x=%dn“,x); y=+x; /x先增1(=3),然后再赋给y(=3) printf(“x=%d y=%dn“,x,y); +x; /x=x+1,即x=4 printf(“x=%dn“,x); y=+x+2; /x先增1(=5),然后与2的和再赋给y(=7) printf(“x=%d y=%dn“,x,y); z=-x; /x先减1(=4
32、),然后再赋给z(=4) printf(“x=%d z=%dn“,x,z); -x; /x=x-1,即x=3 printf(“x=%dn“,x); /输出x=3后换行,后置运算变量+、变量-,#include “stdio.h“ main() int x=2,y,z; printf(“x=%dn“,x); y=x+; /先将x的值(2)赋给y(=2) ,然后x再自增(3) printf(“x=%d y=%dn“,x,y); x+; /x=x+1,即x=4 printf(“x=%dn“,x); y=(x+)+2; /先将x+2赋给y(=6),然后x再自增(5) printf(“x=%d y=%d
33、n“,x,y); z=x-; /先将x的值(5)赋给z(=5),然后x再自减(4) printf(“x=%d z=%dn“,x,z); x-; /x=x-1,即x=3 printf(“x=%dn“,x);,自增、自减运算符不能用于常量和表达式。 例如:5+、-8、+(a+b)都是错误的。,2. 逗号运算(,)及其表达式,C语言提供一种用逗号运算符“,”连接起来的式子,称为逗号表达式。逗号运算符又称顺序求值运算符。 (1) 一般形式:表达式1,表达式2,表达式n. (2) 求解过程:自左至右,依次计算各表达式的值,“表达式n”的值即为整个逗号表达式的值。 例如:逗号表达式“a=3*5,a*4”的
34、值=60:先求解a=3*5,得,a=15;再求a*4=60,所以逗号表达式的值为60。 又例如:逗号表达式“(a=2+1,a*5),a+8”的值=11,先求解a=2+1,得a=3,再求a*5=15;最后求解a+8=11,所以逗号表达式的值=11,任务3 举一反三,【例1-15】输入圆半径,求圆的面积和周长。的值取3.14.分析:因为根据圆半径,求圆的面积和周长,所以要定义三个变量,半径r,面积s和周长c;考虑到输入的圆半径可能会有小数,所以这三个变量不妨都定义为单精度型float。,#include “stdio.h“ main() float r,s,c; printf(“请输入圆的半径r:
35、“); scanf(“%f“, ,流程图,符号常量,#define PI 3.14意思是定义一个符号常量PI,其值为3.14。符号常量的命名规则与变量名一样,但习惯上,符号常量常用大写字母表示。 #include “stdio.h“ #define PI 3.14 /定义一个符号常量PI,其值为3.14 main() float r,s,c; printf(“请输入圆的半径r:“); scanf(“%f“, ,【例1-16】输入三角形三边的长,求三角形的周长及面积。,分析:输入三角形三边的长,所以显然要定义三个变量a,b,c,同时还要定义三角形的周长c 及面积s,由于在求三角形的面积时要用的海
36、伦公式s=其中是三角形的二分之一周长,所以还需要定义,需要提示的是s=在程序中的表达式为s=sqrt(l*(l-a)*(l-b)*(l-c);即根号用sqrt()函数表示。只要在程序的前面加上库函数math.h就行。,#include “stdio.h“ #include “math.h“ /为求平方根函数sqrt() main() int a,b,c; float cc,l,s; printf(“请输入三角形三边a,b,c的长:“); scanf(“%d%d%d“, ,【例1-18】从键盘输入一个小写字母,要求用大小写字母形式输出该字母及对应的ASCII码值。,分析:由于要从键盘输入一个小写字母,同时还要求将它转换为大写字母,所以需要定义二个字符变量,再根据大小写字母的转换公式:小写字母=大写字母+32,最后输入即可。,#include “stdio.h” main() char c1,c2; /定义二个字符变量c1,c2 printf(“请输入小写字母:”); scanf(“%c”, /输出原字母及对应的大写字母,