资源描述
计算机综合训练实验指导书综合训练一 结构体及结构体数组一、实验学时 6学时二、实验目的1掌握结构体类型变量和结构体数组的定义和初始化;2掌握结构体数组的输入和输出;3掌握在相关算法中结构体数组的应用。 三、实验内容1. 在解决实际问题时,单独用单个的结构体类型变量的很少,一般是以结构体类型数组的形式出现,结构体数组就是具有相同结构类型的变量集合。例如:若将一个班级20个同学的姓名、性别、学号和三科考试成绩进行定义, 可以定义成一个结构体数组。如下所示: struct / *定义学生结构体类型* /char name20; / *学生姓名* /char sex; / *性别* /long num; / *学号* /float score3; / *三科考试成绩* / stud20; /*定义结构体类型数组stud,数组有2 0个结构体类型元素*/ 也可定义为: struct stu / *定义学生结构体类型* /char name20; / *学生姓名* /char sex; / *性别* /long num; / *学号* /float score3; / *三科考试成绩* /;struct stu stud20; /*定义结构体类型数组,有2 0个结构体类型元素*/结构体数组成员的访问形式为: 结构数组元素.成员名其数组元素各成员的引用形式为:stud0.name、stud0.sex、stud0.scorei;stud1.name、stud1.sex、stud1.scorei;.stud19.name、stud19.sex、stud19.scorei; 2下面的程序在结构体数组worker中存放5个工人的数据包括编号、姓名、年龄、工资,注意观察数据的输入和输出方法。struct work /*职工基本情况*/ char num10; /*工号*/ char name10; /*姓名*/ int age; /*年龄*/ int salary; /*工资*/ worker5; main( ) int i;for(i=0;i5;i+) scanf(%s%s,workeri.num,workeri.name); /*输入工号和姓名*/ scanf(%d%d,&workeri.age,&workeri.salary); /*输入年龄和工资*/for(i=0;i5;i+) printf(%st%st%dt%dn,workeri.num,workeri.name,workeri.age,workeri.salary); 3下面的程序在结构体数组worker中存放5个工人的编号和姓名,用gets和puts函数,注意观察数据的输入和输出方法:#include “stdio.h”struct work char num10; char name10; ;main() int i; struct work worker5; for(i=0;i5;i+) gets(workeri.num ); /*输入工号*/ gets(workeri.name); /*输入姓名*/ for(i=0;i5;i+) puts(workeri.num );printf( ); /*输出工号*/ puts(workeri.name);printf(n); /*输出姓名*/ 4若有一个可以包含20个学生的信息的结构体数组,结构体成员有学号、姓名、语文、数学、英语和平均分,编程实现对于这20个学生的结构体数组的输入和输出及求出每个学生的平均分,参考程序如下。#include struct student /*定义学生结构体类型*/int no; / *学号* /char name20; / *学生姓名* / int chinese; /*语文成绩*/ int maths; /*数学成绩*/ int english; /*英语成绩*/ float ave; /*平均成绩*/stu20; /*定义结构体类型数组,有2 0个结构体类型元素*/main( ) int i,length=0,n; printf(Input the number of student:); scanf(%d,&n); /*输入实际学生人数*/ for(i=length;ilength+n;i+) printf(the %d students no: ,i+1); scanf(%d,&stui.no); /*输入学号* / printf(the %d stdents name: ,i+1); scanf(%s,stui.name); /*输入学生姓名* / printf(the %d stdents chinese: ,i+1); scanf(%d,&stui.chinese); /*输入语文成绩*/ printf(the %d stdents maths: ,i+1); scanf(%d,&stui.maths); /*输入数学成绩*/ printf(the %d stdents english: ,i+1); scanf(%d,&stui.english); /*输入英语成绩*/ stui.ave=(stui.chinese+stui.maths+stui.english)/3.0;/*计算每个学生的平均成绩*/ printf(n); length=length+n;printf(tNotNametChinesetMathstEnglishtAveagenn); for(i=0;ilength;i+) printf(%8d%10s%8d%8d%8d%8.1fn,stui.no,stui.name,stui.chinese,stui.maths,stui.english,stui.ave); /*输出学生信息*/ 5 某企业四名职工信息的输入和输出,参考程序如下。main( ) struct employee /*职工基本情况*/ int num; /*工号*/char name8; /*姓名*/ int age; /*年龄*/int salary; /*工资*/em4;int i;for(i=0;i4;i+) scanf(%d,&emi.num); /*输入工号*/scanf(%s,emi.name); /*输入姓名*/scanf(%d,&emi.age); /*输入年龄*/scanf(%d,&emi.salary); /*输入工资*/for(i=0;i4;i+) printf (%d ,emi.num); /*输出工号*/printf(%s ,emi.name); /*输出姓名*/printf(%d ,emi.age); /*输出年龄*/printf(%d ,emi.salary); /*输出工资*/printf(n); 6. 求某企业四名职工工资的平均值main( ) struct employee /*职工基本情况*/ int num; /*工号*/char name8; /*姓名*/ int age; /*年龄*/int salary; /*工资*/em4=1,wang,25,450,1,li,38,890,3,qi,30,234,4,jiang,54,759;float s=0,aver; int i;for(i=0;i4;i+)s+=emi.salary;aver=s/4.0;printf(%fn , aver); /*输出平均工资*/7. 找出企业四名职工工资的最高者及他的全部信息。main( ) struct employee /*职工基本情况*/ int num; /*工号*/char name8; /*姓名*/ int age; /*年龄*/int salary; /*工资*/em4=1,wang,25,450,1,li,38,890,3,qi,30,890,4,jiang,54,759;int i,max=em0.salary;for(i=0;imax) max=emi.salary;printf(%dn ,max);for(i=0;i4;i+)if (emi.salary=max) printf (%d ,emi.num); /*输出工号*/printf(%s ,emi.name); /*输出姓名*/printf(%d ,emi.age); /*输出年龄*/printf(%d ,emi.salary); /*输出工资*/printf(n);8查找某企业职工中年龄大于35岁的职工并显示他们的全部信息。main( ) struct employee /*职工基本情况*/ int num; /*工号*/char name8; /*姓名*/ int age; /*年龄*/int salary; /*工资*/em4=1,wang,25,450,1,li,38,890,3,qi,30,234,4,jiang,54,759;int i;for (i=0;i35) printf (%d ,emi.num); /*输出工号*/printf(%s ,emi.name); /*输出姓名*/printf(%d ,emi.age); /*输出年龄*/printf(%d ,emi.salary); /*输出工资*/printf(n);9. 将某企业职工的信息按工资从多到少进行排序。main() struct employee /*职工基本情况*/ int num; /*工号*/char name8; /*姓名*/ int age; /*年龄*/int salary; /*工资*/em4=1,wang,25,450,2,li,38,890,3,qi,30,234,4,jiang,54,759;int i,j,x,y,t; char ch8;for(i=0;i4-1;i+ )for(j=0;j4-1-i;j+ )if (emj.salaryemj+1.salary) t=emj.num; /*交换工号*/ emj.num=emj+1.num; emj+1.num=t; strcpy(ch,emj.name); /*交换姓名*/strcpy(emj.name,emj+1.name); strcpy(emj+1.name,ch); t=emj.age; /*交换年龄*/ emj.age =emj+1.age; emj+1.age =t;t=emj.salary; /*交换工资*/ emj.salary =emj+1.salary; emj+1.salary =t;for(i=0;i4;i+) printf (%d ,emi.num); /*输出工号*/printf(%s ,emi.name); /*输出姓名*/printf(%d ,emi.age); /*输出年龄*/printf(%d ,emi.salary); /*输出工资*/printf(n);四、实验注意事项1结构体中各成员是被分别分配独立的存储单元,。2不可以用scanf( )函数对结构体进行整体赋值,只能通过对成员的赋值来改变结构体变量的值。综合训练二 文件的基本操作一、 实验学时 6学时二、实验目的1掌握文件打开、关闭、读写等操作函数的使用方法。2掌握包含文件操作的程序设计和调试方法。三、实验内容1. 建立文件data.tat,从键盘上向data1.dat文件写入10个实型数据,同时在显示器上输出(使用fscanf和fprintf函数实现)。编程提示:(1)使用文件的打开、关闭、写入等函数;(2)首先打开文件,然后写入10个数,最后关闭文件。程序如下:#include main() FILE *fp; /* 定义一个文件指针变量fp */int i;float x;fp=fopen(data1.dat,w); /* 创建文件时,以写方式打开文本文件 */for(i=1;i=10;i+) scanf(%f,&x); /*将数据读入x*/ fprintf(fp,%fn,x); /* 将数据输出到文件data中,即写到data中 */printf(%fn,x); /*将数据输出到屏幕上,以察看文件内容是否与之前的输入一致*/fclose(fp); /* 读文件结束,关闭文件 */说明:格式化读写函数fscanf、fprintf函数与前面使用的scanf和printf 函数的功能相似,都是格式化读写函数。 两者的区别在于 fscanf 函数和fprintf函数的读写对象不是键盘和显示器,而是磁盘文件。这两个函数的调用格式为: fscanf(文件指针,格式字符串,输入表列); fprintf(文件指针,格式字符串,输出表列); 例如: fscanf(fp,%d%s,&i,s); fprintf(fp,%d%c,j,ch);2. 从键盘上输入10个整数,并写入到一磁盘文件中,然后再读取输出(使用fread和fwrie函数实现)。程序如下:#include stdio.hmain( ) FILE *fp; int i,j,k; int a10,b10; char filename20; printf(Enter the file name:); gets(filename); /*输入要建立的磁盘文件名*/ fp=fopen(filename,wb); /*以二进制写方式建立磁盘文件*/ for(i=0;i10;i+) scanf(%d,&ai); /*从键盘输入整数,读入到内存*/ fwrite(a+i,sizeof(int),1,fp); /*从内存中写到磁盘上*/ fclose(fp); /*关闭文件*/ fp=fopen(filename,rb); /*以二进制只读方式打开磁盘文件*/ for(i=0;i10;i+) fread(b+i,sizeof(int),1,fp); /*从磁盘上读入内存*/ printf(%6d,bi); /*在显示器上输出显示*/ printf(n); fclose(fp); /*关闭文件*/说明:该程序中使用了fread函数和fwrite函数用来读写一组数据,要注意这两个函数的各个参数项的含义。本程序中fwrite(a+i,sizeof(int),1,fp)的第一个参数a+i用来代表从内存中向文件输出的数据的首地址,第二个参数sizeof(int)用来表示每次读取的字节数,由于是整数,可以用sizeof()函数返回int数据的字节数,或者直接写为2亦可.3. 建立一个磁盘文件fsin,其内容是090之间每隔5的正弦值。程序如下:#include#include#define PI 3.14159main( )FILE *fp;float S19;int i, a;if(fp=fopen(“fsin”, “wb”)=NULL) printf(“Cannot open file.n”);exit(0);for(i=0,a=-5; i19; i+)a+=5;Si=sin(a*PI/180.0);If (fwrite(S,sizeof(S), 1, fp) != 1)printf(“File error.”);fclose(fp);4把上题所建立的文件fsin的内容读出并打印。程序如下:#includemain( )FILE *fp;float S19;int i, a;if(fp=fopen(“fsin”,“rb”)=NuLL) printf(“Cannot open file.n”);exit(0);if (fread(S, sizeof(S), 1, fp) != 1)printf(“File error.”);printf(“n I sin(i) nn”);for(i=0,a=-5; i=a)&(stri=z) stri= stri-32; /*将小写字母转换成对应的大写字母*/ printf(n%sn,str); fclose(fp);说明:该程序定义了一个一维字符数组来存放输入的一行字符串,在程序中通过从键盘上输入一个字符来确定是否继续输入字符串,要注意的是程序中设置了标志变量来判定是否要继续。6. 利用fwrite与fread函数建立一个存放学生电话簿的二进制数据文件,并读取其中的数据。编程提示:电话簿为结构体类型,其中包含姓名、电话号码。先建立该文件,文件名由用户从键盘输入,读进字符数组filename中。程序如下:#include stdio.hmain( ) FILE *fp; int i; char filename40; /* filename用于存放数据文件名 */ struct tel char name20, tel9; in5, out5;clrscr( ); printf(filename: ); gets(filename); if (fp=fopen(filename,wb)=NULL) printf(Cant open the %sn,filename); exit(0); for(i=0; i5; i+) printf(name: ); gets(ini.name); printf(tel: ); gets(ini.tel); fwrite(in, sizeof(struct tel), 5, fp); /* 文件中写入5个学生的电话 */ fclose(fp); /* 建立文件结束,关闭文件 */ printf(nn outfile:n); fp=fopen(filename,rb); /* 以读方式打开二进制文件 */ fread(out,sizeof(struct tel),5,fp); /* 从文件读取5个结构体数据 */ printf(name telephonen); for(i=0; i5; i+) printf(%-20s%-8sn,outi.name,outi.tel); fclose(fp); /* 读文件结束,关闭文件 */ 7.从键盘输入两个学生数据,写入到一个磁盘文件中,再从文件中读出这两个学生的数据显示在屏幕上。程序如下:#include stdio.hstruct stu /*定义一个结构体*/ char name10; int num; int age; char addr15;s12,s22;main( ) FILE *fp; char ch; int i; if(fp=fopen(e:stu_list.dat,wb)=NULL) /*以二进制写方式建立磁盘文件*/ printf(Cannot open file strike any key exit!); exit(0); printf(ninput data:n); for(i=0;i2;i+) scanf(%s%d%d%s,s1i.name,&s1i.num,&s1i.age,s1i.addr); for(i=0;i2;i+) fwrite(&s1i,sizeof(struct stu),2,fp); /*从内存中写到磁盘上*/ fclose(fp); /*关闭文件*/ fp=fopen(e:stu_list.dat,rb); /*以二进制只读方式打开磁盘文件*/ for(i=0;i2;i+) fread(&s2i,sizeof(struct stu),2,fp); /*从磁盘上读入内存*/ printf(%st%dt%dt%st,s2i.name,s2i.num,s2i.age,s2i.addr);printf(n); fclose(fp); /*关闭文件*/说明:本例程序定义了一个结构体stu,说明了两个结构数组s1和s2。程序中以只写方式打开二进制文件“stu_list”,输入二个学生数据之后,写入该文件中,然后以只读方式打开该二进制文件,把文件内部位置指针移到文件首,读出两块学生数据后,在屏幕上显示。8. 用fscanf和fprintf函数解决上题中的问题。程序如下:#include stdio.hstruct stu char name10; int num; int age; char addr15;s12,s22;main() FILE *fp; char ch; int i; if(fp=fopen(e:stu_list.dat,wb)=NULL) printf(Cannot open file strike any key exit!); exit(0); printf(ninput data:n); for(i=0;i2;i+) scanf(%s%d%d%s,s1i.name,&s1i.num,&s1i.age,s1i.addr); for(i=0;i2;i+) fprintf(fp,%st%dt%dt%st,s1i.name,s1i.num,s1i.age,s1i.addr); fclose(fp); fp=fopen(e:stu_list.dat,rb); for(i=0;i2;i+) fscanf(fp,%s%d%d%s,s2i.name,&s2i.num,&s2i.age,s2i.addr); printf(%st%dt%dt%st,s2i.name,s2i.num,s2i.age,s2i.addr); printf(n); fclose(fp);说明:fscanf函数,fprintf函数与前面使用的scanf和printf 函数的功能相似,都是格式化读写函数。两者的区别在于fscanf函数和fprintf函数的读写对象不是键盘和显示器,而是磁盘文件。本程序中fscanf和fprintf函数每次只能读写一个结构数组元素,因此采用了循环语句来读写全部数组元素。9有5个学生有三门课的成绩,从键盘输入以上数据(包括学号、姓名、三门课的成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“stud.dat”中。程序如下:#include stdio.hstruct student char num6;char name8;int score3;float ave; stu5;main( ) int i,j,sum;FILE *fp;for(i=0;i5;i+) printf(ninput score of sudent %d:n,i+1);printf(number:);scanf(%s,stui.num);printf(name: );scanf(%s,stui.name);sum=0;for(j=0;j3;j+) printf(score %d: ,j+1);scanf(%d,&stui.scorej);sum+=stui.scorej; stui.ave=sum/3.0;fp=fopen(stu, w);for(i=0;i5;i+)if (fwrite(&stui,sizeof(struct student),1,fp)!=1)printf(File write errorn);fclose(fp);/*将文件输出到显示器上,以检查文件内容*/fp=fopen(stu, r);for(i=0;i5;i+) fread (&stui,sizeof(struct student),1,fp);printf(n%s,%s,%d,%d,%d,%6.2fn,stui.num,stui.name, stui.score0, stui.score1, stui.score2, stui.ave); 说明:数据块读写函数和语言提供了用于整块数据的读写函数和。 可用来读写一组数据,如一个数组元素,一个结构变量的值等等。读数据块函数调用的一般形式为: fread(buffer,size,count,fp); 写数据块函数调用的一般形式为: fwrite(buffer,size,count,fp); 其中buffer是一个指针,在fread函数中,它表示存放输入数据的首地址。在fwrite函数中,它表示存放输出数据的首地址。 size 表示数据块的字节数。count 表示要读写的数据块块数。fp 表示文件指针。 例如:fread(fa,4,5,fp); 其意义是从fp所指的文件中,每次读4个字节(一个实数)送入实数组fa中,连续读5次,即读5个实数到fa中。附A: 设计报告模版目 录1、综合训练概述1.1 综合训练题目以及完成的功能1.2 综合训练任务及要求2、程序实现的功能及算法描述2.1 程序实现的流程图2.2 主菜单模块2.3 录入模块2.4 显示模块2.5 查询模块2.6修改模块2.7 排序模块3、程序的调试4、综合训练总结与体会5、程序源代码1、综合训练概述1.1 综合训练题目以及完成的功能此部分针对此次选择的综合训练题目对其需要完成的功能进行详细的说明。1.2 综合训练任务及要求此部分针对综合训练的任务以及具体的要求进行详细说明2、程序实现的功能及算法描述此部分说明系统是为了实现什么功能而设计的,以及对学生基本信息存储采用的数据结构进行说明。2.1程序实现的流程图此部分要求画出整个程序的大的流程图2.2主菜单模块主要完成主界面设计,其功能是选择某一菜单项,使程序进入相应功能项执行对应的源代码。算法描述:首先用多个printf()函数完成主菜单的设计,主菜单中包括模块,然后输入某一模块前的数字,再利用switch选择结构调用各功能模块函数。此模块实现的流程图2.3录入模块录入模块主要完成数据的添加功能,通过文件形式导入数据并且可以通过键盘输入数据,其算法描述:此模块实现的流程图2.4显示模块主要完成从文件导入到内存的数据的浏览显示功能,其算法描述:通过循环语句完成所有数据的显示,要显示的记录内容通过访问结构体数组元素的成员的标记方法。此模块实现的流程图2.5查询模块该模块可以根据学生学号查询学生有关信息。此模块实现的流程图2.6修改模块该模块功能是对学生的各种信息进行修改。此模块实现的流程图2.7排序模块该模块功能是根据学号对数组排序此模块实现的流程图3、程序的调试源代码编写完毕后,在turbo2.0环境下进行了调试。调试过程中遇到了哪些问题?如何解决?4、课程设计总结与体会要求写出学生的心得体会,通过本次课程设计从中学到了什么,发现自己在哪些方面存在不足,怎样解决。5、程序源代码(注意:带注释说明)
展开阅读全文