视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
C语言程序设计(第3版)何钦铭 颜 晖 第9章 结构
2025-09-30 22:56:06 责编:小OO
文档
第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", &n);

    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:",i);     scanf("%d%s%d%d%d",&s1.num,s1.name,&s1.math,&s1.english,&s1.computer);

        math_sum+=s1.math;

        english_sum+=s1.english;

        computer_sum+=s1.computer;

    }

    printf("math_ave:%.2lf\\nenglish_ave:%.2lf\\ncomputer_ave:%.2lf\\n",math_sum/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, "张一",69,75,84  },{30132, "李二",80,85,90},{40231, "王三",71,91,74},{40754, "赵四",65,76,87},{50426, "刘五",81,92,73}};

【练习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",&n);

       for(i=0;i              printf("Input the info of No.%d:\\n",i+1);

              printf("number:");

              scanf("%d",&students[i].num);

              printf("name:");

              scanf("%s",&students[i].name);

              printf("math score:");

              scanf("%d",&students[i].math);

              printf("english score:");

              scanf("%d",&students[i].english);

              printf("computer score:");

              scanf("%d",&students[i].computer);

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

       }

       max=min=0;

       for(i=1;i             if(students[max].average             if(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",students[max].num,students[max].name,students[max].math,students[max].english,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",students[min].num,students[min].name,students[min].math,students[min].english, 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;i        if(s[i].num==num)

            break;

if(i        switch(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", sum/10);

return 0;

}

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

#include

struct {  

int hour, minute, second;

} time;

int main(void)

{    

scanf("%d: %d: %d",_&time.hour, &time.minute, &time.second_);

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", time.hour, time.minute, time.second );

     

        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", x.a, x.c, (*px).b, px->c );

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",&tim.hour,&tim.minute,&tim.second);

       printf("Enter seconds:");

       scanf("%d",&n);

       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",tim.hour,tim.minute,tim.second);

    

       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",a.real,a.im,b.real,b.im,c.real,c.im);

      

     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",&v1.x,&v1.y);

       printf("x2 and y2:");

       scanf("%f%f",&v2.x,&v2.y);

       v=vec(v1,v2);

       printf("v=(%f,%f)",v.x,v.y);

    

       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;i        scanf("%s%f",test[i].name,&test[i].price);

    maxl=minl=0;

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

    }

    printf("Max Price:%f,%s\\n", test[maxl].price,test[maxl].name);

    printf("Min Price:%f,%s\\n", test[minl].price,test[minl].name);

    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",&n);

       printf("Input %d friends' name ,birthday and phone:",n);

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

    sort(friends,n); 

       for(i=0;iprintf("%s%d/%d/%d%s\\n",friends[i].name,friends[i].birthday.year,friends[i].birthday.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;i           index=i; 

          for(j=i+1;j              if(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;i        printf("No.%d:",i+1);

scanf("%d%s%d",&student[i].num,student[i].name,&student[i].score);

    } 

    count=set_grade(student);

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

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

for(i=0;iprintf("%d %s %c\\n",student[i].num,student[i].name,student[i].grade);

        

    return 0;

}

int set_grade(struct students *p)

{

     int i,n=0;

        

for(i=0;i if(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;

下载本文

显示全文
专题