资源描述
高级语言程序设计课程设计
题目:多重模块管理
专 业 计算机
班 级 1306班
学 生 林道松
学 号 3131903609
指导教师 鲍春波 /肖琳
起止时间 2014-2-17—2014-2-21
2014年 2月
目录
A组题目 1
系统分析 30
系统设计 30
系统实现 31
运行测试 31
心得体会 34
参考文献 34
A组题目
题目1:
写一个函数计算下列函数的值f(0),f(3),f(-3),测试之。函数如下:
解:
#include<stdio.h>
int main()
{int f(int n);
int num,result;
printf("input the x : ");
scanf("%d",&num);
result=f(num);
printf("the result is %d\n",result);
}
int f(int n)
{ int s;
if(n>0) s=3*n*n-4;
if(n==0) s=2;
if(n<0) s=0;
return s;
}
评析:这是一个简单的选择判断结构,只需将条件编写清楚即可。
题目2:
写一个函数void maxMinAver(int *data, int *max, int *min,float * ave,int size), 求一组数据的最大值、最小值和平均值,测试之。其中data指向给定数据的数组的指针,max、min、ave分别指向最大值、最小值和平均值,size是数组的大小。
要求第一个实参是数组,第2、3、4个实参都是对普通的简单变量的某种操作,最后一个实参是数组的大小。测试之
解:
#include<stdio.h>
#include<malloc.h>
void maxMinAver(int *data,int *max, int *min,float * ave,int size);
int main()
{
int n,i;
int max,min;
float ave;
int *data;
printf("please enter the numbers:\n");
scanf("%d",&n);
data=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
scanf("%d",&data[i]);
maxMinAver(data,&max,&min,&ave,n);
printf("max:%d\nmin:%d\nave:%.1f\n",max,min,ave);
return 0;
}
void maxMinAver(int *data,int *max, int *min,float * ave,int size)
{
int i,sum=0;
*max=data[0];
*min=data[0];
for(i=0;i<size;i++)
{
if(*max<=data[i])
*max=data[i];
if(*min>=data[i])
*min=data[i];
sum+=data[i];
}
*ave=(float)sum/size;
}
评析:这是一个以指针为参数的函数,用冒泡法对数组中的每一个数进行比较,这道题目的需要注意的地方就是在函数的调用需注意函数实参,以及对数组内存空间的申请。
题目3:
写一个函数用指针型字符串实现两个字符串比较,int mystrcmp(const char *str1, const char *str2),如果大于返回1,等于返回0,小于返回-1,测试之
解:
#include<stdio.h>
int mystrcmp(const char *str1, const char *str2);
int main()
{
char str1[100],str2[100];
scanf("%s %s",str1,str2);
printf("%d\n",mystrcmp(str1,str2));
return 0;
}
int mystrcmp(const char *str1, const char *str2)
{
int i;
for(i=0;*(str1+i) != '\0' && *(str2+i) !='\0';i++)
{
if(*(str1+i) > *(str2+i))
return 1;
if(*(str1+i) < *(str2+i))
return -1;
if(*(str1+i) ==*(str2+i))
return 0;
}
}
评析:这道题的比较方法是将字母一一进行对比,利用指针将字母一个个进行比较,需要注意的地方就是取*运算。
题目4:
定义一个学生结构体,取别名STU,包含学号、姓名、数学、语文、计算机、英语等 课程成绩,还有总分和平均分,写一个函数实现求一组学生每个学生各门课程的平均值,函数原型为float ave(STU stu[],int size)。测试之。
解:
#include<stdio.h>
#include<string.h>
#define SIZE 2
typedef struct student
{
int num;
char name[10];
float math;
float english;
float computer;
float chinese;
float total;
float average;
}STU;
STU stu[SIZE];
float ave(STU stu[],int size);
int main()
{
int i;
printf("please input the studet's information:\n");
for(i=0;i<SIZE;i++)
{scanf("%d %s %f %f %f %f",&stu[i].num,stu[i].name,
&stu[i].math,&stu[i].english,&stu[i].computer,&stu[i].chinese);
}
ave(stu,SIZE);
for(i=0;i<SIZE;i++)
{
printf("num:%d\nname:%s\naverage:%.2f\n\n",
stu[i].num,stu[i].name,stu[i].average);
}
return 0;
}
float ave(STU stu[],int size)
{
int i;
for(i=0;i<size;i++)
{
stu[i].total=stu[i].math+stu[i].english+stu[i].computer+stu[i].chinese;
stu[i].average=stu[i].total/4;
}
}
评析:这是一个用结构体数组进行信息保存管理的函数,需要注意到的地方是在输入信息与打印信息时要将注意结构体数组的名称
题目5 :
写一个函数能够从文件读入一组学生STU的信息,保存到一个结构体数组中。
解:
#include<stdio.h>
#include<stdlib.h>
#define SIZE 10
struct student_type
{ char name [10];
int num;
int age;
char addr[15];
}stud[SIZE];
void load();
int main ()
{ load();
return 0;
}
void load()
{ int i;
FILE*fp;
if((fp=fopen("stu.txt","r"))==NULL)
{ printf("cannot open file\n");
exit (0);
}
for(i=0;i<SIZE;i++)
{ fscanf(fp,"%s %d %d %s",&stud[i].name,
&stud[i].num,&stud[i].age,&stud[i].addr);
printf("%-10s %4d %4d %-15s\n",stud[i].name,
stud[i].num,stud[i].age,stud[i].addr);
}
fclose (fp);
}
评析:这是一个典型的从文件中输入信息保存在数组中在屏幕上打印出。需要注意的打开文件所需要的头文件以及数据输入输出的格式。
题目6 :
写一个函数能够输出某一学生结构体数组STU stu[10]的信息和每个人的总分、平均分到某一文本文件中,测试之。输出格式是:
“%s %s %d %d %d %d %d %5.2f”
解:
#include<stdio.h>
#include<stdlib.h>
#define SIZE 10
struct student_type
{
char name [10];
char addr[15];
int grade;
int num;
int height;
int age;
int score;
float ave;
}stu[SIZE];
void output();
int main ()
{
output();
return 0;
}
void output()
{
int i;
FILE*fp;
fp=fopen("printf.txt","w");
for(i=0;i<SIZE;i++)
{ scanf("%s %s %d %d %d %d %d %f",
stu[i].name,stu[i].addr,&stu[i].grade,&stu[i].num,
&stu[i].height,&stu[i].age,&stu[i].score,&stu[i].ave);
fprintf(fp,"%s %s %d %d %d %d %d %5.2f\n",
stu[i].name,stu[i].addr,stu[i].grade,stu[i].num,
stu[i].height,stu[i].age,stu[i].score,stu[i].ave);
}
}
评析:注意文件的输入及输出格式即可。
题目7:
写一个函数能够打印输出学生结构体数组STU stu[10]的信息到屏幕上,测试之
解:
#include<stdio.h>
#define SIZE 10
struct student
{
int num;
char name[10];
float score;
}stu[SIZE];
void print(struct student stu[],int size);
int main ()
{ int n;
for(n=0;n<SIZE;n++)
scanf("%d %s %f",&stu[n].num,stu[n].name,&stu[n].score);
print(stu,SIZE);
return 0;
}
void print(struct student stu[],int size)
{
int i;
for(i=0;i<size;i++)
printf("num:%d\nname:%s\nscore:%.2f\n\n",stu[i].num,stu[i].name,stu[i].score);
}
评析:注意函数的调用和输入和输出的格式。
题目8 :
写一个函数能够把一组学生成绩信息按总分进行排序,测试之。
解:
#include<stdio.h>
#define SIZE 2
struct student
{
int num;
char name[10];
float score;
}STU[SIZE];
void comp(struct student stu[]);
int main()
{
int n;
for(n=0;n<SIZE;n++)
scanf("%d %s %f",&STU[n].num,STU[n].name,&STU[n].score);
printf("The Order Is:\n");
comp(STU);
for(n=0;n<SIZE;n++)
printf("%6d%10s%8.1f\n",STU[n].num,STU[n].name,STU[n].score);
return 0;
}
void comp(struct student stu[])
{
int i,j,k,m;
for(i=0;i<SIZE-1;i++)
{k=i;
for(j=i+1;j<SIZE;j++)
if(STU[j].score>STU[k].score)
k=j;
m=STU[k].score;
STU[k].score=STU[i].score;
STU[i].score=m;
}
}
评析:应用选择法对学生信息进行比较,注意结构体数组信息的格式。
题目9 :
写一个函数能够查找给定学号的学生成绩信息,如果找到打印成绩信息,如果没有,显示“not found!”.测试之。
解:
#include<stdio.h>
struct student
{
int num;
char name[15];
int chinese;
int math;
int english;
};
void searchscore(struct student stu[]);
int main()
{
struct student stu[5]={{10110,"zhang",70,80,90},{10111,"lin",90,80,90},
{10086,"zhao",70,80,90},{10010,"zhang",70,70,70},{10120,"chen",80,80,90}};
searchscore(stu);
return 0;
}
void searchscore(struct student stu[])
{
int n,m,number=0;
printf("enter the number you want:\n");
scanf("%d",&m);
printf("The Result Is:\n");
for(n=0;n<5;n++)
{
if(m==stu[n].num)
{
printf("num:%d\nname:%s\nchinese:%d\nmath:%d\nenglish:%d\n",stu[n].num,stu[n].name,
stu[n].chinese,stu[n].math,stu[n].english);
number=1;
}
} if(number==0)
printf("not found!\n");
}
评析;这是一个信息搜索程序,学生的信息可以是事先定义,也可以采用用户输入形式。
题目10 :
设计一个界面函数,包含上述11个题目的调用,即
请选择
1 调用第一个函数(具体的函数名)
2 调用第二个函数(具体的函数名)
3 ...
...
9 调用第9个函数(具体的函数名)
继续吗?输入y继续下一次选择,输入n结束
解:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define SIZE 10
int f();
void maxMinAver();
int mystrcmp();
float ave();
typedef struct student
{
int num;
char name[10];
float math;
float english;
float computer;
float chinese;
float total;
float average;
}STU;
STU stu[SIZE];
void load();
struct student_type
{ char name [10];
int num;
int age;
char addr[15];
}stud[SIZE];
void output();
struct Student_type
{
char name [10];
char addr[15];
int grade;
int num;
int height;
int age;
int score;
float ave;
}Stu[SIZE];
void print();
struct sTudent
{
int num;
char name[10];
float score;
}sTu[SIZE];
void comp();
struct studenT
{
int num;
char name[10];
float score;
}StU[SIZE];
void searchscore();
struct stuDent
{
int num;
char name[15];
int chinese;
int math;
int english;
};
int sw(int m);
void menu();
int main()
{
int num1,num2;
char str;
menu();
scanf("%d",&num1);
sw(num1);
getchar();
scanf("%c",&str);
while (str=='N'||str=='n'&&str=='Y'||str=='y')
{ if(str=='y')
{scanf("%d",&num2);
sw(num2);}
if(str=='n')
break;
getchar();
scanf("%c",&str);
}
return 0;
}
int sw(int m)
{ int x,n,i,max,min;
char str1[100],str2[100];
float kave;
int *data;
struct stuDent stuD[5]={{10110,"zhang",70,80,90},{10111,"lin",90,80,90},
{10086,"zhao",70,80,90},{10010,"zhang",70,70,70},{10120,"chen",80,80,90}};
switch(m)
{
case 1:scanf("%d",&x);
printf("%d\n",f(x));break;
case 2:scanf("%d",&n);
data=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
scanf("%d",&data[i]);
maxMinAver(data,&max,&min,&kave,n);
printf("max:%d\nmin:%d\nave:%.1f\n",max,min,kave);break;
case 3:scanf("%s %s",str1,str2);
printf("%d\n",mystrcmp(str1,str2));break;
case 4:for(i=0;i<SIZE;i++)
scanf("%d %s %f %f %f %f",&stu[i].num,stu[i].name,
&stu[i].math,&stu[i].english,&stu[i].computer,&stu[i].chinese);
ave(stu,SIZE);
for(i=0;i<SIZE;i++)
printf("num:%d\nname:%s\naverage:%.2f\n\n",
stu[i].num,stu[i].name,stu[i].average);break;
case 5:load();break;
case 6:output();break;
case 7:for(n=0;n<SIZE;n++)
scanf("%d %s %f",&sTu[n].num,sTu[n].name,&sTu[n].score);
print(sTu,SIZE);break;
case 8:for(n=0;n<SIZE;n++)
scanf("%d %s %f",&StU[n].num,StU[n].name,&StU[n].score);
printf("The Order Is:\n");
comp(StU);
for(n=0;n<SIZE;n++)
printf("%6d%10s%8.1f\n",StU[n].num,StU[n].name,StU[n].score);break;
case 9:searchscore(stuD);break;
} printf("\n");
printf("继续吗?\n");
}
void menu()
{
printf("||**********************************************||\n");
printf("|| 请选择你所需要的函数 ||\n");
printf("||**********************************************||\n");
printf("|| 1.求分段函数的值f(x) ||\n");
printf("|| 2.求一组数据的最大值和最小值以及平均值 ||\n");
printf("|| 3.比较两个字符串大小 ||\n");
printf("|| 4.求一组学生每个学生各门课程的平均值 ||\n");
printf("|| 5.从文件读入一组学生的信息 ||\n");
printf("|| 6.输出结构体数组的信息到文本文件中 ||\n");
printf("|| 7.打印输出学生结构体数组的信息到屏幕上 ||\n");
printf("|| 8.把一组学生成绩信息按总分进行排序 ||\n");
printf("|| 9.查找给定学号的学生成绩信息 ||\n");
printf("||**********************************************||\n");
printf("||**********************************************||\n\n");
printf("请输入所调用函数序号:\n");
}
int f(int n)
{ int s;
if(n>0) s=3*n*n-4;
if(n==0) s=2;
if(n<0) s=0;
return s;
}
void maxMinAver(int *data,int *max, int *min,float * ave,int size)
{
int i,sum=0;
*max=data[0];
*min=data[0];
for(i=0;i<size;i++)
{
if(*max<=data[i])
*max=data[i];
if(*min>=data[i])
*min=data[i];
sum+=data[i];
}
*ave=(float)sum/size;
}
int mystrcmp(const char *str1, const char *str2)
{
int i;
for(i=0;*(str1+i) != '\0' && *(str2+i) !='\0';i++)
{
if(*(str1+i) > *(str2+i))
return 1;
if(*(str1+i) < *(str2+i))
return -1;
if(*(str1+i) ==*(str2+i))
return 0;
}
}
float ave(STU stu[],int size)
{
int i;
for(i=0;i<size;i++)
{
stu[i].total=stu[i].math+stu[i].english+stu[i].computer+stu[i].chinese;
stu[i].average=stu[i].total/4;
}
}
void load()
{ int i;
FILE*fp;
if((fp=fopen("stu.txt","r"))==NULL)
{ printf("cannot open file\n");
exit (0);
}
for(i=0;i<SIZE;i++)
{ fscanf(fp,"%s %d %d %s",&stud[i].name,
&stud[i].num,&stud[i].age,&stud[i].addr);
printf("%-10s %4d %4d %-15s\n",stud[i].name,
stud[i].num,stud[i].age,stud[i].addr);
}
fclose (fp);
}
void output()
{
int i;
FILE*fp;
fp=fopen("PRINT.txt","w");
for(i=0;i<SIZE;i++)
{ scanf("%s %s %d %d %d %d %d %f",
Stu[i].name,Stu[i].addr,&Stu[i].grade,&Stu[i].num,
&Stu[i].height,&Stu[i].age,&Stu[i].score,&Stu[i].ave);
//fprintf(fp,"name addr grade num height age score ave\n");
fprintf(fp,"%s %s %d %d %d %d %d %5.2f\n",
Stu[i].name,Stu[i].addr,Stu[i].grade,Stu[i].num,
Stu[i].height,Stu[i].age,Stu[i].score,Stu[i].ave);
}
}
void print(struct sTudent sTu[],int size)
{
int i;
for(i=0;i<size;i++)
printf("num:%d\nname:%s\nscore:%.2f\n\n",sTu[i].num,sTu[i].name,sTu[i].score);
}
void comp(struct studenT stu[])
{
int i,j,k,m;
for(i=0;i<SIZE-1;i++)
{k=i;
for(j=i+1;j<SIZE;j++)
if(StU[j].score>StU[k].score)
k=j;
m=StU[k].score;
StU[k].score=StU[i].score;
StU[i].score=m;
}
}
void searchscore(struct stuDent stu[])
{
int n,m,number=0;
printf("enter the number you want:\n");
scanf("%d",&m);
printf("The Result Is:\n");
for(n=0;n<5;n++)
{
if(m==stu[n].num)
{
printf("num:%d\nname:%s\nchinese:%d\nmath:%d\nenglish:%d\n",stu[n].num,stu[n].name,
stu[n].chinese,stu[n].math,stu[n].english);
number=1;
}
} if(number==0)
printf("not found!\n");
}
评析:这是一个大型数据系统,将以上9个函数集结成一个大型数据,制作了精美的封面,主要用途与前9个题目相似,需要注意变量名与结构体数组名不能重复定义,系统结构要清晰。
题目11:
创建一个工程文件,包含三个文件,第一个是主函数所在的源文件,含有显示界面,选择1-10,调用不同的函数,第二个是各个函数所在的源文件,第三个是各个函数原型所在的头文件。
解:
1. arrangemain.c
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define SIZE 10
#include"arrange.h"
int main()
{
int num1,num2;
char str;
menu();
scanf("%d",&num1);
sw(num1);
getchar();
scanf("%c",&str);
while (str=='N'||str=='n'&&str=='Y'||str=='y')
{ if(str=='y')
展开阅读全文