C语言实训报告
苏州市职业大学实习(实训)报告名称程序逻辑设计与编程规范实训
2014年6月8日至2014年6月14日共1 周
学院(部) 计算机工程学院
班级计算机网络技术
姓名xxxxx
学院(部)负责人xxxx
系主任xxxx
指导教师x x x x x x x x
目录
一、实训目的与要求 (3)
二、题目说明 (3)
三、总体设计 (4)
3.1.软件模块结构图 (4)
3.2.程序流程图: (4)
四、详细设计和实施 (5)
4.1.函数详解与代码 (5)
4.2运行结果,图片显示: (15)
五、遇到的问题和解决方法 (17)
六、实训总结 (18)
七、参考文献 (18)
附录(源程序代码) (18)
一、实训目的与要求
1、实训目的:
利用《程序逻辑设计与编程规范》课程中所学到的编程知识和编程技能,完成达到规定难度和工作量的程序设计题目,帮助掌握编程、调试的基本技能。
通过亲自设计程序,熟悉c语言操作,更熟练的掌握c语句。初步体会编程的过程,为将来的程序深入学习打下基础和培养兴趣。
2、实训要求:
在实训过程中要求态度认真、重视实训环节,用严谨、科学和踏实的工作态度对待实训的每一项任务;按照实训的题目要求,独立地完成各项任务,不允许相互抄袭;按时到机房上机,并接受教师的检查。认真编写实训报告。
编辑c语言需要细心、耐心,还必须有钻研精神。在调试程序时需要反复的修改代码,以确保运行结果正确。
二、题目说明
职工信息管理系统设计
职工信息包括职工号、姓名、性别、年龄、学历、工资、住址、电话等(职工号不重复)。
试设计一职工信息管理系统,使之能提供以下功能:
1、系统以菜单方式工作
2、职工信息录入功能--输入
3、职工信息浏览功能--输出
4、职工信息查询功能--算法
查询方式:按学历查询等;按职工号查询等;
5、职工信息删除、修改功能(可选项)
三、总体设计
3.1.软件模块结构图
3.2.程序流程图:
开始
显示菜单
输入功能代码
input( ) display( ) search( ) del( ) add( ) exit(0 )
结束
显 示 主 菜 单
输 入 函 数 写 入 函 数 导 出 函 数 浏 览 函 数 查 询 函 数 删 除 函 数 添 加 函 数
四、详细设计和实施
4.1.函数详解与代码
1、定义头文件、主函数:main( )
先声明所有将会调用到的函数名。再运用选择函数switch即可根据使用者所输入的功能代号进入对应的功能程序。定义一个全局指针变量*p和全局变量a。a表示当前系统中职工人数,p指向a的地址,追踪人数变化,这样在添加或者删除导致人数变化后,浏览函数display()能够正确显示出当前人数的职工信息。宏定义define N指定首次输入的职工人数,可根据需要更改,变化。#include
#include
#include
#define N 3
struct employee
{
int number,age,wage;
char name[20],sex[10],address[30],xueli[20];
long int telephone;
}em[N];
int a=N;
int *p=&a;
main( )
{
void search();
void search_name();
void search_xueli();
void search_number();
void load();
void display();
void del();
void input();
void add();
void save();
int n;
printf("\n");
printf(" ******************职工信息管理****************\n");
printf("\n");
printf(" 1.录入职工信息\n");
printf(" 2.浏览职工信息\n");
printf(" 3.查询职工信息\n");
printf(" 4.删除职工信息\n");
printf(" 5.添加职工信息\n");
printf(" 6.退出\n");
printf("\n");
scanf("%d",&n);
switch(n)
{
case 1:printf(" 输入职工信息\n");
printf("\n");input( );main( );break;
case 2:printf(" 浏览职工信息\n");
printf("\n");display(*p);main( );break;
case 3:printf(" 查询职工信息\n");
printf("\n");search();break;
case 4:printf(" 删除职工信息\n");
printf("\n");del(p);break;
case 5:printf(" 添加职工信息\n");
printf("\n");add(p);break;
case 6:exit(0);break;
default :break;
}
}
2.输入函数void input()
用for语句来循环输入职工的信息,printf语句提示需要输入的内容,scanf语句输入相应的信息。输入结束再用保存函数save(N)将输入的信息放入指定的文件d:\\abc.txt
void input()
int i;
for(i=0;i { printf("请输入职工号: "); scanf("%d",&em[i].number); printf("请输入姓名: "); scanf("%s",em[i].name); printf("请输入性别: "); scanf("%s",&em[i].sex); printf("请输入年龄: "); scanf("%d",&em[i].age); printf("请输入学历: "); scanf("%s",em[i].xueli); printf("请输入工资: "); scanf("%d",&em[i].wage); printf("请输入住址: "); scanf("%s",em[i].address); printf("请输入电话: "); scanf("%d",&em[i].telephone); printf("\n"); } printf("\n创建完毕!\n"); save(N); } 3.保存函数void save(int m) 定义整形变量i,文件指针,fopen打开指定的文件。先用if语句判断文件是否打开成功,若返回值为0,则继续操作。用for循环通过fprintf语句将数组em中的内容保存在文件中。 void save(int m) { int i; FILE*fp; if(!(fp=fopen("d:\\abc.txt","w"))) printf("打开失败"); exit(0); } for(i=0;i fprintf(fp," %d %5s %5s %d %s %d %s %ld \n",em[i].number, em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wage, em[i].address,em[i].telephone); fclose(fp); } 4.导出函数void load(int b) 定义整形变量i和文件指针,先用if语句判断文件是否打开成功,若返回值为0,则继续操作。用for循环通过fscanf语句将文件中的信息取出放到数组em中。 void load(int b) { int i; FILE*fp; if(!(fp=fopen("d:\\abc.txt","r"))) { printf("打开失败"); exit(0); } else for(i=0;i fscanf(fp," %d %5s %5s %d %s %d %s %ld \n",&em[i].number,&em[i].name,&em[i].sex,&em[i].age,&em[i].xueli,&em[i].wage,&em[i].ad dress,&em[i].telephone); fclose(fp); } 5.浏览函数void display(int a) 声明整形变量i和b,其中i记录输出的职工序数,b用来接收调用浏览函数时所传递过来的实参,接着将其值传递给导出函数load(b),使得导出的职工人数与浏览的职工人数保持一致。通过调用load函数,用for循环输出每个职工的各种信息。 void display(int a) { int i,b=a; load(b); printf("\n职工号姓名性别年龄学历工资住址电话\n"); for(i=0;i printf("%d %5s %5s %d %s %d %s %ld\n",em[i].number,em[i].name,em[i].sex,em[i] .age,em[i].xueli,em[i].wage,em[i].address,em[i].telephone); printf("\n"); } 6 .查询函数void search( ) 声明整形变量t,先用 printf语句显示查询菜单,用 scanf输入选择的查询方式代号,用switch(t)进入所选择的具体查询函数,包括按职工号查询、按姓名查询、按学历查询三种方式. void search( ) { int t; printf("\n按职工号查询按1\n按姓名查询请按2"); printf("\n按学历查询请按3\n返回主菜单请按4\n"); scanf("%d",&t); switch(t) { case 1:printf("\n按职工号查询\n");search_number(); break; case 2:printf("\n按姓名查询\n");search_name(); break; case 3:printf("\n按学历查询\n");search_xueli(); break; case 4:main();break; default :printf("输入错误,请重新输入!\n"); search( ); break; } } 7.三种方式查询职工信息:按职工号查询;按姓名查询;按学历查询。 按职工号查询void search_number() 声明整形变量i,number,调用导出函数load(*p)。用scanf语句输入要查询的职工号,用for 循环判断em.number中是否有输入的职工号,若有,则输出相应信息,跳出循环。若没有,则输出“查无此人”,返回查询菜单。 void search_number() { int i,number; load(*p); printf("\n请输入要查询的职工号:"); scanf("%d",&number); for(i=0;i<*p;i++) if(number==em[i].number) { printf("\n该职工信息如下:\n"); printf("\n职工号姓名性别年龄学历工资住址电话\n"); printf("%d %5s %5s %d %s %d %s %ld\n",em[i].number,em[i].name,em[i].sex,em[i] .age,em[i].xueli,em[i].wage,em[i].address,em[i].telephone); printf("\n"); break; } if(i==*p) printf("\n查无此人\n"); search(); } 按姓名查询void search_name( ) 声明整形变量i和字符型数组name[20],调用导出函数load(*p)。用scanf语句输入要查询的职工名字,用for循环,if语句判断https://www.360docs.net/doc/5316695205.html,中是否有输入的职工信息,若有,则输出相应信息;若无,则输出“查无此人”,返回查询菜单。 void search_name() { int i; char name[20]; load(*p); printf("\n请输入要查询的姓名:"); scanf("%s",name); for(i=0;i<*p;i++) if(!strcmp(em[i].name,name)) { printf("\n该职工信息如下:\n"); printf("\n职工号姓名性别年龄学历工资住址电话\n"); printf("%d %5s %5s %d %s %d %s %ld\n",em[i].number,em[i].name,em[i].sex,em[i] .age,em[i].xueli,em[i].wage,em[i].address,em[i].telephone); printf("\n"); break; } if(i==*p) printf("\n查无此人\n"); search(); } 按学历查询void search_xueli( ) 声明整形变量i,k,字符型数组xueli[20]。调用导出函数,用scanf输入要查询的职工学历,查询时可能有多个职工有相同的学历,采用另一种方法,判断并执行一次后继续循环,找出所有相同学历的职工;解决输入错误提示“查无此人”,还得需要一段for循环,通过k记录循环的次数,若最后仍无结果,则输出“查无此人”,返回查询菜单。 void search_xueli() { int i,k=0; char xueli[20]; load(*p); printf("\n请输入要查询的学历:"); scanf("%s",xueli); for(i=0;i<*p;i++) if(!strcmp(em[i].xueli,xueli)) { printf("职工号姓名性别年龄学历工资住址电话\n"); printf("%d %5s %5s %d %s %d %s %ld\n",em[i].number,em[i].name,em[i].sex,em[i] .age,em[i].xueli,em[i].wage,em[i].address,em[i].telephone); for(i=0;i<*p;i++) { if(!strcmp(em[i].xueli,xueli)) break; else k++; } if(k==*p) printf("\n查无此人\n"); search(); } 8.删除函数void del(int *b) 声明整形变量i,j,t,m,a和char形数组name[20]。调用浏览函数display(a),显示所有职工信息。用printf语句提示“输入要删除的职工名字”,用scanf语句输入删除对象名字。用for循环,先判断https://www.360docs.net/doc/5316695205.html,中是否存在所输入的名字。若存在,printf语句提示是否确认删除,用scanf 语句输入确认指令,再用for循环从要删除的这个职工开始,依次用后一个职工的信息覆盖前一个的。循环结束后当前职工人数a自减1,并保存,跳出大循环;若不存在,输出“输入错误,无此人”。再将a的新值附给*b,实参p所指的人数地址中的人数也随即改变删除后的人数。printf提示下一步操作“继续删除请按1\n浏览信息请按2\n返回主菜单请按3”。switch根据键盘输入的指令代号选择下一步连接的函数。 void del(int *b) { int i,t,j,m; int a=*b; char name[20]; printf("\n所有职工信息:\n"); display(a); printf("\n请输入要删除职工的名字:"); scanf("%s",name);