您好,欢迎来到欧得旅游网。
搜索
您的当前位置:首页C语言程序设计(第3版)何钦铭 颜 晖 第9章 结构

C语言程序设计(第3版)何钦铭 颜 晖 第9章 结构

来源:欧得旅游网


第9章 结构

【练习9-1】定义一个能够表示复数的结构类型,一个复数包括实数与虚数两个部分。

解答:

struct complex{

float real;

float imaginary;

};

【练习9-2】人的出生日期由年、月、日组成,请在例 9-1 中的通讯录结构中增加一个成员:出生日期,用嵌套定义的方式重新定义该结构类型。

解答:

struct date{

int year;

int month;

int day;

};

struct student{

int num;

char name[10];

struct date birthday;

int computer,english,math;

double average;

};

【练习9-3】例 9-1 中,如果要计算的是三门课程的课程平均成绩,应该如何改写程序?

解答:

#include

struct student{

int num;

char name[10];

int computer,english,math;

double average;

};

int main(void)

{

int i, n;

double math_sum,english_sum,computer_sum;

struct student s1;

printf(\"Input n:\");

scanf(\"%d\

printf(\"Input the student's number, name and course scores:\\n\");

math_sum=english_sum=computer_sum=0;

for(i=1;i<=n;i++){

printf(\"No.%d:\

scanf(\"%d%s%d%d%d\

math_sum+=s1.math;

english_sum+=s1.english;

computer_sum+=s1.computer;

}

printf(\"math_ave:%.2lf\\nenglish_ave:%.2lf\\ncomputer_ave:%.2lf\\n\n,english_sum/n,computer_sum/n);

return 0;

}

【练习9-4】定义一个包含 5 名学生信息的结构数组,并对该结构数组的所有元素进行初始化。

解答:

struct student{

int num;

char name[10];

int computer, english, math;

};

struct student s[5]={{30101, \"张一\ },{30132, \"李二\231, \"王三\\"赵四\\"刘五\

【练习9-5】参考例 9-2,输入并保存 10 个学生的成绩信息,分别输出平均成绩最高和最低的学生信息。

解答:

#include

struct student{

int num;

char name[10];

int computer,english,math;

double average;

};

int main(void)

{

int i,n,max,min;

struct student students[50];

printf(\"Input n:\");

scanf(\"%d\

for(i=0;iprintf(\"Input the info of No.%d:\\n\

printf(\"number:\");

scanf(\"%d\

printf(\"name:\");

scanf(\"%s\

printf(\"math score:\");

scanf(\"%d\

printf(\"english score:\");

scanf(\"%d\

printf(\"computer score:\");

scanf(\"%d\

students[i].average=(students[i].math+students[i].english+students[i].computer)/3.0;

}

max=min=0;

for(i=1;iif(students[max].averageif(students[min].average>students[i].average) min=i;

}

printf(\"max_average_infortmation:\\n\");

printf(\"number:%d,name:%s,math:%d,english:%d,computer:%d,average:%.2lf\\n\lish,students[max].computer,students[max].average);

printf(\"min_average_information:\\n\");

printf(\"number:%d,name:%s,math:%d,english:%d,computer:%d,average:%.2lf\\n\sh, students[min].computer, students[min].average);

return 0;

}

【练习9-6】定义一个 struct student 类型的结构指针,用其实现一个学生信息的输入和输出。

解答:

struct student{ /* 学生信息结构定义 */

int num; /* 学号 */

char name[10]; /* 姓名 */

int computer, english, math ; /* 三门课程成绩 */

double average; /* 个人平均成绩 */

}s, *p;

p = &s;

scanf(\"%d%s%d%d%d\&p->num, p->name, &p->math, &p->english, &p->computer);

【练习9-7】改写例 9-3 中的函数 update_score( ),将第一个形参改为结构数组形式。

解答:

int update_score(struct student s[],int n,int num,int course,int score)

{

int i,pos;

for(i=0;iif(s[i].num==num)

break;

if(iswitch(course){

case 1:s[i].math=score; break;

case 2:s[i].english=score; break;

case 3:s[i].computer=score; break;

}

pos = i;

}

else

pos = -1;

return pos;

}

习题9

一、选择题

1.下面定义结构变量的语句中错误的是 D 。

A.struct student{ int num; char name[20]; } s;

B.struct { int num; char name[20]; } s;

C.struct student{ int num; char name[20]; }; struct student s;

D.struct student{ int num; char name[20]; }; student s;

2.如果有定义语句:

struct {

int x, y; } s[2] = { { 1, 3 }, { 2, 7 } };

则语句:printf(“%d\\n”, s[0].y/s[1].x ); 输出结果为 B 。

A.0 B.1 C.2 D.3

3.根据下面的定义,能打印出字母 M 的语句是 C 。

struct person{

char name[10];

int age;

} c[10] = { “John”, 17, “Paul”, 19, “Mary”, 18, “Adam”, 16 };

A.printf(“%c”, c[3].name); B.printf(“%c”, c[3].name[1]);

C.printf(“%c”, c[2].name[0]); D.printf(“%c”, c[2].name[1]);

4.设有如下定义,则对 data 中的 a 成员的正确引用是 B 。

struct sk{ int a; float b; } data, *p=&data;

A.(*p).data.a B.(*p).a

C.p->data.a D.p.data.a

5.对于以下结构定义,(*p)->str++中的++加在 D 。

struct { int len; char *str; } *p;

A.指针 str 上 B.指针 p 上

C.str 指向的内容上 D.语法错误

二、填空题

1.“.”称为 成员_(分量)_运算符,“->”称为_指向_运算符。

2.完成下列程序,该程序计算 10 名学生的平均成绩。

#include

#include

struct student {

int num;

char name[20];

int score;

};

struct student stud[10];

int main(void)

{

int i , sum = 0 ;

for(i = 0; i < 10; i++){

scanf(\"%d%s%d \&stud[i].num,_stud[i].name_,&stud[i].score);

sum += stud[i].score;

}

printf(\"aver = %d \\n\

return 0;

}

3.下列程序读入时间数值,将其加 1 秒后输出,时间格式为:hh: mm: ss,即小时:分钟:秒,当小时等于 24 小时,置为 0。

#include

struct {

int hour, minute, second;

} time;

int main(void)

{

scanf(\"%d: %d: %d\

time.second++;

if( _time.second_ == 60){

_time.minute++ _;

time.second = 0;

if(time.minute == 60){

time.hour++;

time.minute = 0;

if( _time.hour == 24_ )

time.hour = 0;

}

}

printf (\"%d: %d: %d \\n\

return 0;

}

4.写出下面程序的运行结果 1 2 A B 。

struct s1{

char c1, c2;

int n;

};

struct s2{

int n;

struct s1 m;

} m = {1, {‘A’, ’B’, 2} };

int main(void)

{

printf(“%d\%d\%c\%c\\n”, m.n, m.m.n, m.m.c1, m.m.c2);

return 0;

}

5.写出下面程序的运行结果 23, wang, 98.5, wang 。

struct abc{

int a;

float b;

char *c; };

int main(void)

{

struct abc x = {23,98.5,\"wang\

struct abc *px = &x;

printf(\"%d, %s, %.1f, %s \\n\

return 0;

}

三、程序设计题

1. 时间换算:用结构类型表示时间内容(时间以时、分、秒表示),输入一个时间数值,再输入一个秒数n(n<60),以h:m:s的格式输出该时间再过n秒后的时间值(超过24点就从0开始计时)。试编写相应程序。

解答:

#include

struct time{

int hour;

int minute;

int second;

};

int main(void)

{

int n;

struct time tim;

printf(\"Enter time:\");

scanf(\"%d%d%d\

printf(\"Enter seconds:\");

scanf(\"%d\

tim.hour=(tim.hour*60*60+tim.minute*60+tim.second+n)/3600%24;

tim.minute=(tim.minute*60+tim.second+n)/60%60;

tim.second=(n+tim.second)%60;

printf(\"%d:%d:%d\

return 0;

}

2. 计算两个复数之积:编写程序,利用结构变量求解两个复数之积: (3+4i) × (5+6i)。

提示:求解(a1+a2i)×(b1+b2i),乘积的实部为:a1×b1 - a2×b2,虚部为:a1×b2 + a2×b1。

解答:

#include

struct complex{

int real,im;

};

struct complex cmult(struct complex a,struct complex b);

int main(void)

{

struct complex a={3,4},b={5,6},c;

c=cmult(a,b);

printf(\"(%d+%di)(%d+%di)=%d+%di\\n\

return 0;

}

struct complex cmult(struct complex a,struct complex b)

{

struct complex c;

c.real=a.real*b.real-a.im*b.im;

c.im=a.real*b.im+a.im*b.real;

return c;

}

3. 平面向量加法:输入两个二维平面向量V1=(x1,y1)和V2=(x2,y2)的分量,计算并输出两个向量的和向量。试编写相应程序。

解答:

#include

struct vector{

float x,y;

};

struct vector vec(struct vector v1,struct vector v2);

int main(void)

{

struct vector v1,v2,v;

printf(\"x1 and y1:\");

scanf(\"%f%f\

printf(\"x2 and y2:\");

scanf(\"%f%f\

v=vec(v1,v2);

printf(\"v=(%f,%f)\

return 0;

}

struct vector vec(struct vector v1,struct vector v2)

{

struct vector v;

v.x=v1.x+v2.x;

v.y=v1.y+v2.y;

return v;

}

4. 查找书籍:从键盘输入 10 本书的名称和定价并存入结构数组中,从中查找定价最高和最低的书的名称和定价,并输出。试编写相应程序。

解答:

#include

#define NUMBER 10

struct book{

char name[10];

float price;

};

int main(void)

{

int i,maxl,minl,n;

struct book test[NUMBER];

for(i=0;iscanf(\"%s%f\

maxl=minl=0;

for(i=1;iif(test[maxl].priceif(test[minl].price>test[i].price) minl=i;

}

printf(\"Max Price:%f,%s\\n\

printf(\"Min Price:%f,%s\\n\

return 0;

}

5.通讯录排序:建立一个通讯录,通讯录的结构包括:姓名、生日、电话号码;其中生日又包括三项:年、月、日。编写程序,定一个嵌套的结构类型,输入 n(n≤10)个联系人信息,再按照他们的年龄从大到小依次输出其信息。试编写相应程序。

解答:

#include

struct date{

int year;

int month;

int day;

};

struct friends_list{

char name[10];

struct date birthday;

char phone[15];

};

void sort(struct friends_list s[],int n);

int main(void)

{

int i,n;

struct friends_list friends[10];

printf(\"Input n:\");

scanf(\"%d\

printf(\"Input %d friends' name ,birthday and phone:\

for(i=0;iscanf(\"%s%d%d%d%shday.month,&friends[i].birthday.day,&friends[i].phone);

sort(friends,n);

for(i=0;iprintf(\"%s%d/%d/%d%s\\n\rthday.month,friends[i].birthday.day,friends[i].phone);

return 0;

}

void sort(struct friends_list s[],int n)

{

int i,j,index;

struct friends_list temp;

for(i=0;iindex=i;

for(j=i+1;jif(s[index].birthday.year>s[j].birthday.year)

index=j;

else if((s[index].birthday.year==s[j].birthday.year)

&&(s[index].birthday.month>s[j].birthday.month))

index=j;

else if((s[index].birthday.year==s[j].birthday.year)

&&(s[index].birthday.month==s[j].birthday.month)&&(s[index].birthday.day>s[j].birthday.day)){

index=j;

temp=s[i];

s[i]=s[index];

s[index]=temp;

}

}

}

6.按等级统计学生成绩:输入 10 个学生的学号、姓名和成绩,输出学生的成绩等级和不及格人数。每个学生的记录包括学号、姓名、成绩和等级,要求定义和调用函数 set_grade()根据学生成绩设置其等级,并统计不及格人数,等级设置:85-100 为 A,

70-84 为 B,60-69 为 C,0-59 为 D。试编写相应程序。

解答:

#include

#define N 10

struct students{

int num;

char name[20];

int score;

char grade;

};

int set_grade(struct students *p);

int main(void)

{

struct students student[N];

int i,count;

printf(\"Input 10 students' number,name and score: \\n\");

for(i=0;iprintf(\"No.%d:\

scanf(\"%d%s%d\

}

count=set_grade(student);

printf(\"The count (<60): %d\\n\

printf(\"The student grade:\\n\");

for(i=0;iprintf(\"%d %s %c\\n\

return 0;

}

int set_grade(struct students *p)

{

int i,n=0;

for(i=0;iif(p->score>=85)

p->grade='A';

else if(p->score>=70&&p->score<85)

p->grade='B';

else if(p->score>=60&&p->score<70)

p->grade='C';

else{

p->grade='D';

n++;

}

}

return n;

}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- ovod.cn 版权所有 湘ICP备2023023988号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务