第5章C语言
C语言 第五章-循环结构程序设计

执行过程如图所示。其中i为外循环的控制变 量,j为内循环的控制变量。
i =0 当 i <=10
j=0 当 j<=10
printf(“%d ”, i*j ) j++ i++
例4 编程打印“九九乘法表”。
分析:九九乘法表 1×1=1 1×2=2 1×3=3 … 2×1=2 2×2=4 2×3=6 … 3×1=3 3×2=6 3×3=9 … …… 9×1=9 9×2=18 9×3=27 …
i ++ ; } while ( i <= 100 ) ; printf ( " %d " , sum ) ; }
结果相同
同样是下列程序,但如果while后面的表达式结果一开始就是 假时,两种循环结果会不一样。
main ( ) /*程序1*/
{ int i , sum = 0 ; i = 101 ;
所以程序需要设计成二重循环。由于题目只 要求找到一组解,所以在循环过程中只要找到一组 满足条件的x, y, z就可以跳出循环。
跳出循环的方法可以采用break语句,但是, 因为是二重循环,所以要考虑使用break是否方便。
程序 百钱买百鸡问题。 void main ( ) { int x , y , z ;
打印第2行 ( i = 2 ) for (j=1;j<=9;j++) printf(“%5d”,i*j) ; printf ( “ \n ” ) ; /*换行打印*/
…… 打印第9行 ( i = 9 )
for (j=1;j<=9;j++) printf(“%5d”,i*j) ; printf ( “ \n ” ) ; /*换行打印*/
c语言(第五章选择结构) c语言 教学课件

• !((year%4==0 && year%100!=0)||year%400==0)或者:
• (year%4!=0 )||( year%100==0 && year%400!=0)
C语言程序设计
第五章 选择结构程序设计
5.3 if语句(条件选择语句)
• if语句的三种形式 ▪ 形式一: • 格式:
语句2
=0
表达式3 非0
语句3
=0 语句4
C语言程序设计
第五章 选择结构程序设计
• 例:
if (salary>1000) else if (salary>800) else if (salary>600) else if (salary>400) else index=0;
index=0.4; index=0.3; index=0.2; index=0.1;
if (x>0) printf(“%f”,x) ;
else printf(“%f”,-x);
(3)在if 和else 后面可以只含一个内嵌的语句,也可以有 多个操作语句,此时用花括号将几个语句括起来成为一 个复合语句。如:
if (x>y)
{ t=x ; x=y ; y=t ; }
C语言程序设计
第五章 选择结构程序设计
a=4;b=5;
!a
//值为0
a&&b //值为1
a||b
//值为1
!a||b
//值为1
4&&0||2 //值为1
5>3&&2||8<4-!0 //(5>3)&&2||(8<(4-(!0))) 值为1
C语言程序设计:第5章 循环结构

12
do...while语句(cont...)
课堂练习: 1.输出1---n之间的数,其中n从键盘输入。
int main(void) {
//1.定义变量i和n //2.输入n的值 //3.思考循环的开始条件:i从1开始 //4.思考循环的结束条件:i++,i > n //5.循环的条件:i<=n //6.循环要做的事情:输出i的值 return 0; }
} 相当于 while(1) {
}
26
小结
❖for(i=m;i<n;i++)//循环次数:n-m次 ❖for(i=m;i<=n;i++)//循环次数:n-m+1次
27
循环语句的练习
课堂练习: 1.输出n---1之间的数,其中n>1且n从键盘输入。 2.计算1*2*3*...*n的值(n的阶乘n!), 其中n从键盘输入。 3.计算10- 1/2 - 1/3 -....1/n的值 以上练习分别以while、do...while、for语句实现
int main(void) {
//1.定义变量i,n,sum //2.输入n的值 //3.思考循环的开始条件:i从1开始 //4.思考循环的结束条件:i++,i > n //5.循环的条件:i<=n //6.循环要做的事情:累加i的值 //7.输出计算结果 return 0; }
24
for语句(cont...)
{
sum = sum + i;
if(sum > 100)break;
C语言教案 第5章

int class;
char sex;
int age;
int score[MAX2];
}STUDENT;
声明新类型名STUDENT,它代表上面指定的一个结构体类型。这时可以使用STUDENT来定义变量。例如:
STUDENT stu;
归纳起来,声明一个新的类型名的方法是:
①先按定义变量的方法写出定义体(例如:inti;);
②将变量名换成新类型名(例如:将i换成COUNT);
③在定义结构体的最前面加typedef(例如:typedef int COUNT);
④最后用新类型名定义变量。
习惯上,常把用typedef声明的类型名用大写字母表示,以便与系统提供的标准类型标识符相区别。
说明:
①用typedef可以声明各种类型名,但不能用来定义变量。typedef可以声明数组类型、字符串类型。例如要定义一维数组:
2、熟练运用结构体类型实现对学生信息的查询。
3、用结构体数组存储一个班级的学生信息。
教法
案例教学法
学法
思考,讨论,练习和巩固
教具使用
投影仪演示或教学机房
学内容
教师活动
学生活动
备注
导入
新课
上次课介绍了如何定义结构体类型,再运用新定义的结构体类型定义结构体变量,以及结构体变量的初始化。当类似的数据较多时,就要考虑用数组来解决,这就是结构体数组。
可以使用上面定义的student结构体类型来定义变量。例如:
struct student
{
char num[6];
char name[11];
int class;
char sex;
int age;
C语言程序设计-第5章--函数

实参可以是常量、变量或表达式,但要求 它们必须要有确定的值,在调用时将实参 的值赋给形参。另外,实参和形参的类型 应相同或兼容。
— 31 —
5.2 函数的参数传递和返回值
➢ 5.2.2 函数的返回值
一般情况下,主调函数调用完被调函数后,都希望能够得到一 个确定的值,这就是函数的返回值。在C语言中,函数返回值 是通过return语句来实现的。return语句的一般形式有3种:
/*函数声明*/
/*调用逆序函数,将a的逆序值赋给b*/ /*调用逆序函数,将b的逆序值赋给c */
— 23 —
5.2 函数的参数传递和返回值
➢ 5.2.1 函数的形参与实参
{
int y=0,sign=1;
/*定义sign表示x的符号,定义变量y代表逆序数据*/
if(x<0)
/*当x小于0时取符号及取反*/
— 18 —
5.1 函数的定义和调用
➢ 5.1.2 函数的调用
另外,按函数在语句中的作用来分,可以有以下3种函数调用方式:
函数表达式
函数语句
函数作为实参
函数作为表达式中的一项出 现,以函数返回值参与表达 式的运算。
函数调用的一般形式加上分 号即构成函数语句。
函数作为另一个函数调用的 实际参数出现,即把该函数 的返回值作为实参进行传送。
#include<stdio.h> int main() {
int x=0,y; y=trans(x); printf("y=%d\n",y); printf("x=%d\n",x); return 0; } trans(int a) { a++; printf("a=%d\n", a); return a; }
C语言第五章

学习提示: (1)算法包括输入、处理和输出三个部分 ,其中处理部分为选择结构。
b=t
F
输出a,b 结束
5
信息科学与技术学院 软件工程系
选择结构算法设计
South West Jiaotong University
【例5. 1】输入a、b值,如果a>b,那么交换a和b,使得a≤b。 解决该问题的主要步骤为: 开始
17
信息科学与技术学院 软件工程系
关系运算符和关系表达式
【例】编写以下程序,查看结果。 #include <stdio.h> void main() { int a,b,c; int d,e,f; a=4,b=5,c=6; d=a>b; e=a<b<c; f=c>b>a; printf("%d %d %d \n",d,e,f); }
South West Jiaotong University
20
信息科学与技术学院 软件工程系
逻辑运算符- 优先级
• 各类运算符的优先级关系:
South West Jiaotong University
– !(非)高于 &&(与) 高于 ||(或)。 – &&(与)和||(或)低于关系运算符 – !(非)高于 算术运算符
1)任何数值(字符、整数、实数、指针)都可以表示 逻辑意义,只要数值不等于0,就表示“真”,而0 表示“假”;
2)关系与逻辑运算表达式的运算结果为“真”,表达 式的值为int型整数1,运算结果为“假”,则表达 式的值为int型整数0。
由2)可知,C语言的关系运算表达式和逻辑运算表 达式应该属于整型表达式范畴。
C语言课件 第5章
第5章 选择结构程序设计
/*程序 5 - 3, 求两个数的最大值、 最小值*/ main( ) { float x, y; float max, min; printf(″请输入两个数x, y: ″); scanf(″%f, %f″, &x, &y); if (x>y) {max=x; min=y; } else {max=y; min=x; } printf(″max=%6.2f, min=%6.2f\n″, max, min); } 输入数据: 1.2, 2.54 运行结果: max= 2.54, min= 1.20
第5章 选择结构程序设计
5.1.3 多分支if语句
多分支if语句不是一条具体的语句,它通过if语句的嵌套实
现。其一般形式为: if (条件表达式1)
if (条件表达式2) 语句1
else 语句2 else if (条件表达式3) 语句3 else 语句4
第5章 选择结构程序设计
T T
条件表达式1 条件表达式2
}
第5章 选择结构程序设计
例 5 — 7 将例 5 — 5 用switch语句实现。
switch ((int)(cj/10)) { 10: 9: ch=′A′; break; /*注意选择表达式的构造*/
8: ch=′B′; break;
7: ch=′C′; break; 6: ch=′D′; break;
第5章 选择结构程序设计
例 5 –3 输入两个数, 求两个数的最大值、最小值。 数据分析:
输入量: 两个数x、 y, float
C语言第5章循环结构程序设计1
(2)在循环体中应有使循环趋向于结束的语句。 比如上例中,循环结束的条件是“score>=0”, 那么当我们把这个班的成绩全部输入完后, 一定要输入一个负数,才能使程序往下执行。 (3)循环体语句有可能一次也不执行。比如说上 例中,当第一次输入的分数就为负数时,则 循环体一次也不执行。
§5.3 do …while语句
① ② ④ ③
for(i=1; i<100; i++) s=s+i; printf(″s=%d″, s); }
/*循环体语句*/
对于for循环,有一点非常重要,即条件测 试永远是在循环开始时进行,如果在循环开 始时条件为假,那么循环体语句就不会被执 行。如: int i=10; for (k=10;k!=i;k++) printf(″%d″,k); printf(″%d″,k);
2、循环控制变量必须在循环体内有所改变,才 能使while和do-while语句的循环控制条件表达 式的值不断改变,直至循环结束。否则会造 成死循环。例如: i=1; while(i<=100) putchar(′*′); i++; 这个循环永远不会结束,因为“i++;”语句 不属于循环体中的语句,循环控制变量i没有 在循环体内被改变。 程序应该作如下改变:
在使用while语句的时候,我们要注意以下 两个问题: (1)循环体如果包含一个以上的语句,应该用花 括号括起来,以复合语句的形式出现。如果 不加花括号,则while语句的范围只到while后 面的第一个分号处。比如上例中,while语句 中如无花括号,则while语句范围只到 “average+=score;”。
#include <stdio.h> main() {int i,n;long fac; Scanf(―%d‖,&n); i=1 while (i<=n) fac=fac*i; i++; } Printf(―%d!=%ld‖,n,fac); }
C语言 第5章 数组
北京科技大学
2014-10-10
5.2.4 一维数组应用举例
【例5-2】设计一个程序,将n个人某门课程的成绩输入计 算机后输出最高分和最低分。 思路:①首先将n个人的成绩输入到一个一维数组中。 ②求若干个数的最大值或最小值常采用打擂台的方法: 首先指定某数为最大值或最小值的擂主: 如:max=a[0], min=a[0] 将其他各数依次与擂主进行比较(循环嵌套分支),
2014-10-10
5.1概述(续)
2.数组与数组元素的概念
数组:一组相同类型的数据的集合,数组的名字就称为数 组名。 如定义:float a[10]; a是数组名。 下标变量(或数组元素):数组中的每个数据用下标进行 区分,这些变量称为下标变量或数组元素。 如:a[0]、a[1]…a[i]。 每个数组元素相当于一个简单变量,数组的类型也就是该 数组的数组元素的数据类型。 数组属于构造类型。构造类型的数据是由基本类型数据按 一定规则构成的。
91.5 34.5 67.5 72.0
84.0
score[0]
score[1]
score[2] score[3] score[4]
组如 范果 围引 会用 破的 坏数 其组 他元 变素 量超 的出 值数 。
5.2.3 一维数组的初始化
初始化:在定义数组时给数组元素赋初值。
1.在定义数组时,对全部数组元素赋初值 例如:int a[5]={0,1,2,3,4}; 此时可以省略数组长度,例如:int a[ ]={0,1,2,3,4}; 2.在定义数组时,对部分数组元素赋初值 例如:int a[5]={1,2,3};系统为其余元素赋 0 。 3.当初值的个数多于数组元素的个数时,编译出错 例如: int a[5]={0,1,2,3,4,5};
《C语言程序设计》第5章数组、字符串、指针
相当于声明了5个整型变量
说明: ① 数组的所有元素的数据类型都是相同的。 ② 数组取名规则应符合标识符的规定,数组 名不能与同一函数中其它变量名相同: int a; float a[10]; 是错误的。
③ C语言中规定数组的下标从0开始,方括号 中常量表达式表示数组元素的个数。
④ 不能在方括号中用变量来表示元素的个数, 但是可以是符号常数或常量表达式。例如: int n=5,a[n]; 是错误的。
二维数组在内存的存放顺序是“先行后列”
a[0][0] a[0][1] a[0][2] a[0][3] a[1][0]
…
a[2][3]
5.3.2 二维数组元素的引用
二维数组的元素的引用形式为: 数组名[下标][下标] 使用二维数组的情况举例: 学生多门功课的成绩,如: a[100][3]可以用来记录100个学生3门功 课的成绩。 矩阵,如: a[3][3]可以用来记录3×3的矩阵。一个 数组元素正好存放一个矩阵的元素。
5.2.2 一维数组的初始化
1、数组声明时初始化 在编译阶段进行的。这样将减少运行时间, 提高效率。 数组初始化的一般形式为: 类型符 数组名[常量表达式]={值,值…值}; 例如: int a[10]={ 0,1,2,3,4,5,6,7,8,9 }; 相当于a[0]=0; a[1]=1;... a[9]=9;
…
a[9]
#include <stdio.h> 声明有10个元素 void main() 的一维数组a {int n,i; float s=0, ave, a[10]; a[0] a[1] … a[9] for(i=0;i<10;i++) a[i] { scanf("%f",&a[i]); a[i] s=s+a[i]; } ave=s/10; for(i=0;i<10;i++) a[i] a[i] if (a[i]>ave) printf("%f ",a[i]); }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第5章数组C语言数据类型十分丰富,前几章已经遇到了整型、实型和字符型这些基本类型的数据。
从本章开始讨论由多个数据成员构成的结构类型的数据。
本章重点介绍数组类型的定义、初始化和引用。
在程序设计中,经常会使用同一类的数据来处理问题。
例如要存储一些学生的成绩,可以定义int grade0,grade1,grade2;。
然而,当成绩量很大时,需先用大量的标识符进行表示,而且每个变量名都要惟一,这样做是很麻烦的。
C语言提供了能自动组织同一类数据的处理功能,即数组。
所谓数组,是由同类型数据构成的有序集合。
一个数组包含多个数据对象,这些对象称为数组元素。
各元素的类型相同,它们在内存中占据的地址空间也是连续的,而且它们用统一的数组名称和下标来唯一确定。
所谓下标,是指元素在数组中的位置,如数组a有5个元素,分别为a[0],a[1],a[2],a[3]及a[4]。
方括号中的0,1,2,3,4为下标,表明各元素在数组中的位置。
同基本变量一样,数组也是先定义,再引用。
5.1一维数组5.1.1一维数组的定义一维数组定义的格式为:类型说明数组名[常量表达式]如float sheep[10];和int s2007[100];,其中sheep为数组名,10表示此数组有10个元素,即sheep[0]…sheep[9],但是不存在sheep[10]这个数组元素;float表示这10个元素都是实型数。
数组类型可以是任意数据类型,如char,int,float及long等。
对一维数组的定义说明♣数组名的命名规则同与变量名相同,必须是合法的标识符。
即第一个字符应为英文字母或下划线。
♣用方括号将常量表达式括起来。
常量表达式定义了数组元素的个数。
即数组的长度。
它只能是整型常量或符号常量。
数组在定义之后,长度是不能改变的。
♣在数组定义时,常量表达式中不允许包含变量,如下列左式。
但在操作语句(即数组元素的引用)中,数组常量表达式中允许包含变量,如下列右式。
后面多维数组相同。
int n; int a[3];…n=5; int s,n=2;int a[n];//定义时变量下标非法s=a[n];//引用时变量下标合法♣数组下标从0开始。
再如,int a[5];定义了数组a,有5个数组元素分别为a[0],a[1],a[2],a[3],a[4]。
可以视为5个带下标的变量,这5个变量的类型都是整型的。
其中5是数组长度,0~4是数组中各元素的下标。
见图5.1-1所示。
注意♣各元素在内存中占据的地址空间是连续的。
♣元素a[0]的地址是整个数组的首地址,紧接着是a[1]的地址,然后是a[2]的地址……依次排列。
也可用数组名a表示数组的首地址,即a等价于&a[0]; 。
在VC++6.0编译器中,一个int型的数据用4个字节存储。
若a[0]存储在地址0012ff6c,那么其余的数组元素连续地存储在地址0012ff70、0012ff74、0012ff78、0012ff7c。
如图5.1-2(a)(b)所示。
a[0] a[1] a[2] a[3] a[4]图5.1-2(a) 数组a的内存形式5.1.2 一维数组的引用C语言不允许一次引用整个数组,只能逐个引用数组元素。
定义了一个数组后,就可以用下面的格式引用数组中的每个元素。
其一般格式为数组名[下标]数组的下标可以是整型常量或整型表达式,固定从0开始,最大的下标是数组元素的长度减1。
例5.1-1 从键盘输入6个数,将它们按反序输出。
#include<stdio.h>void main(){int i,n;int num[6];for(i=0;i<6;i++)scanf(“%d”,&num[i]);for(n=5;n>=0;n--) /*反序输出*/printf(“%3d”,num[n]);printf(“\n”);}运行结果:4 5 6 7 8 9↙9 8 7 6 5 4注意♣ C语言系统对下标不作语法检查。
也就是说,在引用时若下标越界,系统不报编译错误,只报警告,可以继续执行语句,引用的结果为未知值。
如int a[3]={1,2,3};int s;s=a[3];所以,对下标的控制须完全由程序设计者自己把握。
5.1.3 一维数组的初始化数组元素的初始化就是对所有元素赋初值。
可以通过赋值语句来完成。
如例5.1-1中的int num[6];for(i=0;i<6;i++)scanf(“%d”,&num[i]);就是通过执行for循环以及键盘的输入,对num数组赋值,这种方法是人机交互赋值。
也可以采用在程序中数组定义的同时赋值。
一般有2种方法。
1.在数组定义的同时赋初值C语言规定,在定义数组时,可以直接对数组进行初始化。
如int a[6]={2,3,4,5,6,7};,写成一般形式为类型说明数组名[常量表达式]={数值表};其中花括号中的值是初始值,也称为初始值表,各值之间用逗号隔开。
在数组a中,由于数值表中6个数值已全部给出,可以省略方括号中的元素个数。
即int a[]={2,3,4,5,6,7};注意♣由于数值表中包含的6个数据元素全部列出,a数组长度被隐含确定为6。
若在数值表中没有列出所有元素的初值,则数组的长度不能省略。
♣若对数组中的部分元素赋值,则对不赋值的元素,在花括号中缺省并视为0;但是逗号不能省略。
如int b[6]={2,,4,,,7};,各数组元素的初值为b[0]=2,b[1]=0,b[2]=4,b[3]=0,b[4]=0,b[5]=7。
♣若数组中的初值元素个数少于数组长度,则相当于只对数组前几个元素赋值,其余元素的初值,系统将自动置为0。
如int b[6]={2,3,4};,各数组元素的初值为b[0]=2,b[1]=3,b[2]=4,b[3]=0,b[4]=0,b[5]=0。
但是,如int b[6]={0};定义并赋值,则b[0]~ b[5]初值均为0;而int b[6]={5};,则只有b[0]为5,其余b[1]~ b[5]均为0。
例5.1-2 数组的初始化#include<stdio.h>void main(){int i;int a[5]={5,6,7,8,9};for(i=0;i<5;i++)printf(“a[%d]=%d\n”,i,a[i]);}运行结果:a[0]=5a[1]=6a[2]=7a[3]=8a[4]=92.在定义数组以后赋值对数组先定义,然后在程序中用赋值语句分别赋值,或采用人机交互对数组的每个元素分别赋值。
如int a[5];a[0]=2;a[1]=10;a[2]=5;a[3]=7;a[4]=12;;也可通过for语句对数组赋值,如#include<stdio.h>void mian(){int a[5],i;for(i=0;i<5;i++){printf(“Input a integer:”);scanf(“%d”,&a[i]);}}运行结果:Input a integer:5↙Input a integer:6↙Input a integer:7↙Input a integer:8↙Input a integer:9↙以上2种赋值方法运行效果是相同的,都会使数组a[5]中a[0]~a[4]的各值为5、6、7、8、9。
5.1.4一维数组程序举例在实际数据处理时,常需要对数据进行排序。
排序的方法有很多,如冒泡法、选择法等。
下面通过实例来介绍冒泡法排序的思想和算法。
例5.1-3 用冒泡法对随机存储在数组中的10个数从小到大排序分析:冒泡法排序程序算法如下(假设一个最坏的极端数据安排,随机情况原理相同) ①比较第一个数与第二个数,若为逆序(即a[0]>a[1])则交换,否则不交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n 个数比较完为止——第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上。
如图5.1-3所示(图中举例为6个元素)。
②对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置。
③重复上述过程。
对有n 个元素的数组,共要经过n-1趟冒泡排序后,排序结束。
N-S 图如图5.1-4所示。
#include <stdio.h>void main() {int a[11],i,j,t;printf(“Input 10 numbers:\n ”); for(i=1;i<11;i++) scanf(“%d ”,&a[i]);printf(“\n ”);for(j=1;j<=9;j++) for(i=1;i<=10-j;i++) if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;} printf(“The sorted numbers:\n ”); for(i=1;i<11;i++) printf(“%d ”,a[i]); printf(“\n ”);} 运行结果:Input 10 numbers:2 4 0 -123 8 16 -76 78 12 -1↙ The sorted numbers: -123 -76 -1 0 24 8 12 16 78程序说明♣ 数组a[11]定义长度为11,其中a[0]未用。
目的是要让外层循环的控制变量j 的变化参与到内层的控制变量i 的变化中,使条件表达式不要过于复杂,如i<=10-j 。
如果定义a[10],请读者思考一下,程序中各表达式应做如何变动?5.2二维数组5.2.1二维数组的定义二维数组的定义格式为类型说明 数组名[常量表达式1][常量表达式2];其中,类型说明是指出该二维数组各元素的数据类型;常量表达式1为行下标,常量表达式2为列下标。
如int a[3][4];float b[5][10];,定义了数组名为a 的整型二维数组和数组名为b 的实型二维数组。
由于数组是一种构造类型的数据,所以二维数组可以看作是由一维数组的嵌套而构成的。
即一维数组的每个元素又是一个一维数组,就组成了二维数组。
C语言将这样的分解连续地在内存中存储。
如上面定义的二维数组a[3][4],可看作是一个一维数组,它有3个元素:a[0]、a[1]、a[2];而每个元素又是一个包含4个元素的一维数组。
如图5.2-1。
可以把a[0]、a[1]、a[2]看作是三个一维数组的名字。
如一维数组a[0]中的元素分别为a[0][0],a[0][1],a[0][2],a[0][3]。
为了便于理解,可将二维数组视为行列式或矩阵,第一个下标为行号,第二个下标为列号,行号和列号都从0开始。