高分悬赏C语言题目!!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高分悬赏C语言题目!!!相关的知识,希望对你有一定的参考价值。

通讯录管理系统
内容:具有插入,修改,删除,显示,查询功能的电话簿管理程序。
1,数据包括:人名,工作单位,电话号码E-MAIL地址
2,对记录中的姓名和电话号码进行修改。
3,可增加个和删除记录
4,可显示所有保存的记录
5,可按人名或电话号码查询

要求:采用结构体数组和文件系统,结构体成员包括人名,工作单位,电话号码E-MAIL地址。

做得好的另有追加!!!
按照要求做好的,有高分追加,杜绝去别处复制 到这来粘贴。3楼的,你的好长啊,我都不相信我能写那么长。。。越简单越好,就是让人感觉是我这种菜鸟能写出来的!

我写了个程序 蛮简单的 其实就是一个单链表的操作 这种程序一般也就一百多行就解决了 我运行过的 已经满足了你要的功能 绝对是独一无二的哈 那单链表的头指针就是我的浩方ID
你是地大的吧 程序运行时候要注意不要输入错误 尤其是电话号码 在就是有的语句写的比较长 此页面显示不了自动换行了 你粘贴到VC上时候一定要把那些语句连接起来

#include"stdio.h"
#include"malloc.h"
#include"string.h"
#include"stdlib.h"

typedef struct node

char name[16];
char post[16];
int pnumber;
char email[16];
struct node *next;
body;

void Initiate( body **head)

if((*head=(body *)malloc(sizeof(body)))==NULL)exit(1);
(*head)->next=NULL;


void Insert(body *head,body *x)

body *q;
q=(body *)malloc(sizeof(body));
strcpy(q->name,x->name);
q->pnumber=x->pnumber;
strcpy(q->post,x->post);
strcpy(q->email,x->email);
q->next=head->next;
head->next=q;


void del(body *head,body *x)

body *p;

p=head;
while(strcmp(p->next->name,x->name)!=0) p=p->next;
p->next=p->next->next;
printf("已删除%s",x->name);
printf("的信息!\n");


void change(body *head,body *x)

body *p,*q;
q=x;
p=head;
while(strcmp(p->next->name,q->name)!=0) p=p->next;
p=p->next;
printf("请做修改\n");
printf("name: ");
scanf("%s",p->name);
printf("phone number: ");
scanf("%d",&p->pnumber);
printf("post: ");
scanf("%s",p->post);
printf("email: ");
scanf("%s",p->email);


void searchname( body *head,body *x)

body *p;
p=head->next;
while(strcmp(p->name,x->name)!=0&&p->next!=NULL) p=p->next;
if(strcmp(p->name,x->name)==0)

printf("name %s",p->name);
printf(" phone number %d",p->pnumber);
printf(" post %s",p->post);
printf(" email %s",p->email);

else printf("查无此人!");


void searchnum( body *head,body *x)

body *p;
p=head->next;
while(p->pnumber!=x->pnumber && p->next!=NULL ) p=p->next;
if(p->pnumber==x->pnumber)

printf("name %s",p->name);
printf(" phone number %d",p->pnumber);
printf(" post %s",p->post);
printf(" email %s",p->email);

else printf("查无此人!");


void Show(body *head)

body *p;
p=head;
while(p->next!=NULL)

p=p->next;
printf("name %s",p->name);
printf(" phone number %d",p->pnumber);
printf(" post %s",p->post);
printf(" email %s\n",p->email);



void income(body *x)

printf("name: ");
scanf("%s",x->name);
printf("phone number: ");
scanf("%d",&x->pnumber);
printf("post: ");
scanf("%s",x->post);
printf("email: ");
scanf("%s",x->email);


void main()

body *oppo,one;
int m;
m=0;
Initiate(&oppo);
printf("服务如下 :\n");
printf("1->插入 2->删除 3->姓名查询 4->号码查询 5->修改 6->显示 7->退出");

while(m!=7)

printf("\n选择服务:");
scanf("%d",&m);
if(m==1) income(&one);Insert(oppo,&one);
else if(m==2) printf("要删除对象的姓名:");scanf("%s",one.name);del(oppo,&one);
else if(m==3) printf("要查询对象的姓名:");scanf("%s",one.name);searchname(oppo,&one);
else if(m==4) printf("要查询对象的号码:");scanf("%d",&one.pnumber);searchnum(oppo,&one);
else if(m==5) printf("要修改对象的姓名:");scanf("%s",one.name);change(oppo,&one);
else if(m==6) Show(oppo);
else if(m==7) printf("退出\n");
else printf("error!\n");

参考技术A 要求有些高哦
杜绝复制 粘贴。??

我不在这里回答你怎么给我加分啊
参考技术B #include "stdio.h"
#include "stdlib.h"
#include "string.h"

#define M 50 /*定义常数表示记录数*/

typedef struct /*定义数据结构*/

char name[20];
char orginazation[20];
char phone_number[20];
char email[20];
info_List;

/******以下是函数原型*******/
#if 1
int enterRecord(info_List t[]); //输入记录
void listRecord(info_List t[],int n); //显示记录
void searchRecord(info_List t[],int n); //查找显示记录
int deleteRecord(info_List t[],int n); //删除记录
int addRecord(info_List t[],int n); //插入记录
void saveRecord(info_List t[],int n); //记录保存为文件
int loadRecord(info_List t[],int n); //从文件中读记录,传如的参数为文件记录长度
void displayRecord(info_List t[]); //按序号查找显示记录
void modifyRecord(info_List t[],int n);//修改记录

void printRecord(info_List temp); //显示单条记录
int findRecord(info_List t[],int n,char *s,char ch) ; //查找函数
int menu_select(); //主菜单函数
#endif

