c语言课件第9章_第1页
c语言课件第9章_第2页
c语言课件第9章_第3页
c语言课件第9章_第4页
c语言课件第9章_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

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

文档简介

1、随机点名2022/8/41#include #include #include #include int main() int n, sel; unsigned seed = time(NULL);/获得当前系统时间,作为种子 srand(seed); /调用种子函数,为rand()设置生成伪随机数的种子 printf(随机提问程序准备就绪!nn请问需要几位同学回答问题?n=); scanf(%d, &n); while (n0) n-; while (sel=rand()%71 )=4006);/学号从3888开始 printf(n这次要回答提问的同学是: 2332012220%4dn, s

2、el); if (n0) printf(n还有%d位同学,按任意键继续n, n); getch(); /接受输入但不回显 printf(n提问完毕!n); return 0;习题1下列代码有什么问题?该如何修改?2022/8/42#include #include int main() char string10, str10; int i; for (i=0; i10; i+) stri = a+i; strcpy(string, str); printf(%s, string); return 0;习题2下列代码有什么问题?该如何修改?2022/8/43#include void fun(

3、char a10) char c=a3; printf(%c, c);int main() char b10=abcdefg; fun(b10); return 0;复习回顾上次课的内容:为什么需要结构体?什么是结构体类型什么是结构体变量怎样申明结构体类型怎样定义结构体变量2022/8/44结构体之水浒传hero排名性别天罡地煞名姓名江湖绰号职位使用的武器Luda13M天孤星鲁智深花和尚步军头领水磨禅杖Husanniang59F地慧星扈三娘一丈青马军头领日月双刀Songjiang1M天魁星宋江及时雨总头领无struct hero int number; char sex; char star_

4、name20; char name20; char nickname20; char position20; char weapon20;“.”运算符成员运算符,一般和结构体变量名称一起使用,用来指定结构体变量的成员引用结构体变量的一般形式 结构体变量名.成员名wusong.number+;scanf(%s, wusong.weapon);printf(%s, wusong.nickname);#include int main()struct Student long int num; char name20; char sex; char addr20; a=10101,“Li Lin”,

5、M, “123 Beijing Road”; a.num=10010; 对printf(“%sn”,a); 不对 必须先定义结构体变量,才能对其进行引用! 不能对结构体变量整体进行诸如输入/输出的操作!#include int main()struct Student long int num; char name20; char sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”; b=a; 对struct Student b;b.num+; 对 C语言允许两个相同类型的结构体变量之间进行整体赋值 结构体成员变量可以像普通变量一样

6、参与各种运算和操作#include int main()struct Student long int num; char name20; char sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”; scanf(%ld,&a.num); 对printf(%o,&a); 对scanf(“%ld,%s,%c,%sn”,&a); 错 可以引用结构体变量地址,也可以引用结构体成员变量的地址#include int main() struct Date int month; int day; int year; ;struct Stu i

7、nt num;char name20; char sex;int age; struct Date birthday; char addr30; a,b;a.birthday.month=12; 对a.age=10; b.age=9; 对sum=a.age+b.age; 对 如果一个结构体变量的成员又是一个结构体类型,引用时要用成员运算符逐级遍历到最底层的成员。 例9.2 输入两个学生的学号、姓名和成绩,输出成绩较高学生的学号、姓名和成绩解题思路:(1)定义两个结构相同的结构体变量student1和student2;(2)分别输入两个学生的学号、姓名和成绩;(3)比较两个学生的成绩,如果学生1

8、的成绩高于学生2,就输出学生1的全部信息,如果学生2的成绩高于学生1,就输出学生2的全部信息。如果二者相等,输出2个学生的全部信息#include int main() struct Student int num; char name20; float score; student1,student2; scanf(%d%s%f,&student1.num, , &student1.score); scanf(“%d%s%f”,&student2.num, , &student2.score); 不能加& printf(The higher

9、 score is:n); if (student1.scorestudent2.score) printf(%d %s %6.2fn,student1.num, , student1.score); else if (student1.scorestudent2.score) printf(%d %s %6.2fn,student2.num, , student2.score); else printf(%d %s %6.2fn,student1.num, , student1.score); printf(%d

10、%s %6.2fn,student2.num, , student2.score); return 0;9.2 使用结构体数组9.2.1定义结构体数组9.2.2 结构体数组的应用举例9.2.1定义结构体数组 例9.3 有3个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,最后输出各人得票结果。9.2.1定义结构体数组解题思路:设一个结构体数组,数组中包含3个元素每个元素中的信息应包括候选人的姓名(字符型)和得票数(整型)输入被选人的姓名,然后与数组元素中的“姓名”成员比较,如果相同,就给这个元素中的“得票数”成员的值加1输出所有元素的信

