C语言程序设计教程(二)ppt.ppt_第1页
C语言程序设计教程(二)ppt.ppt_第2页
C语言程序设计教程(二)ppt.ppt_第3页
C语言程序设计教程(二)ppt.ppt_第4页
C语言程序设计教程(二)ppt.ppt_第5页
已阅读5页,还剩286页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计教程(二),第5章 循环结构 第6章 数组 第7章 函数,第5章 循环结构,循环结构与顺序结构、选择结构一起构成了解决各种复杂程序设计的基础,它主要用于处理那些需要重复执行的操作。相对于程序设计的三种结构,循环结构是最难掌握的,同时,它也是最重要的。C语言中构成循环结构的语句有三类:while循环,do-while循环和for循环。 通过本章学习,应掌握三类循环结构及其综合应用,强化循环的程序设计思想。,5.1 问题的提出,在许多问题中需要用到循环结构,我们先看两个实际问题。第一个问题是打印如图5-1所示图案。另外一个问题是计算从键盘输入n的阶乘(先不考虑溢出问题)。 * * * * * * * * * 图5-1 菱形图案,5.1 问题的提出(续),看到第一个问题,很多初学者觉得这个问题很简单,只要学习过printf语句,就能写出程序: #include void main() printf(“ * n“); printf(“ * n“); printf(“ * n“); printf(“ * n“) printf(“*n“); printf(“ * n“) printf(“ * n“); printf(“ * n“); printf(“ * n“); ,5.1 问题的提出(续),很显然,这个程序完全能够完成题目的要求,同时也能看出程序设计员没有利用循环结构,如果再按照相应的规律增加几十行,甚至几百行的话,那么又应该如何写此程序呢? 第二个问题如果再不使用循环结构的话就不能完成了,因为在程序执行之前,程序员本身并不知道用户输入的n的值到底是多少。类似的问题应该如何解决呢?学习完本章的内容后,回头再来看这些问题,如果能熟练掌握循环结构程序设计思想的话,这些问题将迎刃而解。 常用的循环语句包括三类:while循环,do-while循环和for循环。,5.2 while 循环结构,while语句是循环结构结构程序中很常用的语句,该语句通常用于构成“当型”循环结构。,5.2.1 while语句的基本形式,while语句的一般形式为: while (表达式) 循环体语句; 其执行过程为:先计算表达式的值,如果表达式的值为“真”(非0),则执行循环体语句,同时修改相应的变量后,再计算表达式,重复该过程,直到表达式的值为“假”(0)时退出循环。,5.2.2 while语句的应用,例5-1编程实现:从键盘输入n,计算n!(本例不考虑溢出问题)。 分析:先从键盘输入n,先判断n是否大于0,若小于0则提示用户正确输入,若等于0或1,则输出结果为1,若大于1则利用公式计算n!的值,然后输出即可。 程序代码如下: #include void main() int n; int i=1,sum=1; printf(“Please input a number: “); scanf(“%d“,5.2.2 while语句的应用(续),if(n1) while(i=n) sum*=i; i+; printf(“The result of n! is :%dn“,sum); ,5.2.2 while语句的应用(续),运行结果: Please input a number: -4 Error!Enter again: 0 The result of n! is 1 Please input a number: 4 The result of n! is :24,5.2.2 while语句的应用(续),例5-2 编程实现:将从键盘输入的一串字符显示在屏幕上,遇到字符“*”时终止(用while语句实现)。 分析:输入一个字符,判断该字符是否为终止符号“*”,若不是终止符号则继续输入,碰到回车符号开始接收输入,碰到“*”结束输入。 本例不能输出“*”,请读者思考如何设计程序使得能输出“*”。,5.2.2 while语句的应用(续),程序代码如下: #include void main() char c; printf(“Please input a string end with *:n“); c=getchar(); while(c!=*) putchar(c); c=getchar(); ,5.2.2 while语句的应用(续),运行结果: Please input a string end with *: -4 56780 -4 56780 Guangxi* Guangxi,5.2.2 while语句的应用(续),例5-3 编程实现:输入某门课程的若干名同学的成绩,以-1作为结束输入的标志,计算该门课程的平均成绩。 分析:先输入一个成绩,若输入-1,直接结束,否则,使用循环结构计算总成绩,同时用计数器记录输入成绩个数,最后利用公式:平均分=总成绩/输入成绩个数,来求取平均成绩。,5.2.2 while语句的应用(续),程序代码如下: #include void main() int n=0; float sum=0,score=0; printf(“Please input the score end with -1: “); scanf(“%f“,5.2.2 while语句的应用(续),if(score=0) while(score!=-1) sum+=score; scanf(“%f“, ,5.2.2 while语句的应用(续),运行结果: Please input the score end with -1: -4 No score! Please input the score end with -1: 90 86 48 84 -1 The average score is 77.00,5.2.2 while语句的应用(续),注意: (1)循环体若包含一个以上的语句,则要用花括弧把这些语句括起来,以复合语句形式出现,否则,可能与程序要求不符,因为while语句的范围只到while后面的第一个分号处。例5-2中若把 while(c!=*) putchar(c); c=getchar(); 的花括弧去掉,写成: while(c!=*) putchar(c); c=getchar(); 则程序显然不能完成题目要求,并且会陷入死循环。,5.2.2 while语句的应用(续),(2)在循环体中一定要有使循环趋向结束的操作。比如:例5-1的i+和例5-3的n+语句,否则,循环将永不结束,形成死循环。 (3)如果循环表达式的值为“0”或者假,则循环体语句一次也不执行。 例如: while(0) sum*=i; i+; 由于表达式的值为0,循环体语句一次也不执行。,5.2.2 while语句的应用(续),(4)循环表达式的值为“1”或者“永真”的时候,可以通过if语句对循环进行控制。例5-1中的语句: While(i=n) sum*=i; i+; 两个循环体能完成相同的功能,其中的break语句用于跳出循环。break语句的用法参见本章第五节。 (5)while循环语句的循环体中又可以包含循环语句,称为循环语句的嵌套,又称为多重循环,While(8) sum*=i; if(i=n) i+; else break; ,可以写成:,5.3 do-while 循环结构,do-while语句也是循环结构结构程序中比较常用的语句,该语句类似于“直到型”循环结构,但它的循环继续条件与“直到型”相反。,5.3.1 do-while语句的基本形式,while语句的一般形式为: do 循环体语句; while (表达式); 其执行过程为:先执行一次循环体语句,然后计算表达式的值,如果表达式的值“真”(非0),则再次执行循环体,同时修改相应的变量后,再计算表达式,重复该过程,直到表达式的值为“假”(0)时退出循环。,5.3.2 while语句的应用,例5-4 编程实现:从键盘输入正整数n,计算s=1+2+3+n(用while语句实现)。 分析:从键盘输入正整数n,利用公式计算s=1+2+3+n,然后输出s。 程序代码如下:,5.3.2 while语句的应用(续),#include void main() int n; int i=0,s=0; printf(“Please input a positive integer: “); scanf(“%d“, ,5.3.2 while语句的应用(续),运行结果: Please input a positive integer:100 The result is 5050 Please input a positive integer:999 The result is :499500,5.3.2 while语句的应用(续),例5-5 编程实现:将从键盘输入的一串字符显示在屏幕上,遇到字符“*”时终止(用do-while语句实现). 分析:输入一个字符,判断该字符是否终止符号“*”,不是终止符号则继续输入,碰到回车符号开始接收输入,碰到*结束输入。 程序代码如下:,5.3.2 while语句的应用(续),#include void main() char c; printf(“Please input a string end with *:“); do putchar(c=getchar(); while(c!=*); ,5.3.2 while语句的应用(续),运行结果: Please input a string end with *: Guangxi Guangxi 233234746767hfas* 233234746767hfas*,5.3.2 while语句的应用(续),注意: (1)和while语句类似,do-while循环体内也一定要有改变循环条件的语句,使循环趋向于结束。 (2)为了避免编译系统把do-while语句的while当成while语句中的while语句的开始,do-while的循环体即使只有一个语句,也需要用花括号括起来。例5-5中的do-while循环体部分可以改写成: do putchar(c=getchar(); while(c!=*); 这样的循环体同时能完成和例5-5一样的功能,但是若把花括号去掉,写成: do putchar(c=getchar(); while(c!=*); 则编译系统可能把while(c!=*);部分当成一个while语句进行编译。,5.3.2 while语句的应用(续),3)do-whlie循环先执行循环体语句,后判断表达式,也就是说不管其表达式的值是否总为“假”(0),其循环体语句总能够被执行。 例如: while(0) do printf(“While!n”); printf(“Do-while!n”); while(0); 上例很容易看出while语句和do-while语句的不同之处,while语句执行的时候是没有输出的,但是do-while语句执行的时候就会输出:Do-while!。可以得到结论:在两者有相同循环体的情况下,当while后面的表达式的第一次为“真”时,两个循环体得到的结果相同,否则,二者结果不同。 (4)do-while循环语句的循环体中又可以包含循环语句以实现多重循环。,5.4 for 循环结构,在三类循环结构语句中,for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且也可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。,5.4.1 for语句的基本形式,for语句的一般形式为: for(表达式1;表达式2;表达式3) 语句; 其执行过程为:先计算表达式1的值,再计算表达式2的值,同时判断表达式2的值,若为“假”(0),循环结束,退出for语句循环,执行for语句下面的一条语句,若为“真”(非0),则执行循环体中的语句,计算表达式3的值,然后再去计算表达式2的值,重复该过程,直到表达式2的值为“假”(0)时退出循环语句。,5.4.1 for语句的基本形式(续),由流程图很容易得到结论,for语句实际上等价于下面的while语句: 表达式1; While(表达式2) 语句; 表达式3; ,5.4.2 for语句的应用,for语句在使用上比较灵活,表达式1可以放在循环语句前;表达式2可以放在循环体内,这时等价于表达式2的值为“真”(非0);表达式3可放在循环体的后面。于是将会出现for语句的不同形式,如例5-6所示。 例5-6 编程实现:从键盘输入正整数n,计算s=1+2+3+n(用for语句实现)。 分析:从键盘输入正整数n,利用公式计算s=1+2+3+n,然后输出s。,5.4.2 for语句的应用(续),程序代码如下: #include void main() char c; printf(“Please input a string end with *:“); do putchar(c=getchar(); while(c!=*); ,5.4.2 for语句的应用(续),类似的程序代码形式有如下几种: 第一种: #include void main() int n; int i,s; printf(“Please input a positive integer: “); scanf(“%d“, 此例是将循环体放入表达式中,即循环体语句为空。 注意:不能将for语句循环后的“;”去掉。,5.4.2 for语句的应用(续),第二种: #include void main() int n; int i=1,s=0; printf(“Please input a positive integer: “); scanf(“%d“, 此例是将表达式放入循环体中。,5.4.2 for语句的应用(续),第三种: #include void main() int n; int i=1,s=0; printf(“Please input a positive integer: “); scanf(“%d“, 此例是用if语句来判断是否停止循环。,5.4.2 for语句的应用(续),第四种: #include void main() int n; int i=1,s=0; printf(“Please input a positive integer: “); scanf(“%d“, ,5.4.2 for语句的应用(续),运行结果: Please input a positive integer:100 The result is 5050. Please input a positive integer:999 The result is :499500.,5.4.2 for语句的应用(续),例5-7 编程解决猴子吃桃问题。猴子吃桃问题的描述:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天又将剩下的桃子吃掉了一半,又多吃了一个。以后每天将前一天剩下的桃子吃掉一半,再多吃一个。直到第十天只剩下一个桃子了,求第一天共摘了多少个桃子。 分析:依照题目意思有容易知道,第十天剩下一个桃子,假设为x,第九天的桃子就是2*(x+1),第八天的桃子就是2*(2*(x+1)+1),依次类推。可以得到最后的值,并输出即可。,5.4.2 for语句的应用(续),程序代码如下: #include void main() int i,x=1; for(i=1;i10;i+) x=2*(x+1); printf(“Total is %d.n“,x); 运行结果: Total is 1534.,5.4.2 for语句的应用(续),例5-8 编程实现:从键盘输入一批非零整数,以0为终止符,输出这批数字中的最大值。 分析:从键盘输入一批整数,利用max变量存放当前最大的整数,先把第一个变量作为最大值赋值给max,以后每输入一个数先和max比较,若比max大则直接赋值给max,使得max值总是最大,直到输入0结束,输出max即可。,5.4.2 for语句的应用(续),程序代码如下: #include void main() int n,max; printf(“Please input numbers,last one is 0: “); scanf(“%d“, ,5.4.2 for语句的应用(续),运行结果: Please input numbers,last one is 0:100 -3 23 45 89 7 3 0 Max is 100 注意: (1)关键字for后面括号里的三个表达式都可以省略,但是其中的两个“;”不能省略。否则,系统会报错。 (2)如果表达式1被省略,则应该在for语句之前给变量赋初值。例如 int i=1,s=0; for(;i=n;i+) s+=i; ,5.4.2 for语句的应用(续),(3)如果表达式2被省略,则for循环语句将会无限循环,只有在循环体内加上退出循环的语句才有意义。通常加入语句: if(表达式) break; 该if语句表示当满足某条件时,也就是说表达式的值为“真”(非0),执行break语句,退出该重循环 (4)如果表达式3被省略,则程序员可以把表达式3的内容加到循环体内,以保证循环能够正常结束。,5.4.2 for语句的应用(续),例如: int i=1,s=0; for(i=1;i=n;) s+=i; i+; (5)循环体若包含一个以上的语句,则要用花括弧把这些语句括起来,以复合语句形式出现,否则,可能与程序要求不符。 (6)for循环语句也可以嵌套使用,也就是在它们的循环体内可以包含另外一种循环语句。 C语言提供的3类循环语句,它们既可以自身嵌套,也可以相互嵌套。,5.5 转向语句,break语句 continue语句 goto语句,5.5.1 break语句,break语句的一般格式为: break; 该语句的功能是退出某段程序。该语句常用于两种情况: (1)用于开关语句switch的语句序列中,表示退出该开关语句。 (2)用于循环语句的循环体中,终止最内层循环,即跳出循环体,直接执行循环结构后面的语句,一般与if语句连用,当满足某种条件时跳出循环体。,5.5.1 break语句(续),例5-9 编程实现:从键盘输入小于100的正整数n,找出在n-100以内的自然数中可以被13整除第一个数。 分析:从键盘输入正整数n,用for语句来实现对每个数的判断,当该数能被13整除时,输出该数,然后执行break语句,结束循环,当该数不能被13整除时,先使变量增1,然后进行下一次循环操作,直到找出第一个能被13整除的数,结束循环,输出该数。,5.5.1 break语句(续),程序代码如下: #include void main() int i,n; int s=0; printf(“Please input a positive integer: “); scanf(“%d“, ,5.5.1 break语句(续),运行结果: Please input a positive integer:1 The first number is 13. Please input a positive integer:45 The first number is 52.,5.5.2 continue语句,continue语句的一般格式为: continue; 该语句的功能是结束本次循环,转到循环头去判断是否继续循环。该语句只能用在循环语句的循环体中,一般也是与if语句连用,当满足某种条件时跳出循环体。,5.5.2 continue语句(续),例5-10 编程实现:从键盘输入小于100的正整数n,找出在n-100以内的自然数中可以被13整除的数。 分析:从键盘输入正整数n,用for语句来实现对每个数的判断,当该数能被13整除时,输出该数,然后执行continue语句,结束本次循环,当该数不能被13整除时,先使变量增1,然后进行下一次循环操作,直到找出全部能被13整除的数。,5.5.2 continue语句(续),程序代码如下: #include void main() int i,n; int s=0; printf(“Please input a positive integer: “); scanf(“%d“, ,5.5.2 continue语句(续),运行结果: Please input a positive integer:1 The number is 13 26 39 52 65 78 91 Please input a positive integer:45 The number is 52 65 78 91,5.5.3 goto语句,goto语句的一般格式为: goto 语句标号; 该语句是无条件转向语句,它的功能是:把程序控制转移到标号指定的语句处,使程序从指定的标号处的语句开始继续执行。goto语句和结构化程序设计思想不符,实际编程时,最好不用goto语句,只有在使用该语句确实能使程序更加简练明了的时候,可以尝试使用该语句。,5.5.3 goto语句(续),例5-11 编程实现:从键盘输入一段自然数范围,找出该范围内能同时被13和17整除的数,如果找不到,给出相应的提示信息。 分析:从键盘输入两个正整数a和b,进行比较,使得a的值总是较小的,b的值总是较大的,用for语句来实现对这两个整数中间的自然数进行判断,当该数能同时被13和17整除时,输出该数,用goto语句跳到一条输出语句,如果找完了全部的数都不能找到,则输出提示信息,调用另一条goto语句,该条goto语句是一条空语句。,5.5.3 goto语句(续),程序代码如下: #include void main() int i,a,b,temp; printf(“Enter two positive integer: “); scanf(“%d%d“, ,5.5.3 goto语句(续),for(i=a;i=b;i+) if(i%13=0 运行结果: Enter two positive integer:65 34 Not found! Enter two positive integer:65 230 221,5.6 程序应用,例5-12 编程实现:求解10000!的末尾有多少个0。 分析:很显然不能用连乘来求出10000!的值以后再去数它的末尾有多少个0,而是应该判断从1到10000之间有多少个因子5,因为任何一个偶数乘以5都会得到一个0。,5.6 程序应用(续),程序代码如下: #include void main() int i,k; int count=0; for(i=5;i=10000;i+=5) k=i; while(k%5=0) count+; k/=5; printf(“There are %d zero in the end of 10000!n“,count); ,5.6 程序应用(续),运行结果: There are 2499 zero in the end of 10000 例5-13 编程实现:从键盘输入两个自然数,找出这两个数的最大公约数并输出。 分析:从键盘输入两个自然数a和b,进行比较,使得a的值总是较小的,b的值总是较大的,再使用辗转相除法求出两个数的最大公约数,然后输出即可。,5.6 程序应用(续),程序代码如下: #include void main() int a,b,r,temp; printf(“Enter two positive integer: “); scanf(“%d%d“,5.6 程序应用(续),while(r!=0) a=b; b=r; r=a%b; printf(“%d“,b); 运行结果: Enter two positive integer: 13 17 gcd13,17=1 Enter two positive integer: 56 48 gcd56,48=8,5.6 程序应用(续),例5-14 编程验证:任何一个自然数n的立方都等于n个连续的奇数之和。例如:13=1,23=3+5,33=7+9+11(输入-1时程序结束)。 分析:从键盘输入正整数n,当n为-1的时候,程序结束,当n为自然数时循环语句去寻找等式,直到找到符合条件的等式的时候把该等式输出即可。,5.6 程序应用(续),程序代码如下: #include void main() int i,n,a,b,c; printf(“Enter a positive integer end with -1: “); scanf(“%d“,5.6 程序应用(续),for(i=1;i=n;i+) c+=b; b+=2; if(c=n*n*n) break; else a+=2; while(1); printf(“%d*%d*%d=“,n,n,n); for(i=1;i=n;i+) printf(“%d“,a); if(i!=n) printf(“+“); a+=2; ,5.6 程序应用(续),printf(“nEnter a positive integer end with -1:“); scanf(“%d“, 运行结果: Please input a positive integer:4 4*4*4=13+15+17+19 Please input a positive integer:7 7*7*7=43+45+47+49+51+53+55 Please input a positive integer:-1,5.6 程序应用(续),例5-15 打印如图5-1所示图案。 分析:打印一个由若干行和若干列组成的二维图形的话,需要将程序设计成一个二层循环,通常外循环的循环次数对应与图形的总行数,内循环的循环次数对应于图形每一行打印的符号的个数,本例有两种方案供参考。一种是把图案分成上下两个三角形来打印,如方案一,另一种是按照整个菱形打印,如方案二。 方案一:将图形分成上下两个三角形打印。 上三角形的组成规律是:第一行打印一个*,第二行打印三个*,第三行打印五个*,第四行打印七个*,第五行九个*。通过在*号前打印空格的方法使得图形呈三角形形状。打印空格的个数为:第一行打印(9-1)/2=4个,第二行(9-3)/2=3个,第三行2个,第四行1个。,5.6 程序应用(续),下三角形的组成规律是:四行的*个数分别是7,5,3和1个。下三角形打印空格的个数为:第一行1个,第二行2个,第三行3个,第四行4个。 程序代码如下: #include void main() int i,j,k; for(i=1;i=5;i+) for(j=1;j=5-i;j+) printf(“ “); for(k=1;k=2*i-1;k+),5.6 程序应用(续),printf(“*“); printf(“n“); for(i=4;i=1;i-) for(j=1;j=5-i;j+) printf(“ “); for(k=1;k=2*i-1;k+) printf(“*“); printf(“n“); ,5.6 程序应用(续),运行结果: * * * * * * * * *,5.6 程序应用(续),方案二:按菱形图案打印。 该方案中,图形的行数按总行数考虑,编程时要考虑两点: (1)每行输出*的起始位置,也就是前面输出空格的个数,若用m表示要输出的空格个数的话,可以用公式m=abs(5-i)计算m的值,其中的i为行号,其中abs()为求绝对值的数学函数。 (2)每行打印*的个数k可以用公式k=2*n-1来计算,第5行前,n=i,第5行以后n=10-i,其中的i为行号。 程序代码如下:,5.6 程序应用(续),#include #include void main() int i,j,k,m,n; for(i=1;i5) n=10-i;,j=2*n-1; for(k=1;k=m;k+) printf(“ “); for(k=1;k=j;k+) printf(“*“); printf(“n“); ,运行结果如方案一。,习题,1. 写出下列程序段的运行结果。 (1) int i=0,j=2; while(i=3) i+; j*=2; printf(“i=%d,j=%dn“,i,j);,(2) int k=4,n=0; for(;nk;) n+; if(n%2=0) continue; k-; printf(“k=%d,n=%dn“,k,n);,习题,break语句和continue语句在循环体内是否具有相同的功能,比较它们的异同之处。 编程求解百钱买百鸡问题。百钱买百鸡问题:“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几只”。 有一命题:任何一个自然数都可以表示为4个整数的平方和,例如47=62+32+12+12。试编程校验该命题在400000以内的自然数范围内是否成立。 编程实现:打印出所有的“水仙花数”。所谓“水仙花数”是指一个3位数,其各位数字的立方和等于该数本身。例如153是一个“水仙花数”,因为 。,习题,编程实现:输出九九乘法表。 11=1 12=2 22=4 13=3 23=6 33=9 编程实现:读入200名学生的C语言成绩,输出成绩在60-85分之间的学生总人数。 编程实现:通过计算100个矩形的面积得到函数 的数值积分。 ,其中 0xb。 现有393厘米的长杆一根,要求将它截成81厘米、41厘米、29厘米的短杆若干根,要求在81厘米和41厘米两种规格各截一根的前提下,编程求解该如何截才能使得剩下的余料最短,并输出最短的余料和三种规格各截得的根数。,习题,编程求3000以内的亲密数。整数A和B称为亲密数的条件为:如果整数A的全部因子(包括1,不包括A本身)之和等于B,且整数B的全部因子(包括1,不包括B本身)之和等于A。 编程验证5000以内的哥德巴赫猜想:对任何大雨4的偶数都可以分解为两个素数之和。 一辆汽车违反交通规则,撞人以后逃离现场。现场有三人目击现场,但都没有记住车牌号码,只记下车牌号码的一些特征:A记得牌照的前两位数字是相同的,B记得牌照的后两位数字相同,C记得四位的车牌号刚好是一个整数的平方。编程求得该四位的车牌号并输出。,第6章 数组,数组是C语言提供的一种常用的构造型数据类型,它是由相同数据类型的数据按照一定的顺序组织起来的集合体,在C程序设计中应用非常广泛。 本章从主要讲述一维数组和二维数组的声明格式,数组元素的表示方法和数组的赋值以及数组在程序中如何应用等。,6.1 问题的提出,到目前为止,我们使用的都是属于基本的数据类型(即int、float、double、char以及int和float的一些变体)的数据。尽管这些数据类型都很有用,但是它们却只能用于处理数量有限的数据。当遇到大量数据的时候我们该怎么办呢?我们先看两个实际问题。第一个问题是假设某计算机班有学生人数为30人,要编程实现录入该班学生的C语言程序设计课程成绩,并将成绩按照从高分到低分的次序输出。第二个问题是假设某计算机班有学生人数为30人,要编程实现录入该班每名学生的C语言程序设计课程成绩和英语课程成绩,并将成绩按照两门课程总分的成绩从高分到低分的次序输出。 这两个问题都是实际生活中会碰到的问题。在日常生活中如果碰到类似问题应该如何解决呢?如果有笔和纸的话,对第一个问题,读者一定可以想到先用笔把30个学生的C成绩都记在纸上,然后先从中挑出最高分,接着再在剩下的成绩挑出最高分排在后面,如此循环到挑完为止,这个过程实际上就是个排序的过程。在编程的时候,我们先暂时不考虑排序的细节,先看如何存储这30个学生的成绩?很多初学者觉得这个问题很简单,就像声明实型变量一样声明30个实型变量(如:float a1,a2,a3,a30;),如果这样可以的话,那么若某年级的500名学生的C成绩都要处理,那将需要声明500个变量?很显然,这是不可能的。 第二个问题和第一个问题有相似的地方,只要能把两门课的总成绩计算出来并且用变量把它保存下来的话,问题就变的和第一个问题一样了。于是问题就转化成如何把两门课程的总成绩计算出来并把结果保存下来了?,6.2 数组的基本概念,数组是具有相同数据类型有序数据的集合。从概念上说,数组是一组变量,这组变量应该满足如下3个条件: (1)具有相同的数据类型; (2)具有相同的名字; (3)在存储器中是被连续存放的。 其中,每个变量称为数组的一个数组单元,保存在数据单元中的数据值称为数组元素,在不引起混淆的情况下,两者都可以简称为元素。数组名表示整个数组。每个数组在使用之前都必须先声明。,6.3 一维数组,只有一个下标的数组称为一维数组。一维数组是由同类型数据按照线性次序顺次排列而成的构造类型。一维数组适合处理逻辑上一维的数据结构,比如说,数学中的向量和数列等问题。,6.3.1 一维数组的声明,一维数组的声明形式为: 数据类型 数组名 数组长度; 其中,数据类型说明符是C语言提供的任何一种基本数据类型或构造数据类型。数组名是用户声明的标识符。方括号中的数组长度的是一个常量或者常量表达式,其值只能是个正整数用以表示数组单元的个数。 例如: int age10; 说明整型数组age,有10个元素。 float score30,money35; 说明单精度浮点型数组score,有30个元素;单精 度浮点型数组money,有35个元素。 char name20; 说明字符型数组name,有20个元素。 声明数组时要注意以下四点: (1)数组的数据类型声明的是每个数组元素的取值类型,也就是说,同一个数组中的元素具有相同的数据类型。 (2)数组名的声明要符合C语言规定中标识符的声明要求,即,只能由字母、数字和下划线三种字符组成,且第一个字符只能是字母或者下划线。 (3)方括号中的数组长度的是一个常量或者常量表达式,而不能是变量或者是包含变量的表达式,也不能是小数。,6.3.1 一维数组的声明(续),例如: 程序段一: void main() int score30; /*正确*/ . . 程序段二: void main() float score3.5; /*错误*/ . . ,6.3.1 一维数组的声明(续),程序段三: #define N 25 void main() float scoreN,numberN+5; /*正确*/ . . 程序段四: void main() int n=20; float scoren; /*错误*/ float scoren+5;/*错误*/ . . (4)在一个函数中不能出现数组名和其他的变量名同名的情况。请看下面程序段: void main() int n=20; float n10; /*错误*/ . . ,6.3.2 一维数组的引用,在C语言中不能一次引用整个数组,只能引用单个数组元素。一个数组元素就相当于一个变量,该数组元素的使用等同于相同数据类型的普通变量。一维数组的引用形式为: 数组名 下标 其中,数组下标可以是非负整数,整型变量或整型表达式,但不能是浮点数,浮点型变量或者浮点型表达式;同时还要求下标值不能大于数组长度-1。 例如: 若有声明float score20; 则score0,score19,scorei,scoren-i,scoren-4等都是符合C语言语法的表达式(其中i和n是整型变量,它们的取值范围为:0i19,4n23,0n-i19);而score-1,score8.5等就不是合法的引用方式。,6.3.2 一维数组的引用(续),引用数组时需要注意以下三点: (1)声明数组时,数组名后面方括号中的内容和引用数组元素时数组名后面方括号中的内容的含义是不相同的,前者为数组的长度,后者为数组元素的下标。 (2)数组下标可以是整型常量、变量或整型表达式。下标的取值范围是0,数组长度-1的整型值。 (3)C程序运行时编译系统并不检查数组元素的下标是否越界,需要程序员自己确保所编写的程序中没有出现数组元素下标越界的情况。例如,若有声明“float score20;”之后,程序员若在程序中修改或使用score20,编译系统并不报错,对score20的操作实际上是对内存其他空间的操作,因此可能造成严重后果。,6.3.3 一维数组的初始化,一维数组的初始化就是给一维数组的元素赋初值。初始化操作既可以在声明一维数组的同时完成,也可以在数组声明之后进行。声明一维数组的同时初始化的形式为: 数据类型 数组名 下标=初值列表; 而在声明数组之后进行初始化操作,则只能对每个数组元素一一赋值。 例如: float num20,i; for(i=0;i20;i+) numi=i;,6.3.3 一维数组的初始化(续),初始化数组时需要注意以下四点: (1)花括号内各个初值之间要用逗号隔开,例如,若有“int a3=4,6,8;”,则在声明数组a的同时把4,6,8依次赋给数组元素a0,a1,a2。 (2)花括号中初值的数量必须小于等于数组长度。当初值数量小于数组长度时,数值型数组的后面没有初值的元素由系统自动赋值为0。例如,若有“int a5=4,6,8;”,则在声明数组a的同时把4,6,8依次赋给数组元素a0,a1,a2,而a3,a4的值则为0。 (3)若给数组的所有元素赋初值,可以省略数组的长度。系统会根据所赋初值的个数确定数组的长度。例如,若有“int a=4,6,8,10,12;”,完全等价于“int a5=4,6,8,10,12;”。 (4)C编译系统为数组分配连续的内存单元。数组元素的相对次序由下标来表示。“int a6=4,6,8,10,12,14;”声明的数组a的物理存储结构如表6-1所示。 a0 a1 a2 a3 a4 a5,6.3.4 一维数组的应用,例6-1 编程实现:从键盘输入若干个整数并输出所输入的整数。 分析:要实现输入若干个整数,应该用一个数组去保存这些数据,同时可以采用宏声明的办法声明一个常量,把该常量作为数组长度的值。 程序代码如下: #define N 5 #include void main() int arrN,i; printf(“Enter %d numbers:n“,N); for(i=0;iN;i+) scanf(“%d“, 运行结果: Enter 5 numbers: -45 67 8 0 65 -45 67 8 0 65,6.3.4 一维数组的应用(续),例6-2 编程实现:从键盘输入6个整数,然后按照输入顺序的逆序输出。 分析:先从键盘输入6个整数,把这些数保存在数组中,经过处理以后把该数组中的数据逆序输出。如何才能做到逆序存放呢?有两种方案: 方案一:若输入的整数个数为N,以m=N/2-1为中心,当i小于等于m时,交换numi和numN-i-1的值,然后输出即可。 程序代码如下:,6.3.4 一维数组的应用(续),#define N 6 #include void main() int numN,i,j,m,temp; m=N/2-1; printf(“Enter %d numbers:n“,N); for(i=0;iN;i+) /*输入整数*/ scanf(“%d“, /*输出逆序后的数组元素*/ ,6.3.4 一维数组的应用(续),运行结果: Enter 6 numbers: -4 6 7 8 9 0 -4 6 7 8 9 0 0 9 8 7 6 -4 方案二:若输入的整数个数为N,i和j分别代表从前往后数和从后往前数的数组元素的下标,当i小于j时,交换numi和numj的值,然后输出即可 程序代码如下:,6.3.4 一维数组的应用(续),#define N 6 #include void main() int numN,i,j,temp; printf(“Enter %d numbers:n“,N); for(i=0;iN;i+) /*输入整数*/ scanf(“%d“, /*输出逆序后的数组元素*/ ,6.3.4 一维数组的应用(续),运行结果: Enter 6 numbers: -4 6 7 8 9 0 -4 6 7 8 9 0 0 9 8 7 6 -4 例6-3 输入10个整数,输出这些数中最小的数以及第一个最小的数在所输入数列中的位置。 分析:先从键盘输入10个整数,把这些数保存在数组中,用一个变量min_a记住第一个最小数组元素所对应的下标,先把数组中的第一个元素下标赋值给min_a,然后把第二个数组元素到第100个数组元素依次和下标为min_a的数组元素进行比较,如果前者的值小于后者的话,把它的下标赋值给min_a,然后输出该数和它在所输入数列中的位置(min_a+1,因为数组下标从0开始)即可。,6.3.4 一维数组的应用(续),程序代码如下: #define N 10 #include void main() int dataN,i; int min_a=0; printf(“Enter %d numbers:n“,N); for(i=0;iN;i+) /*输入整数*/ scanf(“%d“, ,6.3.4 一维数组的应用(续),运行结果: Enter 10 numbers: -4 6 7 8 9 0 -9 12 -9 21 Mi

温馨提示

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

评论

0/150

提交评论