一个大型C语言作业
不知道咋搞的,这个程序已没问题了,但是功能却不能全显示出来,且读的功能只能读出一个职工的信息,真是想破头脑出想不出来,望大侠帮帮我
#include <conio.h>
#include <stdio.h>
#include <dos.h>
#include <string.h>
#include <stdlib.h>
struct birth /*出生年月日结构定义*/
{
int year;
int month;
int day;
};
struct address_str
{
char address[60];
char mobile[13];
char family_tel[15];
char mail[25];
};
struct achieve
{
char degree[20];
char experience[1000];
};
struct worker
{
int number;
char name[20];
char sex;
char nation[20];
struct birth birth;
struct address_str addr;
struct achieve achieve;
}workers[20];
FILE*fp;
int a;
void Data_load()
{
long c;
fp=fopen("worker.txt", "r+t") ;
if(fp!=NULL)
{
for(a=1;a<20;a++)
{
if(fgetc(fp)==EOF)
return;
c=a-1;
fseek(fp, c*sizeof(struct worker), SEEK_SET);
fread(&workers[a], sizeof(struct worker), 1, fp);
fclose(fp);
}
}
else
{
fp=fopen("worker.txt", "w");
fclose(fp);
a=1;
}
}
void Data_Show(int b)
{
printf("\n\n\tNo:%3d\n", workers[b].number);
getch();
printf("\n\n\tName:%-20s\n\tsex:%c\n\tnation:%s\n", workers[b].name, workers[b].sex, workers[b].nation);
getch();
printf("\n\n\tBirthday(y/m/d):%4d%2d%2d", workers[b].birth.year, workers[b].birth.month, workers[b].birth.day);
getch();
printf("\n\n\tAddress:%-60s\n\tMobile:%13d\n\tFamily_tel:%15d\n\tmail:%-25s\n",workers[b].addr.address, workers[b].addr.mobile, workers[b].addr.family_tel, workers[b].addr.mail);
getch();
printf("\n\n\tDegree:%-20s\n\texperience:%-1000s\n", workers[b].achieve.degree, workers[b].achieve.experience);
getch();
}
void Data_Input(int b)
{
fflush(stdin);
workers[b].number = b;
printf("\n\n\tNo%d record", b);
printf("\n\n\tName:");
rewind(stdin);
scanf("%s", &workers[b].name);
rewind(stdin);
printf("\n\tnation:");
scanf("%s", &workers[b].nation);
rewind(stdin);
printf("\n\n\tsex(m/f):");
scanf("%c", &workers[b].sex);
rewind(stdin);
printf("\n\n\tbirthday:");
printf("\n\n\tyear:");
scanf("%d", &workers[b].birth.year);
printf("\n\n\tmonth:");
scanf("%d", &workers[b].birth.month);
printf("\n\n\tday:");
scanf("%d" , &workers[b].birth.day);
printf("\n\n\taddress:");
scanf("%s", workers[b].addr.address);
getchar();
printf("\n\n\tmobile:");
scanf("%c", &workers[b].addr.mobile);
getchar();
printf("\n\n\tfamily_tel:");
scanf("%c", &workers[b].addr.family_tel);
getchar();
printf("\n\n\tmail:");
scanf("%c", &workers[b].addr.mail);
getchar();
printf("\n\n\tdegree:");
scanf("%s", &workers[b].achieve.degree);
getchar();
printf("\n\n\texperience:");
scanf("%s", &workers[b].achieve.experience);
}
void Data_Save()
{
int b;
fp=fopen("worker.txt", "w");
for(b=1; b<=a; b++)
{
fwrite(&workers[b], sizeof(struct worker), 1, fp);
}
fclose(fp);
}
void main()
{
int b, c;
char ch, name[20];
char *search_name=name;
clrscr();
Data_load();
a--;
printf("\n\n\tFunction choose:");
printf("\n\t1.Read");
printf("\n\t2.Append");
printf("\n\t3.Delete");
printf("\n\t4.Search");
printf("\n\t5.Insert");
printf("\n\t6.Save and exit");
printf("\n\t7, Quit");
printf("\n\n");
printf("\t choice:");
scanf("%c", &ch);
switch(ch)
{
case '1':
b = 1;
while (getch()!=0x1b && b<=a) Data_Show(b++);
if (b > a)
printf("\n\tEnd of e_note\n");
break;
case '2':
b = 2;
while (getch()!=0x1b && b<20)
{
a++;Data_Input(a);
}
if (a == 20)
printf("\n\te_note is filled\n");
break;
case '3':
if(a<1)
{
printf("\n\tPlease Append record\n");
break;
}
printf("\n\t Delete No:");
scanf("%d", &c);
for (b=c; b<a; b++)
{
strcpy(workers[b].name, workers[b+1].name);
workers[b].sex = workers[b+1].sex;
strcpy(workers[b].nation, workers[b+1].nation);
workers[b].birth.year = workers[b+1].birth.year;
workers[b].birth.month = workers[b+1].birth.month;
workers[b].birth.day = workers[b+1].birth.day;
strcpy(workers[b].addr.address, workers[b+1].addr.address);
strcpy(workers[b].addr.mobile, workers[b+1].addr.mobile);
strcpy(workers[b].addr.family_tel, workers[b+1].addr.family_tel);
strcpy(workers[b].addr.mail, workers[b+1].addr.mail);
strcpy(workers[b].achieve.degree, workers[b+1].achieve.degree);
strcpy(workers[b].achieve.experience, workers[b+1].achieve.experience);
}
a--;
break;
case'4':getchar();
printf("\n\t Please input name:");
gets(search_name);
for (b=0; b<=a; b++)
{
if (strcmp(search_name, workers[b].name)==0)
{
Data_Show(b);
break;
}
}
if (b > a)
{
printf("\n\t No such records");
}
break;
case '5':
printf("\n\tinsert No:");
scanf("%d", &c);
for (b=a+1; b>c; b--);
{
strcpy(workers[b].name, workers[b-1].name);
workers[b].sex = workers[b-1].sex;
strcpy(workers[b].nation, workers[b-1].nation);
workers[b].birth.year = workers[b-1].birth.year;
workers[b].birth.month = workers[b-1].birth.month;
workers[b].birth.day = workers[b-1].birth.day;
strcpy(workers[b].addr.address, workers[b-1].addr.address);
strcpy(workers[b].addr.mobile, workers[b-1].addr.mobile);
strcpy(workers[b].addr.family_tel, workers[b-1].addr.family_tel);
strcpy(workers[b].addr.mail, workers[b-1].addr.mail);
strcpy(workers[b].achieve.degree, workers[b-1].achieve.degree);
strcpy(workers[b].achieve.experience, workers[b-1].achieve.experience);
}
Data_Input(c);
a++;
Data_Save();
break;
case '6':
Data_Save();
exit(0);
break;
case '7':
printf("\n\t Do you want to save e_note:(y/n)");
ch = getch();
if(ch == 'y')
{
Data_Save();
exit(0);
}
default: printf("please choose num 1-7.\n");
}
}
问题点数:90、回复次数:26Top
1 楼yangshunying()回复于 2006-05-22 22:57:29 得分 0
void main()
{
int b, c;
char ch, name[20];
char *search_name=name;
clrscr();
Data_load();
a--; /* a哪来的??*/
printf("\n\n\tFunction choose:");
printf("\n\t1.Read");
printf("\n\t2.Append");
printf("\n\t3.Delete");
Top
2 楼yangshunying()回复于 2006-05-22 22:58:41 得分 0
找到了,定义在中间了Top
3 楼yangshunying()回复于 2006-05-22 23:00:19 得分 0
看太费劲了Top
4 楼xuxing13()回复于 2006-05-22 23:14:54 得分 0
并不是那样的问题呀
是掉了个int a=20;Top
5 楼niatclock(豆豆雅)回复于 2006-05-23 07:20:56 得分 0
markTop
6 楼mr_moran(漠然)回复于 2006-05-23 08:23:53 得分 0
晕,这样的代码,折磨啊...
楼主,加点注释吧...Top
7 楼youngsun1983(人品的小孙)回复于 2006-05-23 08:49:11 得分 0
有人罐水。。。Top
8 楼jixingzhong(瞌睡虫·星辰)回复于 2006-05-23 08:53:39 得分 0
文件打开方式和 你的文件操作方式不匹配 ...
fp=fopen("worker.txt", "r+t") ;==》
fp=fopen("worker.txt", "rb") ;
Top
9 楼jixingzhong(瞌睡虫·星辰)回复于 2006-05-23 09:01:12 得分 0
恩,以后楼主可以简单的在你的代码上加点注释,
这个还好,
函数名字就看出来了 ....
不过不是每个人都这么看的,
也许有人一看没有注释直接就关页面了...
如果楼主感觉程序比较清晰,
也需要对每个函数的功能做个注释,以便于理解 .....Top
10 楼shw014()回复于 2006-05-23 09:06:25 得分 0
if(fp!=NULL)
{
for(a=1;a<20;a++)
{
if(fgetc(fp)==EOF)
return;
c=a-1;
fseek(fp, c*sizeof(struct worker), SEEK_SET);
fread(&workers[a], sizeof(struct worker), 1, fp);
fclose(fp); //-------你等循环结束了再关闭文件好不好???????
}
}
Top
11 楼HopeInDark(子弹)回复于 2006-05-23 16:32:35 得分 0
mTop
12 楼zhaomu()回复于 2006-05-23 17:58:14 得分 0
帮你看看Top
13 楼lfangqing2003(芳卿)回复于 2006-05-23 19:26:39 得分 0
看了下,建议考虑一下shw014() 的答案Top
14 楼bombwang(王)回复于 2006-05-23 22:43:32 得分 0
有待研究Top
15 楼ainixian2004()回复于 2006-05-25 16:53:24 得分 0
void Data_load()
{
long c;
fp=fopen("worker.txt", "r+t") ;
if(fp!=NULL)
{
for(a=1;a<20;a++)
{
if(fgetc(fp)==EOF)
return;
c=a-1;
fseek(fp, c*sizeof(struct worker), SEEK_SET);
fread(&workers[a], sizeof(struct worker), 1, fp);
/* ——————> */fclose(fp);
}
}
else
{
fp=fopen("worker.txt", "w");
fclose(fp);
a=1;
}
}
for 循环内,不要关闭文件Top
16 楼SAMUEL_NAME()回复于 2006-05-25 21:52:23 得分 0
还好楼主的变量名没有用 a,b,c…… 能够看懂能够看懂……
Top
17 楼cangmoon(彬仔)回复于 2006-05-25 22:58:21 得分 0
终于理解看没有注释的代码的痛苦了~ 哎~ 以后还是要勤劳点~Top
18 楼wenhy2001(小鸟~)回复于 2006-05-25 23:23:24 得分 0
感谢楼主让我明白了加注释的重要性........Top
19 楼MagicCarmack(MagiC++)回复于 2006-05-26 12:53:37 得分 0
哈哈
我们大一的时候也是这个样
现在感觉有这样的努力才好Top
20 楼hot225dog(无忌孩儿)回复于 2006-05-26 13:42:44 得分 0
牛XTop
21 楼foxdeng(江洋大刀)回复于 2006-05-26 19:40:40 得分 0
楼主代码的质量还是可以的,虽然没有注释,但是变量名称都做到了望名思意,又不是非常复杂抽象的操作,这样做是很好的.Top
22 楼yheng2013()回复于 2006-05-26 20:03:17 得分 0
程序可以在精简一些吧Top
23 楼yuanarea(Sail before)回复于 2006-05-27 13:36:44 得分 0
恩
Top
24 楼stone21cn(STONE)回复于 2006-05-30 17:37:33 得分 0
要是这么多原代码,里面PRINTF出来这么多东西,放到16M的FLASH芯片里面是很占空间的,玩玩还好,以后如果找潜入式开发方面的工作,你死定了.呵呵Top
25 楼ymx0330(~~的士小子~~)回复于 2006-05-30 22:07:51 得分 0
lz学习精神可佳!!!
学习学习再学习!
帮顶!Top
26 楼sboom(+-LingCh-+)(爱美人不爱VC)回复于 2006-05-30 22:15:12 得分 0
依我看论坛要改进,要语法高亮和缩进。Top




