资源描述
C语言课程实训设计报告
一、 工程概述
我这次实训的工程主要是农民工资收入统计系统,农民工资收入统计系统主要实现的是农民信息的输入、输出,按农民的门牌号排序,实现农民信息的插入、查找、删除等操作,以及可以计算全村总收入和人均收入,也能够找出小康家庭、中等家庭以及贫困家庭。
这次实训的工程主要通过C语言来实现程序的运行,主要通过C语言中的函数调用和结构体来做程序,还要用到许多小的知识点,例如:用冒泡法实现排序;scanf、printf语句;strcpy复制语句;if……else语句实现选择……等等。
二、 工程分析和设计
主菜单
写入文件
找出小康家庭等
输入信息
输出信息
升序排序
插入并排序
查找并删除
总收入与人均收入
这个工程的程序可分为几个板块来做,每个板块有每个板块的作用,通过不同程序的不同作用相互调用即可实现整个程序的运行,这个工程程序主要可以分为以下几个板块:
1、定义头文件:
运用#include<stdio.h>,#include<stdlib.h>,
#include<ctype.h>,#include<string.h>等头文件
2、定义结构体数组:
运用typedef struct
{农民列表信息……}变量名表列;
这种类型是直接定义结构体类型变量。
3、对调用函数进行声明:
根据所写程序对有些函数进行声明,例如:
Void show_menu();在程序中实现的是对菜单函数的调用。
4、主函数:
Void main()为主函数,在主函数中通过do……while语句和
switch……case语句进行选择和函数调用。
Void main()
{ do
{switch()
……
}
}while();
5、菜单函数:
定义函数为 void show_menu()
主要用printf语句输出菜单函数,并且还通过主函数调用菜单函数实现对农民信息的选择。
6、输入农民的信息:
定义函数为int create(peasant nu[],int n)
nu[]为结构体数组,在此函数中,通过scanf语句实现农民信息的输入,并用while语句判断并实现多余信息的去除,以及判断是否继续进行输入信息,最后还有一个值返还给主函数main()。
7、输出农民信息:
定义函数为 void print(peasant nu[],int n)
主要运用printf语句输出农民的信息,并用for语句和if语句判断,如果输入的信息超过十个就停止输入,假设没有就继续输。
用system(“pause〞)去除界面。
8、对函数进行排序:
定义函数为 void sort(peasant nu[],int n)
在此函数中,利用两层循环按门牌号进行排序,如果变量在结构体中定义成数组形式,就用strcpy语句进行复制;如果定义成整形就要新定义一个变量作为中间函数进行替换来实现数的交换。
9、插入信息并排序:
定义函数为 int insert(peasant nu[],int n)
在此函数中,利用scanf语句进行输入信息,再调用排序函数
sort(nu,n)进行排序,最后还要返回一个值到主函数main().
10、查找并删除记录:
int del(peasant nu[],int n)
此程序需要按姓名查找,所以输入姓名,并用while实现循环次数,用strcmp比拟输入姓名与原来姓名,假设strcmp(a,b)==0,即说明找到该信息并且删除,删除是通过for以及strcpy对查找的信息进行删除,假设strcmp(a,b)!=0,即说明没有找到该信息。
11、计算全村总收入以及人均收入
定义函数为 void ave(peasant nu[],int n)
在此函数中主要运用for语句进行控制,即可计算出总收入以及人均收入并输出。
12、找出小康家庭、中等家庭、贫困家庭
定义函数为 void fib(peasant nu[],int n)
在此函数中主要运用if……else语句进行判断选择,判断哪家是小康家庭,哪家是中等家庭,哪家是贫困家庭并且输出.
void fib(peasant nu[],int n)
{
for(i=0;i<n;i++)
{ if() printf("\n");
else if() printf("\n");
else printf("\n");
}
}
13、把所有程序写入文件中
定义函数为 void printfile(peasant nu[],int n)
首先先定义文件指针,用fopen〔“filename〞,“w〞〕翻开文件并判断是否能翻开文件,最后再用fclose(文件指针)关闭文件。
这个程序大体的设计便是如此,它包含了我们学过的许多知识,运用了许多重要的内容,总体分析即是如此。
三、工程关键代码〔加注释〕
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
typedef struct /*定义结构体数组*/
{
char num[20];
char name[20];
long int income;
}peasant;
peasant nu1[10000];
void show_menu();
int create(peasant nu[],int n);
void print(peasant nu[], int n);
void sort(peasant nu[],int n);
int insert(peasant nu[],int n);
int del(peasant nu[],int n);
void ave(peasant nu[],int n);
void fib(peasant nu[],int n);
void printfile(peasant nu[],int n);
void main() /*主函数*/
{
int n=0;
int no;
do
{
show_menu();
printf("please input your choice\n");
scanf(“%d〞,&no);
switch(no)
{
case 1: printf("输入记录\n");
n=create(nu1,n);break;
case 2: printf("输出信息\n");
print(nu1,n);break;
case 3: printf("按门牌号排序并显示\n");
sort(nu1,n);
printf("排序成功!\n");
print(nu1,n);
printf("\t\t");break;
case 4: printf("插入信息并按门牌号排序及显示\n");
n=insert(nu1,n);
print(nu1,n);
printf("\t\t");break;
case 5: printf("根据姓名查找并删除记录\n");
n=del(nu1,n);
printf("\t\t");
system("pause");break;
case 6: printf("计算总收入和人均收入\n");
ave(nu1,n); system("pause");break;
case 7: printf("找出小康家庭,中等家庭,贫困家\n");
fib(nu1,n); system("pause");break;
case 8: printf("循环写入数据\n");
printfile(nu1,n);
printf("\t\t");
system("pause");break;
case 0: printf("\t\t谢谢使用,祝你好运,再见!\n");
printf("\t\t");
system("pause");
exit(0);
}
}while(no!=0);
}
void show_menu()
{ system("cls"); /*运行前清屏*/
printf("************************主菜单**********************\n");
printf("*1.输入农民工的门牌号、姓名、收入 *\n");
*\n");
*\n");
printf("*4.实现农民信息的插入,后按门牌号从小到大输出 *\n");
printf("*5.根据姓名查找,并删除该信息 *\n");
*\n");
printf("*7.找出小康家庭,中等家庭,贫困家庭 *\n");
*\n");
printf("*0.退出 *\n");
printf("****************************************************\n");
}
int create(peasant nu[],int n) /*输入信息*/
{
int i=0;
char sign,x[10]; /*x[10]为去除多余的数据所用*/
while(sign!='n'&&sign!='N') /*判断*/
{
printf("门牌号:"); /*交互输入*/
scanf("%s",nu[n+i].num);
printf("姓名:");
scanf("%s",nu[n+i].name);
printf("收入:");
scanf("%d",&nu[n+i].income);
gets(x); /*去除多余的输入*/
printf("是否继续输入?(Y/N)");
scanf("%c",&sign); /*输入判断*/
i++;
}
return(n+i);
}
void print(peasant nu[], int n) /* 输出结果*/
{
int i;
printf("--------------------------------------------------\n"); /*格式头*/
printf("门牌号 姓名 收入 \n");
printf("--------------------------------------------------\n");
for(i=1;i<n+1;i++) /*循环输入*/ { printf("%-10s%-10s%-10d\n",nu[i-1].num,nu[i-1].name,nu[i-1].income);
if(i>1&&i%10==0) /*每十个暂停*/
{printf("--------------------------------------------------\n"); /*格式*/
printf("\t\t");
system("pause");
printf("--------------------------------------------------\n");
}
}
printf("\t\t");
system("pause");
}
void sort(peasant nu[],int n) /*按门牌号排序*/
{
int i,j;
char t[10];
int s;
for(i=0;i<n-1;i++) /*冒泡法排序*/
for(j=0;j<n-1-i;j++)
if(strcmp(nu[j].num,nu[j+1].num)>0)
{strcpy(t,nu[j+1].num);
strcpy(nu[j+1].num,nu[j].num);
strcpy(nu[j].num,t);
strcpy(t,nu[j+1].name);
strcpy(nu[j+1].name,nu[j].name);
strcpy(nu[j].name,t);
s=nu[j].income;
nu[j].income=nu[j+1].income;
nu[j+1].income=s;
}
}
int insert(peasant nu[],int n) /*插入记录,并按门牌号升序排序*/
{
char x[100]; /*去除多余输入所用*/
printf("农民门牌号:"); /*交互式输入*/
scanf("%s",nu[n].num);
printf("农民姓名:");
scanf("%s",nu[n].name);
printf("农民工资:");
scanf("%d",&nu[n].income);
gets(x);
n++;
sort(nu,n); /*调用排序函数*/
printf("插入记录成功!\n"); /*返回成功信息*/
return(n);
}
int del(peasant nu[],int n) /*按姓名查找并删除记录*/
{
char s[20];
int i=0,j;
printf("输入农民的姓名:"); /*交互式问寻*/
scanf("%s",s);
while(strcmp(nu[i].name,s)!=0&&i<n) i++; /*查找判断*/
if(i==n)
{
printf("对不起没找到该农民!\n"); /*返回失败信息*/
return(n);
}
for(j=i;j<n-1;j++) /*删除操作*/
{
strcpy(nu[j].num,nu[j+1].num);
strcpy(nu[j].name,nu[j+1].name);
nu[j].income=nu[j+1].income;
}
printf("删除记录成功!\n"); /*返回成功信息*/
return(n-1);
}
void ave(peasant nu[],int n)
{
int i;
float average=0.0;
long int sum=0;
peasant *p;
p=nu;
for(i=0;i<n;i++,p++)
sum+=p->income;
average=sum/n;
printf("全村总收入是:%ld\n",sum);
printf("人均收入是:%f",average);
}
void fib(peasant nu[],int n)
{
int i;
for(i=0;i<n;i++)
{
if(nu[i].income>20000)
printf("是小康家庭\n");
else if(nu[i].income>10000)
printf("是中等家庭\n");
else printf("是贫困家庭\n");
}
}
void printfile(peasant nu[],int n)
{
int i=0;
FILE *fp; /*定义文件指针*/
char filename[100]; /*定义文件名*/
printf("循环写入数据\n"); /*输入文件名*/
printf("输入文件名:");
scanf("%s",filename);
if((fp=fopen("filename","w"))==NULL) /*翻开文件*/
{
printf("无法翻开该文件\n");
system("pause");
return;
}
fprintf(fp,"%d\n",n); /*循环写入数据*/
while(i<n)
{
fprintf(fp,"%-10s%-10s%-10s%-10d\n",nu[i].num,nu[i].name,nu[i].income);
i++;
}
fclose(fp); /*关闭文件*/
printf("写入成功!\n"); /*返回成功信息*/
}
四、工程调试和运行〔界面〕
1、输入农民的信息并显示出界面
2、选择2,显示出输入的农民的信息
3、按任意键并选择3,可以对输入的信息进行升序排序
4、按任意键并选择4,可以插入一条记录并会按升序排序显示出来
5、按任意键并选择5,可以查找一条记录并会删除该条记录
6、按任意键并选择6,可以计算出全村总收入和人均收入
7、按任意键并选择7,可以找出小康家庭等
8、按任意键并选择8,可以写入文件
图见下面
五、实训设计的心得体会
在为期将近十天的C语言程序设计过程中,我从中学到很多,我受益匪浅,感受很深,让我从中了解到C语言程序编程的微妙,学会了许多关于编程的代码,我在这次编写程序中,虽然有点累,但是我从中也得到了乐趣,我觉得编写程序越来越有趣。
但是在编写程序的过程中并不是一帆风顺、顺顺利利的,一开始编写的时候并不知道该怎么着手去编写,很茫然,但是后来经过老师的提点以及提示,我能够去试着编写一个一个小片段,当我把这些小程序拼到一起变成大程序时,我很快乐,因为我毕竟做出来一些内容了。当我将这些程序利用VC进行编译、链接的时候,程序出现了许多错误,当时吓了一跳,但我并没有气馁,我试着去找这些错误并改正,其中程序中的错误有很多种,比方有语法错误,逻辑错误等。语法错误例如:(1)字符与字符串应该用单引号还是用双引号,在程序中我将单引号错用成双引号;(2)忘记定义变量。在该程序中我忘记了定义有些所用变量。(3)函数声明与函数定义不一致。在程序中我声明函数时,将参数顺序不匹配。(4)函数实参与形参的类型不一致,在此程序中,我将一个定义成整型,而定义另一个时却定义成单精度型,导致程序出错误。语法错误还有很多,我在程序中还改正了很多,这些错误让我印象深刻,在以后的编写程序中我要牢牢记住。除了许多语法错误外,还有很多逻辑错误以及警告,这些就要我们一步一步去检查程序。在这个程序中使我印象最深刻的错误是:程序运行出来,但是结果却一闪而过,有些界面不能显示出来,但是经过老师的指导,我将这个错误解决了。在实训过程中自己有时候也想过放弃,可是当自己看到这么一大段代码是放弃的心又被淹没了,因为看到这长长的代码自己的信心又被提升起来,编写程序的乐趣也有了。
在这次的实训中我知道了要做一个程序,首先要知道程序的算法,在了解算法的根底上要知道怎样运用算法,进一步说是怎样运用算法写程序,不管是大程序还是小程序都要用到算法。平时我们学习C语言只是为了考试以及做一些简单的题目,然而这次我们做实训给我们将所学知识运用于解决实际问题的时机,我们从中得到了很多,在运用所学知识的过程中,记住这些知识,让我们将这些知识应用到更广泛的领域。
这次的编写程序又让我感受到学习编写程序可以锻炼缜密的思维,在平时我们只编写一些小程序,句段比拟少,一些错误都很容易被检查出来,但是这次实训工程的程序语段比拟多,难以检查,那一刹那感到很着急,但是改正了一些之后,信心就被提了上来,在经过老师的指点,改正了许多错误。
实训不仅是检查一个人知识掌握了多少,其实更重要的实检测你的实践能力,以及看你是否细心、是否有缜密的思维,这次实训懂得了只要你具备以上几个条件,那么你的实践能力不会太差,所以,在这方面我们要加强锻炼,磨练自己,使自己有更高的提高。
六、参考文献
1、C程序设计(第三版) 清华大学出版社 谭浩强 编著
2、C语言程序设计实验指导 人民邮电出版社 张丽华 主编
3、C语言程序设计案例教程(习题解析与实验指导)
清华大学出版社 张基温 编著
展开阅读全文