expe_9-1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
常熟理工学院
《C语言程序设计》实验指导与报告书
______学年第____ 学期
专业: ___________________________________________ 学号: ___________________________________________ 姓名: ___________________________________________ 实验地点:___________________________________________ 指导教师:___________________________________________
计算机科学与工程学院
2014
实验12 结构程序设计
12.1 实验目的
1.理解结构的概念,掌握结构的定义、初始化与使用方法。
2.掌握结构数组、结构指针的程序设计方法。
12.2 示例程序
【实验12.1】编写程序,建立5个学生的结构记录,包括学号、姓名、成绩,输出平均成绩。
程序代码:
struct student /* 定义学生信息结构*/
{ int num;
char name[20];
int score;
};
#include<stdio.h>
int main()
{ int i; double sum=0;
struct student s[5]; /* 定义结构数组,用于存放5个学生的信息*/
printf("Input 5 student’s information:\n");
for(i=1;i<6;i++)
{ scanf("%d%s%d", &s[i].num, s[i].name, &s[i].score); /* 输入学生信息*/
sum+=s[i].score; /* 求总分*/
}
printf("The average score is %f.\n",sum/5);
return 0;
}
说明:
1.程序中首先定义学生信息结构。
2.定义一个结构数组s,每输入一名学生信息,将其分数进行累加,循环结束,输出平均值。
12.3 阅读程序
【实验12.2】本程序建立一个通讯录结构,包括姓名、生日、电话号码和地址,调用函数,使记录按生日降序排列。
程序代码:
struct address /* 定义通讯录结构*/
{ char name[20];
int year,month,date;
char tel[12];
char addr[40];
}
sort(struct address book[],int n) /* 记录按降序排序*/
{ int i,j,k;
struct address temp;
for(i=0;i<n-1;i++)
{ k=i;
for(j=i+1;j<n;j++)
{ if(book[j].year>book[k].year) k=j; /* 比较年份*/
if(book[j].year==book[k].year && book[j].month>book[k].month)
k=j; /* 年份相同,比较月份*/
if(book[j].year==book[k].year && book[j].month==book[k].month &&
book[j].date>book[k].date) k=j; /* 年份、月相同,比较日期*/ }
if(k!=i)
{ temp=book[i];
book[i]=book[k];
book[k]=temp;}
}
for(i=0;i<n;i++)
{ printf("%d\n",i+1);
printf("Name:%s\n",book[i].name);
printf("Birthday:%d-%d-%d\n",book[i].year,book[i].month,book[i].date);
printf("Tel:%s\n",book[i].tel);
printf("Address:%s\n\n",book[i].addr);
}
}
#include<stdio.h>
int main()
{ int i,n;
struct address b[100];
printf("Input n:"); scanf("%d",&n);
printf("Input information\n");
for(i=0;i<n;i++)
scanf("%s%d%d%d%s%s",b[i].name,&b[i].year,&b[i].month,&b[i].date,&b[i].tel,b[i].addr);
sort(b,n);
return 0;
}
说明:
1.程序中首先定义一个通讯录结构。
2.定义一个结构数组b,输入每一位学生的信息后,调用sort()函数,按照出生日期进行排序并输出。
12.4 完善程序
【实验12.3】本程序的功能是:在不改变a 数组中数据存储位置的前提下,按a 数组第一列元素的值从大到小依次输出a 数组的各行元素。
请完善程序。
例如:
a 数组中元素的值: 程序输出结果:
⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡3129
47
192421221132121518 ⎥⎥⎥⎥⎦
⎤⎢⎢⎢⎢⎣⎡1215
18
192421221132312947 程序代码:
#include <stdio.h> struct data{int x, *y;};
/* 定义一个结构 */
int main()
{ int a[][3]={{18,15,12},{32, 11, 22}, {21, 24, 19}, {47, 29, 31}}, i, j, k, *p;
struct data stru[4]={0}, t;
/* 定义结构数组stru */
printf("Before sorting:\n"); for(i=0; i<4; i++)
/* 输出排序前的数组 */
{
for(j=0;j<3;j++)
printf("%3d",a[i][j]); printf("\n"); }
for(i=0; i<4; i++) { stru[i].y=a[i]; /* 结构数组的y 成员指向数组的每一行 */ stru[i].x=________; }
/* x 成员的值为每一行第1个元素值 */ for(i=0;i<3; i++)
/* 排序 */
{ k=i;
for(j=i+1; j<4; j++)
if(________)k=j;
/* 按x 成员的值进行比较 */
if(k!=i) { t=stru[i]; stru[i]=stru[k]; stru[k]=t;}
/* 交换行 */
}
printf("After sorting:"); for(i=0; i<4; i++) { p=stru[i].y;
________; for(j=0; j<3; j++)
printf("%3d",*(p+j));
} return 0; }
说明:
1.程序中了定义一个结构,包含两个成员。
然后定义一个结构数组,其数据域成员为每行第一个元素的值,指针域成员指向不同的行。
2.按照数据域成员的值进行排序,交换时交换整行。
12.5 改错程序
【实验12.4】本程序的功能是:输入10个学生的学号、姓名和成绩,输出学生的成绩等级和不及格人数。
每个学生的记录包括学号、姓名、成绩和等级,要求定义和调用函数set_grade(),根据学生成绩设置其等级,并统计不及格人数,等级设置:85~100为A,70~84为B,60~69为C,0~59为D。
请改正程序中的错误,并调试。
注意:改错时不允许增加及删除语句,只允许修改或移动语句的位置。
【含有错误的程序代码】
#include<stdio.h>
#define N 10
struct student{ int num; char name[20]; int score; char grade;};
int set_grade(struct student *p);
int main(void)
{ struct stu[N], *ptr;
int i, count;
ptr = stu;
printf("Input the student's number, name and score: \n");
for(i = 0; i < N; i++)
{ printf("No %d: ", i+1); /* 提示输入第i个同学的信息*/ scanf("%d%s%d", stu[i].num, stu[i].name, stu[i].score);
}
count = set_grade(ptr);
printf("The count (<60): %d\n", count);
printf("The student grade:\n");
for(i = 0; i < N; i++)
printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade);
return 0;
}
int set_grade(struct student p)
{ int i, n = 0;
for(i = 0; i < N; i++, p++)
{ if(p->score >= 85)
p->grade = 'A';
else if(p->score >= 70)
p->grade = 'B';
else if(p->score >= 60)
p->grade = 'C';
else
{ p->grade = 'D'; n++; }
}
return n;
}
12.6 自己练习
1.有三名学生参加了3门课的考试,其数据如下:
106, "zhang", 89, 96, 88
107, "wang", 79, 86, 91
109, "zhao", 78, 65, 67
要求编写程序根据每位同学的总成绩判断其是否通过考试(总成绩大于等于240的为通过)。
2.统计候选人选票。
设有三个候选人,每次输入一个得票的候选人的名字,要求最后输出三个候选人的得票结果。