/******主函数开始*******/
main()

info_List adr[M]; /*定义结构体数组*/
int length; /*保存记录长度*/
system("CLS"); //清屏
for(;;)/*无限循环*/

switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/

case 0:exit(0); /*如返回值为0则程序结束*/
case 1:length=enterRecord(adr);
break;/*输入记录*/
case 2:listRecord(adr,length);
break; /*显示全部记录*/
case 3:searchRecord(adr,length);
break; /*查找记录*/
case 4:length=deleteRecord(adr,length);
break; /*删除记录*/
case 5:length=addRecord(adr,length);
break; /*插入记录*/
case 6:saveRecord(adr,length);
break; /*保存文件*/
case 7:loadRecord(adr,length);
break; /*读文件*/
case 8:displayRecord(adr);
break; /*按序号显示记录*/
case 9:
modifyRecord(adr,length);
break;


//printf("i=%d",length);
getchar();




/*菜单函数,函数返回值为整数,代表所选的菜单项*/
int menu_select()

char s[3];
int c;
system("CLS"); //清屏
/*读入任意字符*/

printf("\n\n\n\n\n");
printf("********************MENU*********************\n\n");
printf(" 1. Enter record\n");
printf(" 2. List the file\n");
printf(" 3. Search record on name\n");
printf(" 4. Delete a record\n");
printf(" 5. add record \n");
printf(" 6. Save the file\n");
printf(" 7. Load the file\n");
printf(" 8. display record on order\n");
printf(" 9. modify record \n");
printf(" 0. Quit\n");
printf("***********************************************\n");
do
printf("\n Enter you choice(0-9):"); /*提示输入选项*/
gets(s); /*输入选择项*/
c=atoi(s); /*将输入的字符串转化为整型数*/
while(c<0||c>9); /*选择项不在0~9之间重输*/
return c; /*返回选择项,主程序根据该数调用相应的函数*/


/*****************************
输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度
*******************************************/
int enterRecord(info_List t[])

int i;
system("CLS"); //清屏
for(i=0;i<M;i++)

printf("\nplease input record or \n direct press q to exit with name\n\n"); /*提示输入记录*/
printf("\nEnter name: ");
gets(t[i].name);
if(t[i].name[0]=='q'&&t[i].name[1]=='\0')
break;
printf("\nEnter orginazation: ");
gets(t[i].orginazation);
printf("\nEnter phone_number: ");
gets(t[i].phone_number);
printf("\nEnter email: ");
gets(t[i].email);

//system("CLS"); //清屏
printf("\nenter list number :%d",i);
printf("\n name orginazation phone_number email\n");
printf("|---------------------------------------------------------------------------|\n");

printf("| %-16s| %-16s| %-16s| %-16s|\n",t[i].name,t[i].orginazation,t[i].phone_number,t[i].email);

printf("|---------------------------------------------------------------------------|\n");


return i; /*返回记录条数*/


/**********************************
显示记录,参数为记录数组和记录条数
*****************************/
void listRecord(info_List t[],int n)

int i;
system("CLS"); //清屏
printf("\n\n**************************************ADDRES*********************************\n");
printf("\n name orginazation phone_number email\n");
printf("|-------------------------------------------------------------------------------|\n");
//读文件到结构数组中
loadRecord(t,n);
for(i=0;i<n;i++)

printf("list number:%d\n",i+1);
printf("| %-16s| %-16s| %-16s| %-16s|\n",t[i].name,t[i].orginazation,t[i].phone_number,t[i].email);
printf("|-------------------------------------------------------------------------------|\n");
if((i+1)%5==0)//判断输出是否达到5条记录

printf("Press any key Continue...\n");
getchar(); //压任意键继续


printf("\n\n************************************END***********************************\n");
//getchar();


/*查找记录*/
void searchRecord(info_List t[],int n)

char s[20]; //保存待查找姓名字符串
int i; //保存查找到结点的序号
char ch;
system("CLS"); //清屏
do
printf("Search by:\n");
printf("\n 1.By songname");
printf("\n 2.By orginazation");
printf("\n 3.By phone_number");
printf("\n 0.Return to menu\n");
ch=getchar();
while(ch<48||ch>51);
switch(ch)
case '0':
return;
case '1':
printf("please enter name to search.\n");
break;
case '2':
printf("please enter orginazation to search.\n");
break;
case '3':
printf("please enter songname to search.\n");
break;

gets(s);

i=findRecord(t,n,s,ch); //调用find函数,得到一个整数
if(i>(n-1)) //如果整数i值大于n-1,说明没找到
printf("not found\n");
else
printRecord(t[i]); //找到,调用显示函数显示记录
//printf("i=%d,n=%d",i,n);
getchar();


//显示指定的一条记录
void printRecord(info_List temp)

system("CLS"); //清屏
printf("\n\n*******************************************************************************\n");
printf("\n name orginazation phone_number email\n");
printf("|---------------------------------------------------------------------------|\n");

printf("| %-16s| %-16s| %-16s| %-16s|\n",temp.name,temp.orginazation,temp.phone_number,temp.email);

printf("|---------------------------------------------------------------------------|\n");
printf("\n\n\n***************************************END*************************************\n");


/*分类查找函数,参数为记录数组和记录条数以及姓名s */
int findRecord(info_List t[],int n,char *s,char ch)

int i;
/*从第一条记录开始,直到最后一条*/

switch (ch)
case '1':
for(i=0;i<n;i++)
if(strcmp(s,t[i].name)==0)
return i;
break;
case '2':
for(i=0;i<n;i++)
if(strcmp(s,t[i].orginazation)==0)

