苏州市职业大学
实习(实训)报告
名称 程序逻辑设计与编程规范实训
20##年 6月 8日至 20##年6月14日共1 周
学院(部) 计算机工程学院
班 级 计算机网络技术
姓 名 xxxxx
学院(部)负责人 xxxx
系 主 任 xxxx
指导教师 xxxx xxxx
一、实训目的与要求... 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、职工信息删除、修改功能(可选项)
1、定义头文件、主函数:main( )
先声明所有将会调用到的函数名。再运用选择函数switch即可根据使用者所输入的功能代号进入对应的功能程序。定义一个全局指针变量*p和全局变量a。a表示当前系统中职工人数,p指向a的地址,追踪人数变化,这样在添加或者删除导致人数变化后,浏览函数display()能够正确显示出当前人数的职工信息。宏定义define N指定首次输入的职工人数,可根据需要更改,变化。
#include<stdio.h>
#include <string.h>
#include<conio.h>
#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<N;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<m;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<b;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].address,&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<a;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语句判断em.name中是否有输入的职工信息,若有,则 输出相应信息;若无,则输出“查无此人”,返回查询菜单。
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循环,先判断em.name中是否存在所输入的名字。若存在,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);
for(i=0;i<a;i++)
{
if(!strcmp(em[i].name,name))
{
printf("\n确认删除请按1\n取消请按2\n");
scanf("%d",&t);
if(t==1)
{
for(j=i;j<a-1;j++)
{
em[j].age=em[j+1].age;
em[j].wage=em[j+1].wage;
em[j].number=em[j+1].number;
em[j].telephone=em[j+1].telephone;
strcpy(em[j].xueli,em[j+1].xueli);
strcpy(em[j].name,em[j+1].name);
strcpy(em[j].address,em[j+1].address);
strcpy(em[j].sex,em[j+1].sex);
}
a--;
save(j);
break;
}
if(t==2)
break;
}
}
if(i==a)
printf("\n输入错误,无此人\n");
*b=a;
printf("\n继续删除请按1\n浏览信息请按2\n返回主菜单请按3\n");
scanf("%d",&m);
switch(m)
{
case 1:del(p);break;
case 2:display(*b);main();break;
case 3:main();break;
default:break;
}
}
9.添加函数void add(int *a)
声明整形变量i,n,m,定义指针文件fp,追加打开文件,若打开失败,则退出;若成功,则继续操作,用for循环输入要添加的信息,再用另外一个for循环将输入的信息写入文件中,关闭文件。再调用switch语句选择下一步操作,并连接到相应函数。
void add(int *a)
{
int i,n,m;
FILE*fp;
if(!(fp=fopen("d:\\abc.txt","a")))
{
printf("打开失败");
exit(0);
}
printf("\n请输入想添加的人数:\n");
scanf("%d",&n);
for(i=*a;i<n+(*a);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");
for(i=*a;i<n+(*a);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);
*a=*a+n;
printf("\n浏览新信息请按1\n返回主菜单请按2\n");
scanf("%d",&m);
switch(m)
{
case 1:display(*a);main();break;
case 2:main();break;
default:break;
}
}
整个程序代码是分块书写的,每个函数都可以独立运行。只有输入函数查询菜单函数写得很顺利,一次性就能够成功运行,其他函数在调试过程中或多或少都出现了问题。
1、保存函数save()在调试和链接的时候都没有出现错误提示,但在运行的时候出现了问题。写入指定位置的文件,打开后总会有乱码。与c语言课本上的例题对照后发现,我写的fopen("d:\\bbb","w")没有指定文件的存储类型。解决方法:在文件名bbb后面加上.txt后即可。
2、导出函数load()遇到两个问题。1是为图方便直接将保存函数复制过来进行修改时,忘了修改文件的打开方式,不能运行。经多次检查后终于发现了,解决:将只写"w"改为只读"r"。2是用fscanf语句时,漏写地址符。调试和链接都没问题,但点击运行后,总出现一个提示出错的蓝色小窗口。经老师提时候发现了错误所在。解决:在em[i].name等之前加上地址符。
3、浏览函数display()遇到的问题虽然不大,但解决起来很麻烦。理想的运行结果是美观整齐。即下面的职工信息分别与第一个printf输出的中文项目提示对齐。解决方法:不断修改空格个数,不断运行察看效果。
4、按学历查询函数search_xueli(),要考虑输入一种学历,可能对应出很多职工,这就不能延用按姓名和职工号查询中判断是否输入错误的方法了。为了显示出所有具有该学历的职工,就需要让for循环一直运行到最后一个为止。这时计量数i始终会等于职工人数,不能再用i来判断是否不存在此人。这就需要再定一个整形变量k,用来计量单独的一个循环次数。
5、添加函数add()遇到的问题是用printf输入新职工信息后,保存到文件里面,发现原有的信息不见了。解决:文件打开方式改用"a"追加写入。
经过一学期的C语言学习,我掌握了C语言的基础知识,能够读懂别人用c语言设计的程序。平时的程序设计大多是以填空的形式出现,虽然有所接触,但都不完全。而这周的课程设计,却让我完完全全用自己学到的知识编写一个完整的体统程序。这是一个新的挑战,也是一种新的学习。
我选择的是题目中的第一个——职工信息管理系统。这需要自己设计一个系统,可以输入信息,保存到文件里,再从文件里调出来,使之显示在屏幕上,进行删除、添加等对信息的修改。初看到这个题目觉得很简单,但当我做到电脑前准备开始编写代码的时候才发现无从下手。通过去图书馆查找程序设计相关的书籍,和上网参考前人编写的类似程序,我脑中才有了一个大概方向。
但具体编写过程中,可谓困难重重。反复调试程序、修改代码,再运行。经过N次之后才成功。
[1] 实用C语言程序设计教程
主编:李金祥 顾小晶 副主编:陈静 陈小英 李爱军
略
计算机科学与技术系C语言实验报告实验名称:指针及其应用日期:得分:指导老师:专业:班次:姓名:学号:实验目的(1)掌握变量的指针及…
C语言程序设计与数据结构实训报告课题名称通讯录管理系统专业软件技术开发方向班级软件G083学号姓名徐阳指导教师黄爽20xx年12月…
暨南大学本科实验报告专用纸课程名称高级语言程序设计成绩评定实验项目名称结构体和共用体指导教师张晓刚实验项目编号8060151108…
高级语言程序设计学生实验报告专业计算机科学与技术学号姓名1实验一C程序的运行环境和使用方法1实验目的1了解所用的计算机系统的基本操…
C语言实训心得10903090113李新程在初学C语言的一个学期后,我们进行了C语言实训阶段,尝试编写一个比较复杂的程序系统。在为…
甘肃机电职业技术学院C语言程序设计实实习时间指导教师学生姓名学号专业班级报告20xx年x月x日至20xx年x月x日止朱七二杨雪曼6…
信息111班潘康乐44号一、实训要求1、实训目的《言程序设计课程实训是三年制高职计算机应用技术、计算机网络技术、软件技术专业的重要…
计算机专业实践教学总结为了进一步增强实践教学效果,提高学生计算机编程能力,更好的理论联系实际,根据我院计算机专业专科实践性教学环节…
设计题目及要求设计题目及要求设计题目及要求设计题目及要求1.综合应用实例——学生成绩管理编写一个菜单驱动的学生成绩管理程序。实现如…
C语言实训报告做完这个课程设计,我们的自信一下子提高了;尽管对于有些人这种程序会很简单,可对我们c语言初学者来说,已经很不容易了。…