11、息#include #include struct Person char name20; int count; leader3=“Li”,0,“Zhang”,0,“Sun”,0; 全局的结构体数组namecountleader0Li0Zhang0Sun0int main() int i,j; char leader_name20; for (i=1;i=10;i+) scanf(“%s”,leader_name); for(j=0;j3;j+) if(strcmp(leader_name, )=0) leaderj.count+; for(i=0;i3;i+) pri

12、ntf(%5s:%dn“,, leaderi.count); return 0;leaderj.count=leaderj.count+1;int main() int i,j; char leader_name20; for (i=1;i=10;i+) scanf(“%s”,leader_name); for(j=0;j3;j+) if(strcmp(leader_name, )=0) leaderj.count+; for(i=0;i3;i+) printf(%5s:%dn“,, leaderi.count); ret

13、urn 0;说明:(1)定义结构体数组一般形式是 struct 结构体名 成员表列 数组名数组长度; 先声明一个结构体类型,然后再用此类型定义结构体数组: 结构体类型 数组名数组长度; 如: struct Person leader3; 说明:(2)对结构体数组初始化的形式是在定义数组的后面加上:初值表列; 如:struct Person leader3= Li,0,Zhang,0,Fun,0; 9.2.2 结构体数组的应用举例 例9.4 有n个学生的信息(包括学号、姓名、成绩),要求按照成绩的高低顺序输出各学生的信息。解题思路:用结构体数组存放n个学生信息,采用选择法对各元素进行排序(进行比

14、较的是各元素中的成绩)。#include struct Student int num; char name20; float score; ; int main() struct Student stu5=10101,Zhang,78 , 10103,Wang,98.5, 10106,Li, 86 , 10108,“Ling”, 73.5, 10110,“Fun”, 100 ; struct Student temp; const int n = 5 ; int i,j,k;常变量若人数变为3030#include struct Student int num; char name20; f

15、loat score; ; int main() struct Student stu5=10101,Zhang,78 , 10103,Wang,98.5, 10106,Li, 86 , 10108,“Ling”, 73.5, 10110,“Fun”, 100 ; struct Student temp; const int n = 5 ; int i,j,k;#define N 5注意temp的类型 printf(The order is:n); for(i=0;in-1;i+) k=i; for(j=i+1;jstuk.score) k=j; temp=stuk; stuk=stui; s

16、tui=temp; for(i=0;in;i+) printf(%6d %8s %6.2fn, stui.num,,stui.score); printf(n); return 0;写法上与普通变量一致9.3 结构体指针9.3.1 指向结构体变量的指针9.3.2 指向结构体数组的指针9.3.3 用结构体变量和结构体变量的指针作函数参数9.3.1 指向结构体变量的指针指向结构体对象的指针变量既可以指向结构体变量,也可以用来指向结构体数组中的元素。指针变量的基类型必须与结构体变量的类型相同。例如: struct Student *pt; 9.3.1 指向结构体变量的指针 例9.5

17、 通过指向结构体变量的指针变量输出结构体变量中成员的信息。解题思路:在已有的基础上,本题要解决两个问题:怎样对结构体变量成员赋值;怎样通过指向结构体变量的指针访问结构体变量中成员。#include #include int main() struct Student long num; char name20; char sex; float score; ; struct Student stu_1; struct Student * p; p=&stu_1; stu_1.num=10101; strcpy(stu_1.name,“Li Lin”); stu_1.sex=M; stu_1.s

18、core=89.5; printf(No.:%ldn”,stu_1.num); printf(name:%sn,stu_1.name); printf(sex:%cn”,stu_1.sex); printf(”score:%5.1fn”,stu_1.score); return 0;stu_110101Li LinM89.5p struct Student stu_1; struct Student * p; p=&stu_1; stu_1.num=10101; strcpy(stu_1.name,“Li Lin”); stu_1.sex=M; stu_1.score=89.5; printf

19、(No.:%ldn”,stu_1.num); printf(name:%sn,stu_1.name); printf(sex:%cn”,stu_1.sex); printf(”score:%5.1fn”,stu_1.score); return 0;stu_110101Li LinM89.5p(*p).num(*p).name(*p).sex(*p).score说明:为了使用方便和直观,C语言允许把(*p).num用p-num来代替(*p).name等价于p-name如果p指向一个结构体变量stu,以下等价: stu.成员名(如stu.num) (*p).成员名(如(*p).num) p-成员

20、名(如p-num)9.3.2 指向结构体数组的指针 例9.6 有3个学生的信息,放在结构体数组中,要求输出全部学生的信息。解题思路:用指向结构体变量的指针处理(1)声明struct Student,并定义结构体数组、初始化(2)定义指向struct Student类型指针p(3)使p指向数组首元素,输出元素中各信息(4)使p指向下一个元素,输出元素中各信息(5)再使p指向结构体数组的下一个元素,输出它指向的元素中的有关信息#include struct Student int num; char name20; char sex; int age;struct Student stu3= 10