return i;
break;
case '3':
for(i=0;i<n;i++)
if(strcmp(s,t[i].phone_number)==0)

return i;
break;

return i;


/*删除函数,参数为记录数组和记录条数*/
int deleteRecord(info_List t[],int n)


char s[20]; /*保存待查找姓名字符串*/
int i,j; /*保存查找到结点的序号*/
char ch;
system("CLS"); //清屏
do
printf("\nDelete by:\n");
printf("\n 1.By name");
printf("\n 2.By orginazation");
printf("\n 3.By phone_number");
printf("\n 0.Return to menu\n");
ch=(char)getchar();
while(ch<48||ch>51);
switch(ch)
case '0':
return 0;
case '1':
printf("\nplease enter name to search: ");
break;
case '2':
printf("\nplease enter orginazation to search: ");
break;
case '3':
printf("\nplease enter phone_number to search: ");
break;

gets(s);

i=findRecord(t,n,s,ch); /*调用find函数*/
if(i>n-1) /*如果i>n-1超过了数组的长度*/
printf("no found not deleted\n"); /*显示没找到要删除的记录*/
else

printRecord(t[i]); /*调用输出函数显示该条记录信息*/
printf("Are you sure delete it(y/n)\n"); /*确认是否要删除*/
ch=(char)getchar(); /*输入一个整数0或1*/
if(ch=='y'||ch=='Y') /*如果确认删除整数为1*/

for(j=i+1;j<n;j++) /*删除该记录,实际后续记录前移*/

strcpy(t[j-1].name,t[j].name); /*将后一条记录的姓名拷贝到前一条*/
strcpy(t[j-1].orginazation,t[j].orginazation);
strcpy(t[j-1].phone_number,t[j].phone_number);
strcpy(t[j-1].email,t[j].email);


n--; /*记录数减1*/


return n; /*返回记录数*/


/*保存函数,参数为结构体数组和记录数*/
void saveRecord(info_List t[],int n)

int i;
FILE *fp; /*指向文件的指针*/
if((fp=fopen("record.txt","wb"))==NULL) /*打开文件,并判断打开是否正常*/

printf("can not open file\n");
exit(1);

printf("\nSaving file\n"); /*输出提示信息*/

for(i=0;i<n;i++)

fprintf(fp,"%-20s%-20s%-20s%-20s",t[i].name,t[i].orginazation,t[i].phone_number,t[i].email);/*格式写入记录*/
fprintf(fp,"\r\n");

fclose(fp);
printf("****save success***\n"); /*显示保存成功*/


/*读入函数,参数为结构体数组*/
int loadRecord(info_List t[],int n)

int i=0;
FILE *fp;
if((fp=fopen("record.txt","rb"))==NULL)

printf("can not open file\n");
exit(1);

for(i=0;i<n;i++)
fscanf(fp,"%-20s%-20s%-20s%-20s",t[i].name,t[i].orginazation,t[i].phone_number,t[i].email);/*按格式读入记录*/

fclose(fp); /*关闭文件*/
printf("You have success read data from file!!!\n");
return i+1;


/*按序号显示记录函数*/
void displayRecord(info_List t[])

int id,n;
FILE *fp; /*指向文件的指针*/
if((fp=fopen("record.txt","rb"))==NULL) /*打开文件*/

printf("can not open file\n");
exit(1);

printf("Enter order number...\n"); /*显示信息*/
scanf("%d",&id); /*输入序号*/
fscanf(fp,"%d",&n); /*从文件读入记录数*/
if(id>=0&&id<n) /*判断序号是否在记录范围内*/

fseek(fp,(id-1)*sizeof(info_List),1); /*移动文件指针到该记录位置*/
printRecord(t[id]); /*调用输出函数显示该记录*/
printf("\r\n");

else
printf("no %d number record!!!\n ",id); /*如果序号不合理显示信息*/
fclose(fp);


int addRecord(info_List t[],int n)

info_List temp; /*新插入记录信息*/
int i,j;
char s[20]; /*确定插入在哪个记录之前*/

printf("\nplease input record or \n direct press q to exit with name\n\n"); /*提示输入记录*/
printf("\nEnter name: ");
gets(temp.name);
if(temp.name[0]=='q'&&temp.name[1]=='\0')
return n;
printf("\nEnter orginazation: ");
gets(temp.orginazation);
printf("\nEnter phone_number: ");
gets(temp.phone_number);
printf("\nEnter email: ");
gets(temp.email);

system("CLS");

printf("\n name orginazation phone_number email\n");
printf("|---------------------------------------------------------------------------|\n");

printf("| %-16s| %-16s| %-16s| %-16s|\n",temp.name,temp.orginazation,temp.phone_number,temp.email);

printf("|---------------------------------------------------------------------------|\n");

printf("please input locate name \n");
gets(s); /*输入插入位置的姓名*/
i=findRecord(t,n,s,'1'); /*调用find,确定插入位置*/
for(j=n-1;j>=i;j--) /*从最后一个结点开始向后移动一条*/

strcpy(t[j+1].name,t[j].name);
strcpy(t[j+1].orginazation,t[j].orginazation);
strcpy(t[j+1].phone_number,t[j].phone_number);
strcpy(t[j+1].email,t[j].email);

strcpy(t[i].name,temp.name);
strcpy(t[i].orginazation,temp.orginazation);
strcpy(t[i].phone_number,temp.phone_number);
strcpy(t[i].email,temp.email);
n++; /*记录数加1*/
return n; /*返回记录数*/


void modifyRecord(info_List t[],int n)

int i;
char a[30];
loadRecord(t,n);//先读出文件
listRecord(t,n);//显示全部信息
printf("input the record number you want to modify:\n\
or you can type 0 back to menu!\n");
for(;;)

