C语言程序设计_第1页
C语言程序设计_第2页
C语言程序设计_第3页
C语言程序设计_第4页
C语言程序设计_第5页
已阅读5页,还剩234页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

主要讲述C程序的基本语法和程序设计的基本方法,使学生能够比较熟练地编写程序,逐步培养学生用计算机处理问题的思维方法,并养成良好的编程习惯,为进一步学习后续课程和将来从事应用软件开发奠定坚实的基础。1课程介绍讲授(50学时)+实验(14学时)=64学时(总学时)2学时安排:教学环节时数课程内容讲课上机小计一概述213二程序设计基础知识606三程序设计基本结构9312四函数729五编译预处理命令202六数组6410七指针8210八结构体、共用体和枚举型808九文件224总

计501464

第1章概述

1.1语言的发展及特点1.2简单的语言程序介绍1.3程序上机环境、步骤方法简介1.1.1语言的发展历史时间标志性事件1973年AT&T贝尔实验室的DennisRitchie(D.M.Ritchie)在BCPL和B语言的基础上设计出了一种新的语言,取BCPL中的第二个字母为名,这就是大名鼎鼎的C语言1983年美国国家标准协会(ANSI)为C语言制定了一套ANSI标准,统一了C语言的各种版本1987年ANSI再次公布了新标准——87ANSIC1990年国际标准化组织(ISO)通过了C程序设计语言的国际标准,称之为标准C20世纪80年代初贝尔实验室的BjarneStroustrup开发了C++语言,对C语言的功能进行了改进和扩充,C++语言对于C语言是兼容的注释:AT&TAmericanTelephone&TelegraphCompany美国电话电报公司1.1.2语言的特点语言特点C语言语言简洁,结构紧凑,使用方便、灵活

(32个关键字、9条控制语句)数据类型丰富(整型、实型、字符型、数组、指针、结构体、共同体、枚举型)运算符丰富(34种标准的运算符)功能齐全的函数库(高等数学运算、字符串处理、标准输入输出等)结构化的控制语句(如if…else语句、while语句、do…while语句、switch语句、for语句、break语句、continue语句、goto语句)可移植性好语言生成的代码质量高缺点:语法限制不太严谨;运算符的优先级和结合性比较复杂,不容易记忆;对数据类型缺乏一致性的检测;对数组的使用不进行越界检查,容易导致数据出错;在程序设计方面灵活性有余,而安全性和可靠性不足。C++具备了“面向对象程序设计”(Object-OrientedProgramming,OOP)的能力。使用场合:C语言适用于中小型程序设计的编程,即代码量在1万行以内1.2.1简单的C程序实例【例1.1】屏幕上显示“Howareyou?”

/*第一个C程序在屏幕上显示Howareyou*/#include<stdio.h>//头文件voidmain()//主函数