21、101,Li Lin,M,18, 10102,Zhang Fun,M,19, 10104,Wang Min,F,20 ;int main() struct Student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return 0;10101Li LinM1810102Zhang FangM1910104Wang MinF20stu0stu1stu2int main() struct Student *p; printf( No. Name sex agen); for(p=stu;pnum,

22、p-name, p-sex, p-age); return 0;10101Li LinM1810102Zhang FangM1910104Wang MinF20pstu0stu1stu2int main() struct Student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return 0;10101Li LinM1810102Zhang FangM1910104Wang MinF20pstu0stu1stu2int main() struct Student *p; printf( No

23、. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return 0;10101Li LinM1810102Zhang FangM1910104Wang MinF20pstu0stu1stu29.3.3 用结构体变量和结构体变量的指针作函数参数将一个结构体变量的值传递给另一个函数,有3个方法。(1) 用结构体变量的成员作参数。 例如,用stu1.num或作函数实参,将实参值传给形参。用法和用普通变量作实参是一样的,属于“值传递”方式。应当注意实参与形参的类型保持一致。(2) 用结构体变量作实参。用结构体变量作实参时

24、,将结构体变量所占的内存单元的内容全部按顺序传递给形参,形参也必须是同类型的结构体变量在函数调用期间形参也要占用内存单元。这种传递方式在空间和时间上开销较大在被调用函数期间改变形参(也是结构体变量)的值,不能返回主调函数一般较少用这种方法(3)用指向结构体变量(或数组元素)的指针作实参,将结构体变量(或数组元素)的地址传给形参。 例9.7 有n个结构体变量,内含学生学号、姓名和3门课程的成绩。要求输出平均成绩最高的学生的信息(包括学号、姓名、3门课程成绩和平均成绩)。解题思路:将n个学生的数据表示为结构体数组。按照功能函数化的思想,分别用3个函数来实现不同的功能:用input函数输入数据和求各

25、学生平均成绩用max函数找平均成绩最高的学生用print函数输出成绩最高学生的信息在主函数中先后调用这3个函数,用指向结构体变量的指针作实参。最后得到结果。本程序假设n=3#include #define N 3struct Student int num; char name20; float score3; float aver; ;4个成员输入前3个成员值计算最后成员值int main() void input(struct Student stu); struct Student max(struct Student stu); void print(struct Student st

26、u); struct Student stuN,*p=stu; input(p); print(max(p); return 0;void input(struct Student stu) int i; printf(请输入各学生的信息: 学号、姓名、三门课成绩:n); for(i=0;iN;i+) scanf(%d %s %f %f %f, &stui.num,, &stui.score0,&stui.score1, &stui.score2); stui.aver=(stui.score0+ stui.score1+stui.score2)/3.0; 输入第1个成员值输

27、入第2个成员值输入第3个成员值计算第4个成员值stu0stu1stu2stu10101Li78 89 9888.33i=0void input(struct Student stu) int i; printf(请输入各学生的信息: 学号、姓名、三门课成绩:n); for(i=0;iN;i+) scanf(%d %s %f %f %f, &stui.num,, &stui.score0,&stui.score1, &stui.score2); stui.aver=(stui.score0+ stui.score1+stui.score2)/3.0; 输入第1个成员值输入第2个

28、成员值输入第3个成员值计算第4个成员值stu0stu1stu2stu10101Li78 89 9888.3310103Wang98.5 87 6984.83i=1void input(struct Student stu) int i; printf(请输入各学生的信息: 学号、姓名、三门课成绩:n); for(i=0;iN;i+) scanf(%d %s %f %f %f, &stui.num,, &stui.score0,&stui.score1, &stui.score2); stui.aver=(stui.score0+ stui.score1+stui.score2

29、)/3.0; 输入第1个成员值输入第2个成员值输入第3个成员值计算第4个成员值stu0stu1stu2stu10101Li78 89 9888.3310103Wang98.5 87 6984.8310106Sun 88 76.5 8984.5i=2struct Student max(struct Student stu) int i,m=0; for(i=0;istum.aver) m=i; return stum; stu0stu1stu2stu10101Li78 89 9888.3310103Wang98.5 87 6984.8310106Sun 88 76.5 8984.5最大返回vo

30、id print(struct Student stud) printf(n成绩最高的学生是:n);printf(学号:%dn姓名:%sn 三门课成绩:%5.1f,%5.1f,%5.1fn 平均成绩:%6.2fn”, stud.num, ,stud.score0, stud.score1,stud.score2,stud.aver); stud10101Li78 89 9888.3310103Wang98.5 87 6984.8310106Sun 88 76.5 8984.5numnamescoreaverstu0stu1stu2以上3个函数的调用,情况各不相同:调用input函数时,实参是指针变量,形参是结构体数组,传递的是结构体元素的地址,函数无返回值。调用max函数时,实参是指针变量,形参是结构体数组,传递的是结构体元素的地址,函数的返回值是结构体类型数据。调用print函数时,

温馨提示

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

评论

0/150

提交评论