printf("enter list number:\n");
scanf("%d",&i);
if(i==0)
break;
else if(i>n)
break;
else

printf("\nEnter name: ");
getchar();
gets(a);
strcpy(t[i].name,a);
printf("\n%s:%s: ",t[i].name,a);

printf("\nEnter orginazation: ");
gets(a);
strcpy(t[i].orginazation,a);
printf("\n%s:%s: ",t[i].orginazation,a);



//写入文件
saveRecord(t,n);
参考技术C 。。。我感觉菜鸟写程序才会写得长 参考技术D 神都能找到的通讯录程序,大约900行。
分给我,邮箱留下,马上传。
第5个回答  2012-07-13 趁人之危
弹指之间
网漏吞舟
DXdl

C语言编程文本保存问题。。高分悬赏

#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#define MAX 100
typedef struct student

char num[11];
int math;
int eng;
int chin;
int ave;
int totle;
stu;
void main()

stu a[MAX];
int i=0,n=0,k;
FILE *fp;
if((fp=fopen("e:\\student.txt","a+"))==NULL)

printf("open file error!\n");
exit(0);


for(i=0;fread(&a[i],sizeof(stu),1,fp)!=0;i++)
n=i;
printf("请输入要添加的信息");
printf("\n请输入第%d个学生信息:\n",n+1);
printf("学号:\n");
scanf("%s",a[n].num);
printf("math成绩:\n");
scanf("%d",&a[n].math);
printf("english成绩:\n");
scanf("%d",&a[n].eng);
printf("chin成绩:\n");
scanf("%d",&a[n].chin);
a[n].totle=a[n].math+a[n].eng+a[n].chin;
a[n].ave=a[n].totle/3;
for(k=n-1;k>=0;k--)
if(strcmp(a[k].num,a[n].num)==0)

rintf("该学生已经存在,请重新输入");
break;


if((fp=fopen("e:\\student.txt","wb"))==NULL)

printf("open file error!\n");
exit(0);


for(i=0;i<n;i++)
fwrite(&a[i],sizeof(a[0]),1,fp);
fclose(fp);

我觉得这个程序是要完成对学生姓名和我成绩的录入吧?如果不是就请当我没有回答。
首先,第一个for函数就有问题。按我的理解,你应该在一对花括号。应该在n=i前加 ,在break后再追加一个 。这样才能实现对多个数据的输入,否则一直执行
for(i=0;fread(&a[i],sizeof(stu),1,fp)!=0;i++) n=i; 至到fread(&a[i],sizeof(stu),1,fp)==0时。再执行下面的语句。还有判断是否此人已经输入了,函数名写错了 rintf ,应该是printf。还有程序还个缺点,此程序还确实一个结束录入的语句,不然要一直录入,直到
fp=fopen("e:\\student.txt","wb")==0时才结束,而且不能正确保存信息。还有最后一个if语句也有错,
fp=fopen("e:\\student.txt","wb")也有问题。此语句应该是为后面输出学生信息,为读做准备,应该改为
fp=fopen("e:\\student.txt","rb")。另外还有个小瑕疵,平均分不一定整数,应该写为float,除的时候应该除3.0。我没有编辑器,修改的不知道到结果怎么样了,目前我还没有发现其他大问题。说句题外话,main函数太复杂,需要简化,你应该多调用函数来实现。实现同样功能的程序,最简单的才是最好的。希望我说的对你有用追问

谢谢。。可以保存了。。。但是出现的是乱码。。。还有for(i=0;fread(&a[i],sizeof(stu),1,fp)!=0;i++) n=i; 这一句好像无法计算文件中总共存有多少个,每次执行都是现显示n=0,还有可是麻烦说下那个结束录入语句要怎样,
0309101010蘗 : W N ? 这是存进去后乱码的情况

追答

#include
#include
#include
#define MAX 100
typedef struct student

char num[10];
int math;
int eng;
int chin;
float ave;
int totle;
stu;
void main()

stu a[MAX];
int i=0,n=0,k,m;
FILE *fp;
if((fp=fopen("e:\\student.txt","wb"))==NULL)

printf("open file error!\n");
exit(0);

printf("请输入要录入信息的人数(小于101):");
scanf("%d",&m);
for(i=0;i0;k--)
if(strcmp(a[k].num,a[n].num)==0)

printf("该学生已经存在,请重新输入");
i-- ;/*用来覆盖原来那个相同的*/
break;


for(i=0;i<n+1;i++)

printf("%-6s%5d%5.1f",a[i].num,a[i].totle,a[i].ave);
printf("\n");

fclose(fp);

我没有运行过,你自己试试吧

参考技术A 先说下错误。
读取,文件是用a+方式打开,这读取数据,因为文件指针在最末的关系,读取出来的数据是空的,所以n永远为0。
其次,在写数据前,没有fclose文件就再fopen一次,这是正确的文件操作方式?
最后,老实说,看你的代码头很痛,不是说代码很难,而是这个格式实在太难看,很多时候,一看到这种混乱的代码,直接看都不看就关掉的。在诸多IDE的今天,写一段格式整齐的代码很难么,不要跟我说你是用windows记事本写代码的。

最最后,下面是整理并修改正确的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#ifndef MAX_NUM
#define MAX_NUM 100
#endif

typedef struct student

char num[11];
int math;
int eng;
int chin;
int ave;
int totle;
stu;

void main()