{printf(“Howareyou?\n");//调用库函数printf()显示字符串}执行结果:屏幕上显示Howareyou?注意:结果没有双引号!思考:若想结果显示有双引号,怎么办?#include<stdio.h>/*函数名add;函数有返回值,为整型(int);函数有两个整型形参x和y*/intadd(intx,inty){intz;//定义一个整型变量zz=x+y;//将x和y的和赋值给变量z return(z);//将z的值返回给将要调用add函数的主调函数}/*主函数*/voidmain() {intx,y,z;//定义变量scanf("%d,%d",&x,&y);//标准输入函数,属于系统库函数z=add(x,y);//调用add函数printf("Theresultis%d",z);//输出结果}执行程序后,输入:1,5↙

运行结果:Theresultis6【例1.2】用户从键盘输入两个整数,计算机在屏幕输出两个数的和。注意输入的格式C语言程序结构及语法特点:程序由一个主函数(main函数)和若干个(可以为0)其他函数组成。主函数是程序执行的起点。其他函数的执行通过“函数调用”来实现。调用库函数,必须包含相应的头文件。严格区分大小写。常用小写。语句的结束标志是分号“;”注意花括号{}的配对使用。可以使用两种形式的程序注释,“//”和“/**/”来增强程序的可读性。1.3程序上机环境及步骤上机环境:在Windows操作系统中,VisualC++6.0(简写为VC++6.0)

步骤:(1)创建“项目”

每个项目都有“项目名”,并需要指定“保存路径(location)”。

例如:项目名为test,项目保存在计算机的D盘中,即location是:D:\test(2)在项目中创建“源程序”(也称“编辑源程序”)

每个源程序也有“程序名”,利用程序名的后缀区分是C语言或C++语言

例如:源程序名为1.c(使用C语言);若为1.cpp(使用C++语言)(3)编译源程序(使程序从“源文件”变成“目标文件”)

查找源程序的语法错误,编译后文件名的后缀变为“.obj”,例如:1.obj(4)链接目标文件(使程序从“目标文件”变成“可执行文件”)

将目标文件与“库函数”文件链接起来,链接后文件名的后缀变为“.exe”,例如:1.exe(5)运行“可执行文件”

执行程序,从运行的结果可以判断程序是否正确,若错误可利用“单步调试”来辅助程序员修改程序。

编辑->编译->链接->执行第2章程序设计基础知识2.1基本字符、基本词汇2.2数据类型2.3运算符与表达式2.4数据的输入和输出2.1基本字符、基本词汇

字母(英文字母大小写共52个)2.1.1基本字符数字(0~9)

空白符(空格、制表符、换行符)

标点和特殊字符

标示符(程序员定义;注意标示符的合法性!)

键字(系统定义;常用的关键字见课本表2-1、2-2)2.1.2基本词汇分隔符(起分隔作用;常用的有逗号和空格)注释符(增加程序的可读性)

运算符(实现对应的运算功能)

常量构成2.1.3

常量和变量

整型常量(例如:123、0、-2)实型常量(例如:1.2、4.56、-2.)常量(值保持不变)字符型常量(例如:‘A’、‘a’、‘c’)

字符串常量(例如:“Whoareyou?”、“English”)

符号常量

(如何使用?它的作用?)例:计算圆的面积和周长。#definePI3.14//PI为符号常量#include<stdio.h>voidmain(){floats,d,r;//float定义实型数据r=5.0;//设定半径为5.0s=PI*r*r;//计算面积printf("%f",s);//输出面积,%f表示输出实型数据的控制格式d=2*PI*r;printf("%f",d);//输出周长}

变量

所谓变量,其值是可以改变的。

对于变量,我们要注意区分以下三个概念:(1)变量名

所谓变量名指的是变量的名字,由程序员命名,遵循标识符的命名规则。

(2)变量的值

即指变量的取值,也就是变量的大小。

(3)变量的地址

即指变量在计算机内存中存放的地址。注意:程序中的变量,必须“先定义,后使用”。定义的格式:

类型说明符变量名;

例如:inta;//定义一个整型变量,int为类型说明符,变量名为a2.2数据类型2.2.1整型

十进制形式(基本数字范围为0~9,例如:54,-12,568)整型常量八进制形式(基本数字范围是0~7,并且以数字0开头,

例如:061,011,-026,0773)

十六进制形式(基本数字范围是0~9,从10~15写为A~F或a~f,

并且以数字0加上字母x开头,如0x12,-0XFF)

整型(int)

整型无符号整型(unsignedint,可简写为unsigned)

短整型(shortint,可简写为short)整型变量短整型无符号短整型(unsignedshort)

长整型(longint,可简写为long)

长整型无符号长整型(unsignedlong)

注意:不同类型的整型变量有着各自的取值范围(如课本表2-3所示)

有何意义?

例:整型数据的溢出。#include<stdio.h>voidmain(){inta=32768;printf("a=%d\n",a);}

运行结果:a=-32768Why?2.2.2字符型

普通字符常量(例如:‘a’,‘A’,‘s’)

字符常量转义字符(如课本表2-4)字符型常量

字符串常量(例如:“a”、“Howdoyoudo!”、“456”)例:(1)请问‘a’和“a”是否相同?

(2)“\”Hello\””的长度是?内存中占多少字节?

字符变量(使用关键字char来定义字符变量)

字符常量的标志是单引号,在内存中占一个字节的存储空间,存放其ASCII码值

(见课本附录A)字符串常量的标志是双引号,在内存中存放一串字符+结束标志字符’\0’,注意区分“字符串长度”和“字符串占内存字节数”例

字符变量的字符形式输出和整数形式输出。#include<stdio.h>voidmain(){charc1,c2;//定义两个字符型变量c1、c2,此时两个变量是随机值c1='a';c2='b';//赋值语句给两个变量赋值printf("c1=%c,c2=%c\n",c1,c2);//%c是输出字符的格式符printf("c1=%d,c2=%d\n",c1,c2);//%d是输出整型的格式符,输出字符的ASCII值}程序运行结果:c1=a,c2=bc1=97,c2=98例:字符大小写转换。#include<stdio.h>voidmain(){charc1,c2;c1='a';c2='B';printf("c1=%c,c2=%c\n",c1-32,c2+32);}

程序运行结果:c1=A,c2=b规律:大、小写字母之间的差值为322.2.3实型

十进制形式(由数字0~9和小数点组成(必须有小数点),例如:3.14、123.)实型常量

指数形式(<尾数>E(e)<整型指数>,代表的数值等于尾数乘以10的指数次幂。

例如:2.0E+5、123e3分别表示2.0×105、123×103。)

单精度实型(float)(float型数据在内存中占4个字节(32位),提供7位有效数字)实型变量

双精度实型(double)(double型数据占8个字节(64位),提供16位有效数字)注意:尾数可以是小数,而指数必须是整数!!!

2.2.4数据类型转换

算数运算(参与运算对象之间:相对精度低->相对高精度)自动转换

赋值运算(赋值运算符“=”右边->“=”左边)强制转换(C/C++语言提供了强制类型转换运算符来实现强制类型转换。)格式为:

(类型)表达式

类型(表达式)下面选择第一种格式举例说明。

floata=1.2;//定义一个单精度实型变量a,并赋初始值1.2;printf(“%d”,(int)a);//强制将a从实型转换成整形输出,输出1

C语言

支持第一种格式,C++语言

支持两种格式,常用第二种格式。2.3运算符与表达式运算对象运算符表达式常用运算符算数运算符赋值运算符逗号运算符关系运算符逻辑运算符条件运算符分号;表达式语句2.3.1算数运算符与算数表达式类

别运算符含

义备

双目运算符+加自左向右结合-减*乘自左向右结合/除%求余数运算对象必须是整数,自左向右结合

单目运算符++自增1运算对象必须是变量,自右向左结合--自减1运算对象必须是变量,自右向左结合+取正自右向左结合-取负请说出下列表达式的值:(1)5/2表达式的值是2。(整数除整数结果为整数,没有“四舍五入”!!)(2)5.0/2表达式的值是2.5。(实数除整数结果为实数,类型自动转换,但实际编程时最好类型一致。)(3)5%2

表达式的值是1。(求余数)(4)5.0%2

表达式不合法!运算符%要求运算对象均为整数(5)inta=1,b=4;a++

表达式的值是1。(先取变量a的值作为表达式的值,变量a本身再加1)++a

表达式的值是2。(先执行变量a加1,再取a的值作为表达式的值)a+++b++a+b(6)’a’++此表达式等价于(a++)+b

计算机阅读程序的顺序是从上至下,从左至右,并且运算符++的优先级高于运算符+可参见课本附录2

因此,表达式的值是5,a的值为2,b的值不变表达式的值为6,a的值为2,b不变表达式不合法!!运算符++要求运算对象是变量,而’a’是字符常量2.3.2赋值运算符与赋值表达式格式:变量=常量或常量表达式求下列表达式的值。(1)a=b=c=3

表达式的值是3,a、b、c的值均为3(2)a=6+(b=2)

表达式值为8,a值为8,b的值为2(3)若变量a=10,则表达式a+=100

表达式等价于a=a+100,运算符+=为复合赋值运算符,复合赋值运算符见课本表2-6若有语句:inta=b=3;此语句定义的同时赋初值,也称“初始化”。但此书写不合法!应写成:inta=3,b=3,c=3;(初始化)或先定义,后赋值,如下:inta,b,c;//先定义:定义三个同类型的变量a=b=c=3;//后引用:为三个变量赋同一值2.3.3逗号运算符与逗号表达式表达式1,表达式2,……表达式n

从左到右的顺序依次求出各表达式的值,并把最后一个表达式的值作为整个逗号表达式的值。例:逗号表达式应用示例。#include<stdio.h>voidmain(){intx=8;printf(“%d,%d\n”,x=2*4,x*10);printf(“%d\n”,x=2*4,x*10);printf(“%d\n”,(x=2*4,x*10));}输出结果:8,80880两个输出格式控制“%d,%d”,因此输出两个表达式的值,并且用逗号分隔只有一个输出格式控制%d,因此输出的结果是第1个表达式x=2*4的值只有一个输出格式控制,但输出列表中是一个逗号表达式,因此先计算表达式x=2*4,即改变了x的值,随后计算表达式x*10,最后以表达式x*10的值作为整个逗号表达式的值输出2.3.4关系运算符与关系表达式表达式的值只有两种:真(非0的值表示,常用1)和假(常用0表示)

级运算符名

称高

同级>

>=<

<=大于大于等于小于小于等于同级==!=等于不等于注意“==”与“=”的区别!!2.3.5逻辑运算符与逻辑表达式表达式的值只有两种:真(非0的值表示,常用1)和假(常用0表示)ab!aa&&b(逻辑与)a||b(逻辑或)真真假真真真假假假真假真真假真假假真假假“不完全求解”

在计算逻辑表达式时,只有在必须执行下一个表达式时才求解该表达式,并不是所有的表达式都被求解,即所谓的“不完全求解”。

例如:对于“&&”,如果左边的操作数被判定为“假”,系统不再判定或求解右边的操作数,因为已经可以得出整个表达式为假;

对于“||”运算,如果左边的操作数被判定为“真”,系统不再判定或求解右边的操作数,因为已经可以得出整个表达式为真。非完全求解举例

如果已有定义:intx=1,y=1,z=1;对如下的逻辑表达式:

(1)(x=0)&&(y=2)&&(z=3)表达式的结果是0,x的值被赋值为0,y和z的值保持不变(2)(x=5)&&(y=0)&&(z=3)

表达式的结果是0,x的值为5,

y的值为0,z的值保持不变(3)(x=5)||(y=2)||(z=3)表达式的结果是1,x的值被赋值为5,y和z的值保持不变(4)(!x)||(y=0)||(z=3)表达式的结果是1,x的值为1没变,y的值为0,z的值为32.3.6条件运算符与条件表达式表达式1?表达式2:表达式3

运算规则:当表达式1为真时,以表达式2的值作为整个表达式的值;

表达式1为假时,以表达式3的值作为整个表达式的值。

例:找出两个整数中的大值。#include<stdio.h>voidmain(){inta,b;scanf(“%d,%d”,&a,&b);//让用户从键盘输入两个整数printf(“max=%d”,a>b?a:b);//利用条件运算符找出a和b的大值}运行结果:输入:2,4↙输出:max=42.4数据的输入与输出利用系统库函数实现,使用之前需要包含相应的头文件输入/输出(系统库函数)字符输入输出函数输入字符(getchar函数)输出字符(putchar函数)格式化输入输出函数格式化输入(scanf函数)格式化输出(printf函数)例:字符输入输出#include<stdio.h>voidmain(){putchar(getchar());//将用户从键盘输入的字符输出显示在屏幕上putchar(getchar());}运行结果:输入:ab↙输出:ab若想采用如下的输入方式,是否可以?输入:a↙b↙

输出:a说明:输入a之后键入的↙(回车),本身也是字符,系统把回车输出,而第二次输入的b是无法进行输入的。思考:若输入ab↙(用空格分隔)是否正确

格式化输入函数(scanf函数)输入类型类型说明符说

明字符型数据c输入一个字符s输入字符串整型数据

实型数据d,i输入十进制整型数o以八进制形式输入整型数(可以带前导0,也可以不带)x以十六进制形式输入整型数(可以带前导0x或0X,也可以不带)u无符号十进制整数f(lf)以带小数点的形式或指数形式输入单精度(双精度)数

e(le)与f(lf)的作用相同格式字符说

明l用于指定输入的数据是长整型或双精度型m用于指定输入数据的域宽*忽略读入的数据(即不将读入的数据赋给对应变量)输入格式举例:例如,假设有三个整形变量a、b、c,有输入语句:(1)scanf("%d%d%d",&a,&b,&c);

键盘输入时可采用以下两种方式(假设给a赋予1,给b赋予2、给c赋予3)123↙(数之间可以用空格或制表符分隔)

或1↙2↙3↙(2)scanf("%d,%d,%d",&a,&b,&c);

键盘输入则为:1,2,3↙(3)scanf("a=%d,b=%d,c=%d",&a,&b,&c);

键盘输入则为a=1,b=2,c=3↙(4)inta1,a2,a3;scanf("%d%*d%d%d",&a1,&a2,&a3);

当输入:1234↙

相对于:将把1赋给a1,跳过2,把3赋给a2,把4赋给a3格式化输出函数(printf函数)格式字符说

明c以字符形式输出,只输出一个字符d以带符号的十进制形式输出整数(正数符号不输出)o以八进制无符号形式输出整数(不输出前导符0)x或X以十六进制无符号形式输出整数(不输出前导符0x或0X)u以无符号的十进制形式输出整数f以小数形式输出单、双精度数,隐含输出6位小数e或E以标准指数形式输出单、双精度数,数字部分小数位数为6位s以字符串形式输出g选用%f或%e格式中输出宽度较短的一种格式符

号说

明l表示长整型数据,可加在格式符d、o、x、u前面m指定输出字段的宽度;对于实数表示总位数包含小数点,不足左补空格,超出按实际.n对于实数,表示输出n位小数;对于字符串,表示截取的字符个数+使输出的数值数据无论正负都带符号输出-使数据在输出域内按左对齐方式输出例:

整型数据的输出。#include<stdio.h>voidmain(){unsignedinta=65535;intb=-1;printf("a=%d,%o,%x,%u\n",a,a,a,a);printf("b=%d,%o,%x,%u\n",b,b,b,b)’}运行结果是:a=-1,177777,ffff,65535b=-1,177777,ffff,65535例:

实型数据的输出。#include<stdio.h>voidmain(){floatx1,y1;doublex2,y2;x1=111111.111;y1=222222.222;//x1和y1的值6位整数,3位小数x2=3333333333333.333;y2=4444444444444.444;//x2和y2的值13位整数,3位小数printf("%f\n",x1+y1);printf("%f\n",x2+y2);}运行结果是:333333.3250007777777777777.777000例:

字符型数据的输出。#include<stdio.h>voidmain(){chara='a';intb=97;printf("%c,%d\n",a,a);printf("%c,%d\n",b,b);printf("%s\n","CHINA");}输出结果是:a,97a,97CHINA第3章程序设计基本结构3.1算法及算法描述方法3.2顺序结构3.3选择结构3.4循环结构3.5应用举例3.1算法及算法描述方法

算法:编写程序的根本,针对不同问题找到适合表示该问题的算法是编程人员的根本要求

算法需要具备以下特点:1.

有穷性2.

确定性3.

可行性4.

有0个或多个输入5.

有一个或多个输出

算法有以下几种常用的描述方法:1.用自然语言描述2.用流程图表示算法3.用代码表示算法

例:求出三个整数中的最大数和最小数。(1)用自然语言描述算法(s1、s2……代表算法步骤)S1:输入三个整数a、b和c,定义两个变量max和min用于存放最大数和最小数;S2:比较a和b,如果a大于等于b,把a赋给max,b赋给min;否则a赋给min,b赋给max;S3:比较max和c,如果max小于c,则把c赋给max;S4:比较min和c,如果min大于c,则把c赋给min;S5:输出max作为最大数,输出min作为最小数。(2)用伪代码描述算法INPUTa,b,cIFa>=bTHENmax=a,min=bELSEmax=b,min=aIFmax<cTHENmax=cIFmin>cTHENmin=cOUTPUTmax,minEND

(3)用流程图描述算法结构化程序设计有三大基本结构:顺序结构、选择结构、循环结构。3.2顺序结构

顺序结构程序是最简单的程序。由计算机硬件直接支持,自上而下顺序执行,无分支、无转移、无循环。

其格式为:

语句1;

语句2;

语句3;

……

语句n;

程序执行时先执行语句1,然后执行语句2,接着执行语句3,……,最后执行语句n。

例:

输入一个三位数,依次输出该数百位,十位,个位数字。#include<stdio.h>voidmain(){intnum,a,b,c;scanf("%d",&num);//允许用户从键盘输入一个三位整数,值赋给变量numa=num/100; //计算得到num的百位存入变量a中b=num/10%10;//计算得到num的十位存入变量b中c=num%10; //计算得到num的个位存入变量c中printf("百位:%d\n十位:%d\n个位:%d\n",a,b,c);}运行时,从键盘输入:456↙屏幕显示:百位:4十位:5个位:6

3.3选择结构

(1)单分支if语句

语句格式:if(表达式){

语句}

执行过程:

例:

输入任意两个整数num1、num2,求两个数中的最大值。#include<stdio.h>voidmain(){intnum1,num2,max;

printf("Pleaseinputtwonumbers:");//提示语,提示用户增加交互性scanf("%d,%d",&num1,&num2);//允许用户键入两个整数max=num1;if(max<num2)//单分支if语句结构max=num2;printf("max=%d\n",max);}if语句

(有三种基本结构形式:单分支、双分支和多分支。)(2)双分支if语句

语句的格式:if(表达式){语句1}else {语句2}

执行过程:

例:

利用双分支结构实现求两个数中的最大值。#include<stdio.h>voidmain(){intnum1,num2,max;

printf("Pleaseinputtwonumbers:");//提示语,提示用户增加交互性scanf("%d,%d",&num1,&num2);//允许用户键入两个整数if(num1>num2)max=num1;elsemax=num2;//双分支if语句结构printf("max=%d\n",max);}有if不一定有else有else一定有if(3)多分支if语句

语句格式:if(表达式1){语句1}elseif(表达式2){语句2}elseif(表达式3){语句3}…elseif(表达式m){语句m}else{语句n}

执行流程:例3.5有一函数:

编一个程序,输入一个实型数x值后,输出y值。#include<stdio.h>#include<math.h>voidmain(){floatx,y;//定义两个实型变量x,yscanf("%f",&x);if(x>0)

y=sqrt(x);//数学函数sqrt()用来求开方elseif(x==0)y=1;elsey=sqrt(-x);//多分支if语句结构printf("x=%f,y=%f\n",x,y);}if语句的嵌套所谓if语句的嵌套,是指在if语句中又包含一个或多个if语句的情况。

一般格式:if()if(){语句1}else{语句2}elseif(){语句3}else{语句4}

其他格式:if(){if(){语句1}}else{语句2}规律:else总是与它最近的未曾配对的if配对。

在实际编程中,为明确匹配关系,避免匹配错误,建议将内嵌的if语句,一律用花括号括起来,如以下形式:if(){if(){语句1}else{语句2}}else{if(){语句3}else{语句4}}书本例3.6便是使用if语句的嵌套形式实现的

请问:else和哪个if配对???switch语句基本格式:switch(表达式){case常量表达式1:语句序列1

case常量表达式2:语句序列2...case常量表达式n:语句序列ndefault:语句}执行流程:

计算表达式的值,找到与某个case后面的常量表达式的值相等时,执行此case分支中的语句序列,然后继续执行下一个case分支对应的语句序列直至最后。若所有的case中的常量表达式的值都不能与表达式中的值相匹配,则执行default分支中的语句序列。说明:(1)关键字switch后面的表达式的值是整型或字符型。(2)关键字case后面的常量表达式的值也只能是整型或字符型,并且各case分支的常量表达式的值应各不相同。case与常量表达式之间一定要有空格分隔。(3)语句序列可以是多条语句,不需要像if语句用花括号括起。(4)当所有case的常量表达式都不能与表达式的值匹配时,执行default分支的语句。default分支不要求必须存在,程序员根据具体问题分析是否需要。若需要,在每个switch结构中default分支只能有一个。(5)各case及default分支的先后次序,不影响程序执行结果。(6)多个case也可以共用语句序列,此时不必重复书写,只需将共用语句序列的case情况连续书写,在其中最后一个case后书写语句序列即可。例:

从键盘上输入一个百分制成绩score,按下列原则输出其等级:score≥90,等级为A;80≤score<90,等级为B;70≤score<80,等级为C;60≤score<70,等级为D;score<60,等级为E。#include<stdio.h>voidmain(){intscore;printf("Inputascore(0~100):");//提示语scanf("%d",&score);//允许用户键入成绩switch(score/10)//构造表达式score/10,把连续的数据离散化{case10:case9:printf("grade=A\n");//case10和case9共用语句case8:printf("grade=B\n");case7:printf("grade=C\n");case6:printf("grade=D\n");case5:case4:case3:case2:case1:case0:printf("grade=E\n");//case5到case0共用语句default:printf("END\n");}}程序运行情况如下:Inputascore(0~100):75↙

grade=Cgrade=Dgrade=EENDWhy?如何解决?#include<stdio.h>voidmain(){intscore;printf("Inputascore(0~100):");scanf("%d",&score);switch(score/10){case10:case9:printf("grade=A\n");break;case8:printf("grade=B\n");break;case7:printf("grade=C\n");break;case6:printf("grade=D\n");break;case5:case4:case3:case2:case1:case0:printf("grade=E\n");break;default:printf("END\n"); }}程序运行情况如下:Inputascore(0~100):75↙grade=Cbreak语句的作用!!!break语句也称为间断语句,在此处,若执行break语句将跳出switch语句。3.4循环结构(while语句、do-while语句、for语句以及goto语句)(1)while语句

语句格式:while(表达式)

循环体;执行流程:

例:

编写程序,求1+2+3+…+100的值。#include<stdio.h>voidmain(){

inti,sum;//i代表加数,sum作为和,此时两个变量是随机值i=1;//i赋初值1sum=0;//sum赋初值0while(i<=100)//循环结束条件i<=100{sum=sum+I; i++;//大括号中的两条语句构成循环体}printf("sum=%d\n",sum);}程序运行后的输出结果为:sum=5050注意:(1)while后紧跟圆括号(2)表达式是循环控制条件,避免“死循环”(3)循环体若是多条语句,一定要用“{}”括起(2)do–while语句语句格式:do 循环体while(表达式);执行流程:例:

用do-while语句求1+2+3+…+100的值。#include<stdio.h>voidmain(){inti,sum;i=1;//赋初值sum=0;//赋初值do{sum=sum+i; i++;}while(i<=100);printf("sum=%d\n",sum);}程序运行后的输出结果为:sum=5050注意:(1)while后面的分号不要丢失(2)执行流程注意与while语句比较while语句等价??

do-while语句(3)for语句语句格式:for(表达式1;表达式2;表达式3)

循环体执行流程:例:

用for语句求1+2+3+…+100的值。#include<stdio.h>voidmain(){inti,sum;for(i=1,sum=0;i<=100;i++)sum=sum+i;printf("sum=%d\n",sum);}

程序运行后的输出结果为:

sum=5050书本中列举了for语句中几种省略表达式的形式。

这些等价形式虽然合法,但实际编程时还是提倡大家使用“经典格式”!(4)goto语句语句格式:goto语句标号;注意:关键字goto和语句标号之间用空格分隔,最后用分号结束。语句标号是任意合法的标识符(遵循标识符命名规则),当在标识符后面加一个冒号,如:“loop:”、“step1:”,该标识符就成了一个语句标号。执行过程:

程序执行到goto语句时,程序无条件地转移到语句标号所标识的语句处,并从该语句继续执行。例:

用goto语句求1+2+3+…+100的值。#include<stdio.h>voidmain(){inti=1,sum=0;

loop:sum+=i;//语句标号loop:i++;if(i<=100)gotoloop;//若满足条件i<=100,执行goto语句printf("%d\n",sum);}

程序的运行情况是:5050初学者

慎用!!(5)break语句和continue语句(用于循环体!)break语句语句格式:break;功能:

前面提到用break语句可以跳出switch语句体,程序继续执行switch语句体后面的程序。

在循环结构中,也可以用break语句跳出本层循环体,从而提前结束本层循环。例:#include<stdio.h>voidmain(){inti=0;//赋初值0while(i<20){i++;if(i%5==0)break;printf("%d,",i);}}结果:1,2,3,4,continue语句语句格式:continue;功能:conitune语句也是“跳出”,但它只是结束本次循环体的执行,转而继续判断循环控制条件是否为真,从而决定是否继续执行循环体,而不像break语句直接结束整个循环。例:#include<stdio.h>voidmain(){inti=0;//赋初值0while(i<20){i++;if(i%5==0)continue;printf("%d,",i);}}结果:表达式i%5==0为真时执行break语句表达式i%5==0为真时执行continue语句1,2,3,4,6,7,8,9,11,12,13,14,16,17,18,19,(6)循环的嵌套所谓循环嵌套,是指在一个循环体内还可以包含另一个完整的循环语句。

while(){…while(){…}…}do{…do{…}while();…}while();for(;;){…for(;;){…}}for(;;){…while(){…}…}3.5应用举例例:输入任意的三个数,判断三个数是否可以构成三角形,若能,可以构成等腰三角形、等边三角形还是其他三角形。分析:三角形要求任意两边之和大于第三边,可以将此条件转换成语句,在满足此条件下,进一步细分出三边相等为等边三角形,任意两边相等为等腰三角形,其余为其他三角形。#include<stdio.h>voidmain(){floata,b,c;//定义实型变量a、b、c代表三边printf("Enterthreesidesoftriangle:");//提示语scanf("%f,%f,%f",&a,&b,&c);//允许用户输入三边长if((a+b)>0&&(a+c)>b&&(b+c)>a)//任意两边之和大于第三边,注意逻辑与&&的使用{if((a==b)&&(b==c))//注意是两个=printf(“是等边三角形”);elseif((a==b)||(b==c)||(a==c))//注意逻辑或||的使用printf(“是等腰三角形”);elseprintf(“其他三角形”);}else//与最外层的if配对printf(“不能构成三角形”);}程序的运行情况是:

Enterthreesidesoftriangle:1.5,1.5,1.5↙是等边三角形例:从键盘上输入一个整数,然后把这个整数的各位逆序输出。例如,输入123456,输出654321。分析:

所谓逆序输出,就是先输出整数的个位,再输出十位,依此类推。

此题并没有限定数的位数,如何得到数的每一位?

先通过除10取余的方法获得任意整数的个位数字,例如:当n=123456时,123456%10=6(注意取余数操作后n的值没有变化)。

然后再用n=n/10将n缩小10倍,例如123456/10=12345,可以看到原来的六位数变成了五位数。依此类推。规律:“先n%10再n/10”的操作是反复执行的,直到数n的最高位被得到为止。#include<stdio.h>voidmain(){intn,d;printf("Enteraninteger:");scanf("%d",&n);do{d=n%10;printf("%d",d);//输出该位n/=10;}while(n!=0);//循环控制条件printf("\n");}

程序的运行情况是:

Enteraninteger:123456↙654321

本章主要讲述了程序设计的三种基本结构,在实际编程中无处不在,非常重要,经常会不同的结构形式结合使用。在实际编程时,应该遵循“先分析题目”-》“再设计算法”-》“最后编程实现”的思路。积累一些经典的程序算法是非常有帮助的,建议同学们课余时间多看书学习,多上机实践!第4章函数4.1函数的概念4.2函数的定义4.3函数调用4.4函数声明4.5变量的作用域4.6变量的存储类型4.1程序:1个主函数(main函数、程序执行的起点)+若干个子函数(可以是0个)

库函数(C/C++系统提供的,无需程序员进行定义或从“使用角度”划分说明,使用时需要包含对应头文件)

自定义函数(程序员开发程序时,根据实际需要自行定义)

无“返回值”函数从“函数类型”有“返回值”函数如何定义函数?4.2函数的定义(函数头+函数体)

无返回值的函数举例

voidf()//函数头{printf(“helloworld!”);}//函数体

说明:(1)函数头由三部分组成:

函数返回值类型(例中为void,无返回值)

函数名(例中为f,遵循标识符命名规则)

形参(紧跟函数名后的圆括号中的参数,例中无形参)(2)函数体由一对花括号括起的语句组成,函数体与函数头之间不允许插入语句!

有返回值的函数举例intf(inta,intb){floatc;c=a+b;returnc;//利用return语句返回变量c}说明:(1)函数返回值类型为int,若为int类型也可省略不写。(2)有两个形参,用逗号隔开,即使两个变量同属一个类型,也不可写成“inta,b”(3)函数有返回值,函数体中必然会有而且只有一条return语句,返回变量的值的类型以函数返回值类型为准,不一致时系统自动转换。疑问1:程序中包含1个main函数和多个子函数时,主函数是执行的起点,其他函数按照什么顺序执行???疑问2:有返回值的函数执行后,利用return语句返回变量,返回给谁呢??4.3函数调用(函数调用决定了函数的执行顺序)执行顺序:

顺序执行主调函数中的语句,至“调用语句”,此处也称为“调用点”,系统保留当前状态,“保护现场”——》执行调用语句,定位所调用的函数,即“被调函数”——》顺序执行“被调函数”——》返回到主调函数中的“调用点”,继续顺序执行其剩余的语句。调用语句的正确书写取决于:(1)被调函数是否有形参,若有,主调函数需要有“实参”传递给形参。(2)被调函数是否有返回值,有或没有,两种情况下调用语句的形式不同。

例:

被调函数无返回值时,主调函数中的调用格式例:被调函数有返回值时,主调函数中的调用格式#include<stdio.h>/*函数名f,形参两个a和b,无返回值,功能:找到两个整数中的大值并输出*/voidf(inta,intb){intmax;max=(a>b)?a:b;printf(“max=%d”,max);}

voidmain(){inta,b;printf(“pleaseinputtwonumbers:”);scanf(“%d,%d”,&a,&b);f(a,b);//函数调用语句}#include<stdio.h>/*函数名f,形参两个a和b,有返回值,功能:找到两个整数中的大值并输出*/intf(inta,intb)//函数f()有返回值{intmax;max=(a>b)?a:b;returnmax;//返回最大值max}voidmain(){inta,b,max;printf(“pleaseinputtwonumbers:”);scanf(“%d,%d”,&a,&b);max=f(a,b);//函数调用语句printf(“max=%d”,max);//输出结果}

printf(“max=%d”,f(a,b));//合并成一条语句注意比较两程序中输出结果的输出语句的位置!!!实参传递给形参

在函数调用时,形参的类型决定了实参传递过去的内容和传递方式,如题所示,形参是普通变量时,实参的类型也是普通变量,并且将实参的值单向地传递给形参,形参做任何变化,比如交换值的大小,改变值的大小等等,都不会影响到实参。例:交换两个数的值#include<stdio.h>/*函数名swap,形参两个a和b,无返回值,功能:交换两个数的值*/voidswap(intx,inty){intt;t=x;x=y;y=t;//利用中间变量t交换变量x和y的值printf(“x=%d,y=%d\n”,x,y);}voidmain(){inta,b;printf(“pleaseinputtwonumbers:”);scanf(“%d,%d”,&a,&b);swap(a,b);//函数调用语句,实参a和b将值分别传给形参x和yprintf(“a=%d,b=%d\n”,a,b);//输出结果}

程序的运行情况是:pleaseinputtwonumbers:4,5↙x=5,y=4a=4,b=5嵌套调用例:函数嵌套调用的运用。

#include<stdio.h>fun2(inta,intb){intc;c=a*b%5;returnc;}fun1(inta,intb{intc;a*=a;b*=b;c=fun2(a,b);//调用fun2函数return(c*c);}voidmain(){intx=1,y=2;printf("%d\n",fun1(x,y));//调用函数fun1}递归调用(所谓递归调用,就是在调用函数的过程中又出现调用该函数本身,称为

函数的递归调用。)例:利用递归调用来求解n!。#include<stdio.h>longfun(intn){longf;if(n<0)printf(“inputerror!”);elseif(n==0||n==1)f=1;elsef=n*fun(n-1);//递归调用returnf;}voidmain(){intn;longf;printf(“inputaintegernumber:”);scanf(“%d”,&n);f=fun(n);//函数调用printf(“%d!=%ld”,n,f);}程序的运行结果:inputaintegernumber:5↙5!=120递归调用这种方法简洁明了,但在选取限制调用执行次数的条件上,对于初学者是有一定难度的!疑问?各个函数书写的前后顺序是否有要求呢?4.4函数声明

函数如同变量一样,必须“先定义后使用”。机器阅读程序的顺序是从上至下,因此,若“被调函数”在“主调函数”之后定义,则需要在主调函数的定义中对被调函数进行“函数说明”。例:

主调函数中声明被调函数示例。

#include<stdio.h>voidmain(){floatadd(floatx,floaty);//在主调函数中声明被调用函数,格式:函数头+“;”floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);//函数调用printf("addis%f",c);}/*自定义函数,函数名add,形参为2个实型变量,函数返回值类型为float*/floatadd(floatx,floaty)//函数头{floatz;z=x+y;return(z);}在以下三种情况下,主调函数中不需再对被调函数进行声明:(1)当被调函数的返回值类型是整型(int)时,不需要进行函数声明。#include<stdio.h>voidmain()//被调函数返回值为int,不需要在主调函数中对被调函数声明{inta,b,c;scanf("%d,%d",&a,&b);c=add(a,b);//函数调用printf("addis%d",c);}

intadd(intx,inty){intz;z=x+y;return(z);}(2)当被调函数的定义出现在主调函数之前,也无需进行函数声明。#include<stdio.h>floatadd(floatx,floaty)//被调函数,定义在主调函数之前{floatz;z=x+y;return(z);}voidmain

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论