stu a[MAX_NUM];
int i = 0, n = 0, k = 0;
FILE *fp = fopen("e:\\student.txt","rb+");
for(n = 0; fp && fread(&a[n], 1, sizeof(stu), fp) != 0; ++n) ;
printf("请输入要添加的信息");
printf("\n请输入第%d个学生信息:\n",n + 1);
printf("学号:\n");
scanf("%s",a[n].num);
printf("math成绩:\n");
scanf("%d",&a[n].math);
printf("english成绩:\n");
scanf("%d",&a[n].eng);
printf("chin成绩:\n");
scanf("%d",&a[n].chin);
a[n].totle=a[n].math+a[n].eng+a[n].chin;
a[n].ave=a[n].totle/3;
for(k = n-1; k >= 0; k--)

if(strcmp(a[k].num,a[n].num) == 0)

printf("该学生已经存在,请重新输入");
break;


if(fp == NULL && (fp = fopen("e:\\student.txt","wb")) == NULL)

printf("open file error!\n");
exit(0);

fseek(fp, 0, SEEK_SET);
for(i = 0; i <= n; i++)
fwrite(&a[i], 1, sizeof(a[0]), fp);
fclose(fp);
追问

真的非常感谢。。。。由于还算是初学者还在学习中。。。。会慢慢改进的。。。多谢指导。。。不过那个存进去为什么成绩存进去的是乱码 存进文本的内容如下
0309101201 蘗 X W X  麻烦再指导下哦

追答

因为使用"wb"方式打开文件再写入的原因,如果要不乱码文本,需要修改读写的逻辑,比现在会麻烦很多。要将每个struct的字段按一定的规则读写才行。

本回答被提问者采纳
参考技术B char name[15]; /*姓名*/
float jbgz; /*基本工资*/
float koukuan; /*扣款*/
float yfgz; /*应发工资*/
float shuijin; /*税金*/
float sfgz; /*实发工资*/
struct z1 *prior;/*前驱指针*/
struct z1 *next;/*后继指针*/
SALARY; /*结构体类型名*/
struct z1 *First; /*双链表头指针*/
struct z1 *Last; /*双链表尾指针*/
/******函数原型*********/
void init(); /*初始化*/
void create(); /*创建链表*/
void calc(); /*计算应发工资*/
void delete(); /*删除*/
void search(); /*查找*/
void save(); /*保存文件*/
void load(); /*读取文件*/
void computer(); /*计算所需各种票面张数*/
void insert(); /*插入*/
void append(); /*追加*/
void copy(); /*复制文件*/
void sort(); /*排序*/
void index(); /*索引*/
void total(); /*分类合计*/
void list(); /*显示所有数据*/
void print(SALARY *p); /*输出单条记录*/
void display(); /*随意逐条显示*/
float fax(float x); /*计算税金*/
int menu_select(); /*主菜单*/
/*******主函数开始**********/
main()

int i;
clrscr();
for(;;)

switch(menu_select()) /*调用菜单函数返回一个整数值*/

case 0:init();break; /*初始化*/
case 1:create();break; /*输入数据创建双链表*/
case 2:list();break; /*显示所有数据*/
case 3:display();break; /*单条显示*/
case 4:calc();break; /*计算实发工资*/
case 5:search();break; /*查找职工信息数据*/
case 6:delete();break; /*删除记录*/
case 7:insert();break; /*插入记录*/
case 8:append();break; /*追加记录*/
case 9:save();break; /*保存文件*/
case 10:load(); break; /*读取文件*/
case 11:copy();break; /*复制文件*/
case 12:sort();break; /*按实发工资升序排序*/
case 13:computer();break; /*计算所需票面数*/
case 14:index();break; /*按职工号索引*/
case 15:total();break; /*按部门求合计*/
case 16:exit(0); /*退出*/



/*菜单函数,函数返回值为整型,代表所选的菜单项*/
menu_select()

char *f[]= /*定义菜单字符串数组*/
"**************MENU*************", /*菜单的标题行*/
" 0. init list", /*初始化双链表*/
" 1. Enter list", /*输入数据,创建双链表*/
" 2. List all \n", /*显示所有记录*/
" 3. Display record by step", /*显示单条记录*/
" 4. Calc the salary", /*计算实发工资*/
" 5. Search record on name", /*查找记录*/
" 6. Delete a record", /*删除记录*/
" 7. Insert record to list", /*插入记录*/
" 8. Append record to file", /*追加记录*/
" 9. Save data to the file", /*保存文件*/
" 10. Load data from the file",/*读取文件*/
" 11. Copy the file to new file", /*复制文件*/
" 12. Sort on sfgz", /*排序*/
" 13. Computer ticket number", /*计算所需票面数*/
" 14. Index on number", /*索引*/
" 15. Total on number", /*分类合计*/
" 16. Quit" ; /*退出*/
char s[80];
int i;
int key=0; /*记录所压键值*/
int c=0;
gotoxy(1,25); /*移动光标*/
printf("press any key enter menu......\n");/*压任意键进入主菜单*/
getch();
clrscr(); /*清屏*/
textcolor(YELLOW); /*设置文本颜色为黄色*/
textbackground(BLUE); /*设置背景颜色为兰色*/
gotoxy(10,2);
putch(0xda); /*输出左上角边框┏*/
for(i=1;i<44;i++)
putch(0xc4); /*输出上边框水平线*/
putch(0xbf); /*输出右上角边框 ┓*/
for(i=3;i<22;i++)/*输出左右两边的垂直线*/

gotoxy(10,i);putch(0xb3);
gotoxy(54,i);putch(0xb3);

gotoxy(10,22);putch(0xc0); /*输出左上角边框┗*/
for(i=1;i<44;i++)
putch(0xc4); /*输出下边框水平线*/
putch(0xd9); /*输出右下角边框┛*/
window(11,3,53,21); /* 制作显示菜单的窗口,大小根据菜单条数设计*/
clrscr(); /*清屏*/
for(i=0;i<18;i++)

gotoxy(10,i+1);
cprintf("%s",f[i]); /*输出菜单项数组*/

i=1;
gotoxy(10,2); /*设置默认选项在第一项*/
textbackground(LIGHTGREEN);/*设置背景颜色为浅绿*/
cprintf("%s",f[1]); /*输出菜单项,表示选中*/
gotoxy(10,2); /*移动光标到菜单的第一项*/
while(key!=13) /*所压键不是回车键时*/

while(bioskey(1)==0); /*查询是否压下了一个键*/
key=bioskey(0); /*返回下一个在键盘压下的键*/
key=key&0xff?key&0xff:key>>8; /*对所压的键进行判断*/
gotoxy(10,i+1);
textbackground(BLUE);/*设置背景颜色为蓝色*/
cprintf("%s",f[i]); /*输出菜单项*/
if(key==72) i=i==1?17:i-1; /*如压向上光标键↑,i减1,如已到第一行再上移,则到最后一行*/
if(key==80)i=i==17?1:i+1; /*如压向下光标键↓,i加1,如已到最后一行再下移,则到第一行*/
gotoxy(10,i+1); /*光标移动i的下一项*/
textbackground(LIGHTGREEN); /*将背景颜色设为浅绿*/
cprintf("%s",f[i]); /*输出菜单项*/
c=i-1; /*给代表菜单选项的整数赋值*/

textbackground(BLACK); /*设置背景颜色为黑色*/
window(1,1,80,25); /*恢复原窗口大小*/
return c; /*返回代表菜单选项的整数值*/

/*初始化函数*/
void init()

First=NULL;
Last=NULL;

/*输入数据,创建双链表*/
void create()

int x; /*记录行坐标*/
int i; /*记录输入记录数*/
int flag=0; /*做结束标记*/
float temp; /*定义临时变量*/
SALARY *info,*p; /*定义临时变量*/
if(First!=NULL)
init();/*如果头指针为空,调用初始化函数*/
p=First; /*从头指针开始*/
for(;;)

if(flag==1)
break; /*如果flag=1,结束输入*/
i=0;
x=0; /*确定移动的行坐标*/
clrscr(); /*清屏*/
gotoxy(1,3);
printf("*************gongziguanli*************");/*输出标题*/
gotoxy(1,4);
printf(" --Enter @ end--");/*提示输入@结束*/
gotoxy(1,5);
printf("|------------------------------------|");/*输出表格的起始线*/
gotoxy(1,6);
printf("| no | name | jbgz |");/*输出字段标题,注意空格数*/
for(;;)

gotoxy(1,7+x);
printf("|----------|----------------|--------|");/*输出表格的水平线*/
info=(SALARY *)malloc(sizeof(SALARY));/*申请一个记录空间*/
if(!info)

printf("\nout of memory");/*如没有得到空间,输出内存溢出信息*/
exit(0);/*退出程序*/

info->next=NULL;/*新结点的后继为空*/
info->prior=NULL;/*新结点的前驱为空*/
gotoxy(1,8+x);printf("|"); /*输出数据间的分割线*/
gotoxy(12,8+x);printf("|");
gotoxy(29,8+x);printf("|");
gotoxy(38,8+x);printf("|");
gotoxy(2,8+x);/*光标到输入编号位置*/
inputs(info->no,10);/*输入编号,并验证长度不超过10*/
if(info->no[0]=='@')

flag=1;
break;
/*编号首字符为@结束输入*/
gotoxy(13,8+x); /*光标到输入姓名位置*/
inputs(info->name,14); /*输入姓名,并验证长度不超过14*/
gotoxy(30,8+x); /*光标到输入基本工资位置*/
scanf("%f",&temp); /*输入基本工资到临时变量*/
info->jbgz=temp; /*基本工资赋值*/
info->koukuan=0; /*初始扣款为0,待计算工资时输入*/
info->sfgz=0; /*初始实发工资为0,待计算工资时计算*/
info->shuijin=0; /*初始税金为0,待计算工资时计算*/
info->yfgz=0; /*初始应发工资为0,待计算工资时计算*/
if(p==NULL)/*如果p为空,说明输入的是第一个结点*/

First=Last=info;/*头指针和尾指针*/
First->prior=NULL; /*头指针的前驱是空*/
Last->next=NULL; /*尾指针的后继是空*/

else /*插入的结点不是第一结点,则插入在头结点之前*/

info->next=p;/*新结点的后继指向原来的头结点*/
info->prior=p->prior;/*新结点的前驱指向原来的头结点的前驱*/
p->prior=info;/*原来结点的前驱指向新结点*/

p=info; /*新结点变为p结点,暂时的头结点*/
First=info; /*新结点变为头结点*/
x+=2; /*因为水平线,将光标下移两行*/
gotoxy(1,8+x);
i++; /*输入记录数加1*/
if(i%9==0)
break; /*输入9个记录,换一页输入*/

gotoxy(1,8+x);

printf("|----------|----------------|--------|");/*输出结尾水平线*/

/*字符串输入和验证函数*/
inputs(char *s, int count)

char p[255];
do
scanf("%s",p);/*输入字符串*/
if(strlen(p)>count)printf("\n too long! \n");/*进行长度校验,超过count值重输入*/
while(strlen(p)>count);
strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/

/*显示链表*/
void list()

int i=0,n; /*记录输出行数*/
SALARY *p; /*定义移动指针*/
clrscr(); /*清屏*/
p=First; /*从头指针开始*/
while(i%10==0&&p!=NULL) /*外循环控制换页*/

i=0; /*记录一页的输出行数*/
clrscr(); /*清屏*/
printf("\n\n\n"); /*换行三次*/
printf("*************************************SALARY***********************************\n"); /*输出大标题*/
printf("|nO | name | jbgz | koukuan | yfgz | shuijin | sfgz |\n"); /*输出字段标题*/
printf("|----------|---------------|---------|---------|---------|---------|---------|\n"); /*输出水平线*/
while(p!=NULL) /*当p不为空时*/

printf("|%-10s|%-15s|%9.2f|%9.2f|%9.2f|%9.2f|%9.2f|\n",
p->no,p->name,p->jbgz,p->koukuan,p->yfgz,p->shuijin,p->sfgz);
p=p->next; /*指针后移*/
i++; /*输出行数加1 */
if(i%10==0)
break; /*如果满10行,跳出内循环*/

printf("****************************************end***********************************\n"); /*输出本页的结束行*/
printf("Press any key congtinue...\n");
getch(); /*输出一页暂停一下,压任意键继续*/
/*返回到外循环,准备下一页的输出*/

/*单条显示记录*/
void display()

int ch; /*菜单选项字符*/
SALARY *p; /*定义临时指针*/
clrscr(); /*清屏*/
p=First; /*从头指针开始*/
if(p==NULL) /*指针为空,即链表为空,返回主函数*/

printf("record is empty!\n");
return;

else

print(p); /*调用输出函数显示头结点信息*/
for(;;) /*循环开始*/

printf("\n\n0. Quit 1. Prior 2. Next 3. First 4.Last \n\n");
/*菜单项Quit退出 Prior前驱 Next后继 First第一条 Last最后一条*/
printf("\nplease select 0~4:"); /*提示输入菜单选项0~4*/
scanf("%d",&ch); /*输入菜单选项0~4*/
if(ch==0) break; /*如果选项为0,退出*/
switch(ch) /*开关语句根据选项字符判断*/

case 1:p=p->prior;if(p==NULL)p=First;break; /*指向前驱,没有前驱指向第一个*/
case 2:p=p->next;if(p==NULL) p=Last;break; /*指向后继,没有后继指向最后一个*/
case 3:p=First;break; /*指向第一个结点*/
case 4:p=Last;break; /*指向最后一个结点*/

print(p); /*调用输出函数显示指针所指结点信息*/



/*输出指针所指结点信息*/
void print(SALARY *p)

if(p) /*如果指针不为空,则显示信息*/

clrscr(); /*清屏*/
printf("\n\n\n"); /*换行*/
printf("************************************SALARY************************************\n"); /*输出标题信息*/
printf("|no | name | jbgz | koukuan| yfgz | shuijin | sfgz |\n"); /*输出字段标题*/
printf("|----------|---------------|---------|---------|---------|---------|---------|\n"); /*输出分割线*/
printf("|%-10s|%-15s|%9.2f|%9.2f|%9.2f|%9.2f|%9.2f|\n", p->no,p->name,
p->jbgz,p->koukuan,p->yfgz,p->shuijin,p->sfgz);/*输出结点信息*/
printf("***************************************end***************************** *******\n"); /*输出结束标记*/


/*计算实发工资*/
void calc()

int x; /*行坐标*/
int i=0; /*记录数*/
float temp; /*临时变量扣款*/
SALARY *p; /*移动指针*/
clrscr(); /*清屏*/
p=First; /*从头指针开始*/
while(p!=NULL) /*当p不为空时,也就是有记录时,外循环控制换页*/

x=0;
clrscr();
gotoxy(1,3);
printf("***************************gongziguanli************************************"); /*输出标题*/
gotoxy(1,5);
printf("|--------------------------------------------------------------------------|");
gotoxy(1,6);/*下面输出字段标题*/
printf("| no | name | jbgz | koukuan | yfgz |shuijin | sfgz |");
while(p!=NULL) /*当p不为空时,也就是有记录时,内循环控制处理9条*/

gotoxy(1,7+x);
printf("|----------|----------------|--------|----------|--------|--------|--------|");
gotoxy(1,8+x);printf("|");
gotoxy(12,8+x);printf("|");
gotoxy(29,8+x);printf("|");
gotoxy(38,8+x);printf("|");
gotoxy(49,8+x);printf("|");
gotoxy(58,8+x);printf("|");
gotoxy(67,8+x);printf("|");
gotoxy(76,8+x);printf("|");
gotoxy(2,8+x);
printf("%-10s",p->no); /*输出编号*/
gotoxy(13,8+x);
printf("%-15s",p->name); /*输出姓名*/
gotoxy(30,8+x);
printf("%.2f",p->jbgz); /*输出基本工资*/
gotoxy(39,8+x);
scanf("%f",&temp); /*输入扣款*/
p->koukuan=temp; /*扣款字段赋值*/
p->yfgz=p->jbgz-p->koukuan; /*计算应发工资=基本工资-扣款*/
gotoxy(50,8+x);
printf("%.2f",p->yfgz); /*输出应发工资*/
gotoxy(59,8+x);
p->shuijin=(p->yfgz-1000)*fax(p->yfgz); /*否则按税率计算税金*/
printf("%.2f",p->shuijin); /*输出税金*/
gotoxy(68,8+x);
p->sfgz=p->yfgz-p->shuijin; /*计算实发工资*/
printf("%-8.2f",p->sfgz); /*输出实发工资*/
x+=2; /*行坐标下移两行*/
i++; /*记录数加1*/
if(i%9==0)break; /*记录数超过9条,跳出内循环*/
p=p->next; /*指针后移,处理下一条*/

gotoxy(1,7+x);
printf("|----------|----------------|--------|----------|--------|--------|--------|\n"); /*输出结束行*/
printf("Press any key congtinue...\n");
getch();


/*根据应发工资,计算税率*/
float fax(float x)

float f1;
if(x<1000)
return 0; /*小于1000,返回0*/
switch((int)(x/1000))

case 1:f1=0.05;break; /*1000~1999,返回0.05*/
case 2:f1=0.1;break; /*2000~2999,返回0.1*/
case 3:f1=0.15;break; /*3000~3999,返回0.15*/
case 4:f1=0.2;break; /*4000~4999,返回0.2*/
default:f1=0.3;break; /*5000以上,返回0.3*/

return f1;

/*计算票面张数*/
void computer()

SALARY *p;
int i=0,a[7]=,t100,t50,t20,t10,t5,t2,t1;/*设置数组和临时变量保存票面张数*/
float t; /*过渡变量,保存当前剩余工资*/
p=First; /*移动指针从头指针开始*/
while(p!=NULL) /*当p不为空时*/

t100=(int)p->sfgz/100; /*计算100元张数*/
a[0]=a[0]+t100; /*累加保存*/
t=p->sfgz-t100*100; /*剩余工资*/
t50=(int)(t/50); /*计算50元张数*/
a[1]=a[1]+t50; /*累加保存*/
t=t-t50*50; /*剩余工资*/
t20=(int)(t/20); /*计算20元张数*/
a[2]=a[2]+t20; /*累加保存*/
t=t-t20*20; /*剩余工资*/
t10=(int)(t/10); /*计算10元张数*/
a[3]=a[3]+t10; /*累加保存*/
t=t-t10*10; /*剩余工资*/
t5=(int)(t/5); /*计算5元张数*/
a[4]=a[4]+t5; /*累加保存*/
t=t-t5*5; /*剩余工资*/
t2=(int)(t/2); /*计算2元张数*/
a[5]=a[5]+t2; /*累加保存*/
t=t-t2*2; /*剩余工资*/
t1=(int)(t); /*计算1元张数*/
a[6]=a[6]+t1; /*累加保存*/
p=p->next; /*指针后移,处理下一条记录*/

clrscr(); /*清屏*/
printf("\n\n\n***********ticket number***************\n"); /*输出标题*/
printf("--100-----50------20-----10-----5------2------1------\n");
/*输出张数标题*/
for(i=0;i<7;i++)
printf("%5d ",a[i]);/*输出所需的张数*/
printf("\n");/*换行*/

/*按编号查找记录*/
SALARY *find(char *no)

SALARY *p; /*定义移动指针*/
p=First; /*从头指针开始*/
while(p) /*当p不为空时*/

if(!strcmp(no,p->no))
return p; /*比较相等,查找成功,返回指针*/
p=p->next; /*不相等指针后移*/

printf("not found\n"); /*没有找到*/
return NULL; /*返回为空指针*/
参考技术C 在第二次打开文件前先关闭。 参考技术D 尾段的
for(i=0;i<n;i++)
改为
for(i=0;i<=n;i++)
试试追问

还是不行

追答

前面统计个数略改了一下 这样就能看到你存的结果了
文件以二进制保存,即数字65用记事本看是A 所以有乱码

后面是完整的程序 多条记录录入 学号转入0结束
#include
#include
#include

#ifndef MAX_NUM
#define MAX_NUM 100
#endif

typedef struct student

char num[11];
int math;
int eng;
int chin;
float ave;
int totle;
stu;

void main()

stu a[MAX_NUM];
int i = 0, n = 0, k = 0;
FILE *fp = fopen("e:\\student.txt","rb+");
clrscr();
printf("学号\t数:\t英:\t语:\t均:\t总:\t\n");
for(n = 0; fp && fread(&a[n], 1, sizeof(stu), fp) != 0; ++n)
printf("%s\t%d\t%d\t%d\t%f\t%d\t\n",
a[n].num,a[n].math,a[n].eng,a[n].chin,a[n].ave,a[n].totle);
printf("*************************************************\n");
if(fp == NULL && (fp = fopen("e:\\student.txt","wb")) == NULL)

printf("open file error!\n");
exit(0);

fseek(fp, 0, SEEK_SET);
printf("请输入要添加的信息");
do
printf("\n请输入第%d个学生信息:\n",n + 1);
printf("学号:\n");
scanf("%s",a[n].num);
if(!strcmp(a[n].num,"0"))break;
printf("math成绩:\n");
scanf("%d",&a[n].math);
printf("english成绩:\n");
scanf("%d",&a[n].eng);
printf("chin成绩:\n");
scanf("%d",&a[n].chin);
a[n].totle=a[n].math+a[n].eng+a[n].chin;
a[n].ave=a[n].totle/3;
for(k = n-1; k >= 0; k--)

if(strcmp(a[k].num,a[n].num) == 0)

printf("该学生已经存在,请重新输入");
break;


/* for(i = 0; i <= n; i++)
fwrite(&a[i], sizeof(a[i]),1 , fp);*/
fwrite(&a[n], sizeof(a[n]),1 , fp);
n++;
while(1);
fclose(fp);


如果一次不能输入多条记录 就把fseek删掉
附英文下运行结果

以上是关于高分悬赏C语言题目!!!的主要内容,如果未能解决你的问题,请参考以下文章

高分悬赏,c语言高手请进

C语言高手进(高分悬赏)

C语言编程文本保存问题。。高分悬赏

急!高分悬赏!求c语言高手!!!二叉树输入中如何判断输入是不是合法?

F(0)=0 F(1)=1 F(2)=2 F(N)=F(N-1)+F(N-2)+F(N-3) N>3 语言用c或者c++,采用栈来实现这个函数。高分悬赏~~

c语言程序设计 题目:某医药公司售货系统 求C语言高手帮下忙,成功后高分奖励,谢谢