❶ 用C语言编通讯录,编译时出现两个问题,望大神帮助一下
typedef contact Con { 需要改成 typedef struct Con {
typedef contact Node { 需要改成 typedef struct Node {
❷ c语言同学录程序设计遇到困难,这个程序能运行但是有些功能实现不了,程序几百行不能完全打出来,求指教
同学录 当然链表做方便,还没试过用数组做,代码你不贴出来,大家也不能帮你
❸ c语言 同学录程序设计 我现在只能简单的输入信息什么的,求大神帮帮忙QAQ
我说三个注意点,第一,除数不能为零,第二,题目没有要求多实例,第三,输入第一个数(K)如果是大于20的你的数组纵向会越界。一个建议,输入时候已经可以判断,无需数组存储可以直接判定,
❹ C语言链表建立同学录问题!
这个问题很简单的,
pnext=(CM
*)malloc(sizeof(CM));
p->next=pnext;
printf("请输入第%d个同学的学号:\n",i);
scanf("%s",p->num);
printf("请输入第%d个同学的姓名:\n",i);
scanf("%s",p->Name);
printf("请输入第%d个同学的电话:\n",i);
scanf("%s",p->Tel);
pnext->next=NULL;
p=pnext;
}
这里应该用pnext而不能用p,用p就改变了首节点,肯定要出错了!
❺ 求一份c语言同学录程序设计报告书
《程序设计基础》课程实验报告
实验名称 实验序号
学 号 姓 名 班 级
实验日期 指导教师 成 绩
一、实验目的和要求
1.
2.
3.
二、实验预习内容
1.
2.
3.
三、实验项目摘要
1.
2.
3.
四、实验结果与分析
1.
2.
3.
实验报告编写说明:
1. 实验名称和实验编号:填写以教师给出的实验内容为准;
2. 班级:填写学生所在的自然班号;
3. 实验目的和要求、实验项目摘要:填写以教师给出的实验内容为准;
4. 实验预习内容:填写学生实验前所做的准备情况(包括资料查阅和上机预习);
5. 实验结果与分析:填写实验结果完成情况、所编制的C语言程序、实验中所遇问题及解决方法(或体会);
6. 成绩:由指导教师填写,采用中文五级制。
7. 报告的文件名:学号+姓名+(实验号)如:0510211101张三(1)
注:* 实验报告填写时,注意输入信息的字体格式(宋体、五号),如果用复制应采用选择性粘贴的 “无格式文本”方法完成;
❻ C语言同学录问题,我的同学录运行老出现问题,帮我看下,最后一个修改模块帮写下
用链表写了一个简单的程序
可以添加,删除。。按照学号查找。。
#include<string.h>
#define NULL 0
#define TYPE struct xinxi
#define LEN sizeof(struct xinxi)
struct xinxi /*定义一个名为“xinxi”的结构型,共含5个成员*/
{
int xuehao; /*学号*/
char xingming[6]; /*姓名*/
char xingbie; /*性别*/
int nianling; /*年龄*/
float chengji[5]; /*5科成绩*/
char mima[10]; /*密码口令*/
struct xinxi *next; /*指针*/
};
TYPE *creat(int n)
{
struct xinxi *head,*pf,*pb;
int i;
for(i=0;i<n;i++)
{
pb=(TYPE *)malloc(LEN);
printf("\n输入学号:");
scanf("%d",&pb->xuehao);
printf("\n输入姓名:");
scanf("%s",&pb->xingming);
printf("\n输入年龄:");
scanf("%d",&pb->nianling);
printf("\n输入性别,用‘f’‘m’表示:");
scanf("%c",&pb->xingbie);
if(i==0)
pf=head=pb;
else
pf->next=pb;
pb->next=NULL;
pf=pb;
}
return(head);
}
TYPE * delete(TYPE *head,int xuehao)
{
TYPE *pf,*pb;
if(head==NULL) /*如为空表, 输出提示信息*/
{
printf("\n没有信息!\n");
goto end;
}
pb=head;
while (pb->xuehao!=xuehao&&pb->next!=NULL) /*当不是要删除的结点,而且也不是最后一个结点时,继续循环*/
{
pf=pb;
pb=pb->next; /*pf指向当前结点,pb指向下一结点*/
}
if(pb->xuehao==xuehao)
{
if(pb==head) /*如找到被删结点,且为第一结点,则使head指向第二个结点*/
head=pb->next;
else
pf->next=pb->next; /*否则使pf所指结点的指针指向下一结点*/
free(pb);
printf("找到信息,已删除!\n");
}
else
printf("没找到信息!\n");
end:
return head;
}
TYPE * insert(TYPE * head,TYPE * pi)
{
TYPE *pb ,*pf;
pb=head;
if(head==NULL) /*空表插入*/
{
head=pi;
pi->next=NULL;
}
else
{
while((pi->xuehao>pb->xuehao)&&(pb->next!=NULL)) /*找插入位置*/
{
pf=pb;
pb=pb->next;
}
if(pi->xuehao<=pb->xuehao)
{
if(head==pb)
head=pi; /*在第一结点之前插入*/
else
pf->next=pi; /*在其它位置插入*/
pi->next=pb;
}
else
{
pb->next=pi; /*在表末插入*/
pi->next=NULL;
}
}
return head;
}
void print(TYPE * head)
{
printf("学号\t\t姓名\t\t年龄\t\t性别\n");
while(head!=NULL)
{
printf("%d\t\t%s\t\t%\t\t%c\n",head->xuehao,head->xingming,head->nianling,head->xingbie);
head=head->next;
}
}
main()
{
TYPE *head,*pnum;
int n,xuehao;
printf("输入人员数: ");
scanf("%d",&n);
head=creat(n);
print(head);
printf("输入要删除人的学号: ");
scanf("%d",&xuehao);
head=delete(head,xuehao);
print(head);
printf("输入要加入的数据: ");
pnum=(TYPE *)malloc(LEN);
printf("\n输入学号:");
scanf("%d",&pnum->xuehao);
printf("\n输入姓名:");
scanf("%s",&pnum->xingming);
printf("\n输入年龄:");
scanf("%d",&pnum->nianling);
printf("\n输入性别,用‘f’‘m’表示:");
scanf("%c",&pb->xingbie);
head=insert(head,pnum);
print(head);
}
❼ 用纯C语言编写个同学录
#include "stdio.h" /*I/O函数*/
#include "stdlib.h" /*标准库函数*/
#include "string.h"/*字符串函数*/
#include "ctype.h" /*字符操作函数*/
#define M 50 /*定义常数表示记录数*/
typedef struct /*定义数据结构*/
{
char num[16];/*序号*/
char name[15]; /*姓名*/
char city[10]; /*户籍*/
char tel[15]; /*电话*/
}addr;
/******以下是函数原型*******/
int enter(addr t[]); /*输入记录*/
void list(addr t[],int n); /*显示记录*/
void search(addr t[],int n); /*按姓名查找显示记录*/
int delete(addr t[],int n); /*删除记录*/
int add(addr t[],int n); /*插入记录*/
void save(addr t[],int n); /*记录保存为文件*/
int load(addr t[]); /*从文件中读记录*/
void display(addr t[]); /*按序号查找显示记录*/
void sort(addr t[],int n); /*按姓名排序*/
void qseek(addr t[],int n); /*快速查找记录*/
void (); /*文件复制*/
void print(addr temp); /*显示单条记录*/
int find(addr t[],int n,char *s) ; /*查找函数*/
int menu_select(); /*主菜单函数*/
/******主函数开始*******/
main()
{
int i;
addr adr[M]; /*定义结构体数组*/
int length; /*保存记录长度*/
clrscr(); /*清屏*/
for(;;)/*无限循环*/
{
switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/
{
case 0:length=enter(adr);break;/*输入记录*/
case 1:list(adr,length);break; /*显示全部记录*/
case 2:search(adr,length);break; /*查找记录*/
case 3:length=delete(adr,length);break; /*删除记录*/
case 4:length=add(adr,length); break; /*插入记录*/
case 5:save(adr,length);break; /*保存文件*/
case 6:length=load(adr); break; /*读文件*/
case 7:display(adr);break; /*按序号显示记录*/
case 8:sort(adr,length);break; /*按姓名排序*/
case 9:qseek(adr,length);break; /*快速查找记录*/
case 10:();break; /*复制文件*/
case 11:exit(0); /*如返回值为11则程序结束*/
}
}
}
/*菜单函数,函数返回值为整数,代表所选的菜单项*/
menu_select()
{
char s[80];
int c;
gotoxy(1,25);/*将光标定为在第25行,第1列*/
printf("press any key enter menu......\n");/*提示压任意键继续*/
getch(); /*读入任意字符*/
clrscr(); /*清屏*/
gotoxy(1,1);
printf("********************MENU*********************\n\n");
printf(" 0. Enter record\n");
printf(" 1. List the file\n");
printf(" 2. Search record on name\n");
printf(" 3. Delete a record\n");
printf(" 4. add record \n");
printf(" 5. Save the file\n");
printf(" 6. Load the file\n");
printf(" 7. display record on order\n");
printf(" 8. sort to make new file\n");
printf(" 9. Quick seek record\n");
printf(" 10. the file to new file\n");
printf(" 11. Quit\n");
printf("***********************************************\n");
do{
printf("\n Enter you choice(0~11):"); /*提示输入选项*/
scanf("%s",s); /*输入选择项*/
c=atoi(s); /*将输入的字符串转化为整型数*/
}while(c<0||c>11); /*选择项不在0~11之间重输*/
return c; /*返回选择项,主程序根据该数调用相应的函数*/
}
/***输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度*/
int enter(addr t[])
{
int i,n;
char *s;
clrscr(); /*清屏*/
printf("\nplease input num \n"); /*提示信息*/
scanf("%d",&n); /*输入记录数*/
printf("please input record \n"); /*提示输入记录*/
printf("num name city telphone\n");
printf("------------------------------------------------\n");
for(i=0;i<n;i++)
{
scanf("%s%s%s%s",t[i].num,t[i].name,t[i].city,t[i].tel); /*输入记录*/
printf("----------------------------------------------\n");
}
return n; /*返回记录条数*/
}
/*显示记录,参数为记录数组和记录条数*/
void list(addr t[],int n)
{
int i;
clrscr();
printf("\n\n*******************addr******************\n");
printf("num name city telphone\n");
printf("------------------------------------------------\n");
for(i=0;i<n;i++)
printf("%-16s%-15s%-10s%-15s\n",t[i].num,t[i].name,t[i].city,t[i].tel);
if((i+1)%10==0) /*判断输出是否达到10条记录*/
{
printf("Press any key continue...\n"); /*提示信息*/
getch(); /*压任意键继续*/
}
printf("************************end********************\n");
}
/*查找记录*/
void search(addr t[],int n)
{
char s[20]; /*保存待查找姓名字符串*/
int i; /*保存查找到结点的序号*/
clrscr(); /*清屏*/
printf("please search name\n");
scanf("%s",s); /*输入待查找姓名*/
i=find(t,n,s); /*调用find函数,得到一个整数*/
if(i>n-1) /*如果整数i值大于n-1,说明没找到*/
printf("not found\n");
else
print(t[i]); /*找到,调用显示函数显示记录*/
}
/*显示指定的一条记录*/
void print(addr temp)
{
clrscr();
printf("\n\n********************************************\n");
printf("num name city telphone\n");
printf("------------------------------------------------\n");
printf("%-16s%-15s%-10s%-15s\n",temp.num,temp.name,temp.city,temp.tel);
printf("**********************end***********************\n");
}
/*查找函数,参数为记录数组和记录条数以及姓名s */
int find(addr t[],int n,char *s)
{
int i;
for(i=0;i<n;i++)/*从第一条记录开始,直到最后一条*/
{
if(strcmp(s,t[i].name)==0) /*记录中的姓名和待比较的姓名是否相等*/
return i; /*相等,则返回该记录的下标号,程序提前结结束*/
}
return i; /*返回i值*/
}
/*删除函数,参数为记录数组和记录条数*/
int delete(addr t[],int n)
{
char s[20]; /*要删除记录的姓名*/
int ch=0;
int i,j;
printf("please deleted name\n"); /*提示信息*/
scanf("%s",s);/*输入姓名*/
i=find(t,n,s); /*调用find函数*/
if(i>n-1) /*如果i>n-1超过了数组的长度*/
printf("no found not deleted\n"); /*显示没找到要删除的记录*/
else
{
print(t[i]); /*调用输出函数显示该条记录信息*/
printf("Are you sure delete it(1/0)\n"); /*确认是否要删除*/
scanf("%d",&ch); /*输入一个整数0或1*/
if(ch==1) /*如果确认删除整数为1*/
{
for(j=i+1;j<n;j++) /*删除该记录,实际后续记录前移*/
{
strcpy(t[j-1].num,t[j].num);
strcpy(t[j-1].name,t[j].name); /*将后一条记录的姓名拷贝到前一条*/
strcpy(t[j-1].city,t[j].city); /*将后一条记录的户籍拷贝到前一条*/
strcpy(t[j-1].tel,t[j].tel); /*将后一条记录的电话拷贝到前一条*/
}
n--; /*记录数减1*/
}
}
return n; /*返回记录数*/
}
/*插入记录函数,参数为结构体数组和记录数*/
int add(addr t[],int n)/*插入函数,参数为结构体数组和记录数*/
{
addr temp; /*新插入记录信息*/
int i,j;
char s[20]; /*确定插入在哪个记录之前*/
printf("please input record\n");
printf("************************************************\n");
printf("num name city telphone\n");
printf("--------------------------------------------------\n");
scanf("%s%s%s%s",temp.num,temp.name,temp.city,temp.tel); /*输入插入信息*/
printf("------------------------------------------------\n");
printf("please input locate name \n");
scanf("%s",s); /*输入插入位置的姓名*/
i=find(t,n,s); /*调用find,确定插入位置*/
for(j=n-1;j>=i;j--) /*从最后一个结点开始向后移动一条*/
{
strcpy(t[j+1].num,t[j].num); /*当前记录的序号拷贝到后一条*/
strcpy(t[j+1].name,t[j].name); /*当前记录的姓名拷贝到后一条*/
strcpy(t[j+1].city,t[j].city); /*当前记录的户籍拷贝到后一条*/
strcpy(t[j+1].tel,t[j].tel); /*当前记录的电话拷贝到后一条*/
}
strcpy(t[i].num,temp.num); /*将新插入记录的序号拷贝到第i个位置*/
strcpy(t[i].name,temp.name); /*将新插入记录的姓名拷贝到第i个位置*/
strcpy(t[i].city,temp.city); /*将新插入记录的户籍拷贝到第i个位置*/
strcpy(t[i].tel,temp.tel); /*将新插入记录的电话拷贝到第i个位置*/
n++; /*记录数加1*/
return n; /*返回记录数*/
}
/*保存函数,参数为结构体数组和记录数*/
void save(addr 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"); /*输出提示信息*/
fprintf(fp,"%d",n); /*将记录数写入文件*/
fprintf(fp,"\r\n"); /*将换行符号写入文件*/
for(i=0;i<n;i++)
{
fprintf(fp,"%-16s%-15s%-10s%-15s",t[i].num,t[i].name,t[i].city,t[i].tel);/*格式写入记录*/
fprintf(fp,"\r\n"); /*将换行符号写入文件*/
}
fclose(fp);/*关闭文件*/
printf("****save success***\n"); /*显示保存成功*/
}
/*读入函数,参数为结构体数组*/
int load(addr t[])
{
int i,n;
FILE *fp; /*指向文件的指针*/
if((fp=fopen("record.txt","rb"))==NULL)/*打开文件*/
{
printf("can not open file\n"); /*不能打开*/
exit(1); /*退出*/
}
fscanf(fp,"%d",&n); /*读入记录数*/
for(i=0;i<n;i++)
fscanf(fp,"%16s%15s%10%15s",t[i].num,t[i].name,t[i].city,t[i].tel); /*按格式读入记录*/
fclose(fp); /*关闭文件*/
printf("You have success read data from file!!!\n"); /*显示保存成功*/
return n; /*返回记录数*/
}
/*按序号显示记录函数*/
void display(addr 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(addr),1); /*移动文件指针到该记录位置*/
print(t[id]); /*调用输出函数显示该记录*/
printf("\r\n");
}
else
printf("no %d number record!!!\n ",id); /*如果序号不合理显示信息*/
fclose(fp); /*关闭文件*/
}
/*排序函数,参数为结构体数组和记录数*/
void sort(addr t[],int n)
{
int i,j,flag;
addr temp; /*临时变量做交换数据用*/
for(i=0;i<n;i++)
{
flag=0; /*设标志判断是否发生过交换*/
for(j=0;j<n-1;j++)
if((strcmp(t[j].name,t[j+1].name))>0) /*比较大小*/
{
flag=1;
strcpy(temp.name,t[j].num); /*交换记录*/
strcpy(temp.name,t[j].name);
strcpy(temp.city,t[j].city);
strcpy(temp.tel,t[j].tel);
strcpy(t[j].num,t[j+1].num);
strcpy(t[j].name,t[j+1].name);
strcpy(t[j].city,t[j+1].city);
strcpy(t[j].tel,t[j+1].tel);
strcpy(t[j+1].num,temp.num);
strcpy(t[j+1].name,temp.name);
strcpy(t[j+1].city,temp.city);
strcpy(t[j+1].tel,temp.tel);
}
if(flag==0)break; /*如果标志为0,说明没有发生过交换循环结束*/
}
printf("sort sucess!!!\n"); /*显示排序成功*/
}
/*快速查找,参数为结构体数组和记录数*/
void qseek(addr t[],int n)
{
char s[20];
int l,r,m;
printf("\nPlease sort before qseek!\n"); /*提示确认在查找之前,记录是否已排序*/
printf("please enter name for qseek\n"); /*提示输入*/
scanf("%s",s); /*输入待查找的姓名*/
l=0;r=n-1; /*设置左边界与右边界的初值*/
while(l<=r) /*当左边界<=右边界时*/
{
m=(l+r)/2; /*计算中间位置*/
if(strcmp(t[m].name,s)==0) /*与中间结点姓名字段做比较判是否相等*/
{
print(t[m]); /*如果相等,则调用print函数显示记录信息*/
return ; /*返回*/
}
if(strcmp(t[m].name,s)<0) /*如果中间结点小*/
l=m+1; /*修改左边界*/
else
r=m-1; /*否则,中间结点大,修改右边界*/
}
if(l>r) /*如果左边界大于右边界时*/
printf("not found\n"); /*显示没找到*/
}
/*复制文件*/
void ()
{
char outfile[20]; /*目标文件名*/
int i,n;
addr temp[M]; /*定义临时变量*/
FILE *sfp,*tfp; /*定义指向文件的指针*/
clrscr();/*清屏*/
if((sfp=fopen("record.txt","rb"))==NULL) /*打开记录文件*/
{
printf("can not open file\n"); /*显示不能打开文件信息*/
exit(1); /*退出*/
}
printf("Enter outfile name,for example c:\\f1\\te.txt:\n"); /*提示信息*/
printf("Enter outfile name,for example c:\\f1\\te.txt:\n"); /*提示信息*/
scanf("%s",outfile); /*输入目标文件名*/
if((tfp=fopen(outfile,"wb"))==NULL) /*打开目标文件*/
{
printf("can not open file\n"); /*显示不能打开文件信息*/
exit(1); /*退出*/
}
fscanf(sfp,"%d",&n); /*读出文件记录数*/
fprintf(tfp,"%d",n);/*写入目标文件数*/
fprintf(tfp,"\r\n"); /*写入换行符*/
for(i=0;i<n;i++)
{
fscanf(sfp,"%15s%15s%10s%15s\n",temp[i].num,temp[i].name,temp[i].city,temp[i].tel); /*读入记录*/
fprintf(tfp,"%-15s%-20s%-30s%-10s\n",temp[i].num,temp[i].name, temp[i].city,temp[i].tel); /*写入记录*/
fprintf(tfp,"\r\n"); /*写入换行符*/
}
fclose(sfp); /*关闭源文件*/
fclose(tfp); /*关闭目标文件*/
printf("you have success file!!!\n"); /*显示复制成功*/
}
提供参考,需要适当修改你所需的内容。在此说明一下,c语言这样的综合实验是很锻炼的。能让你的知识再复习一遍。最好是自己写了。呵呵~
❽ C语言编译的问题
1、fatal error C1010: unexpected end of file while looking for precompiled header directive。
寻找预编译头文件路径时遇到了不该遇到的文件尾。(一般是没有#include "stdafx.h")
2、fatal error C1083: Cannot open include file: 'R…….h': No such file or directory
不能打开包含文件“R…….h”:没有这样的文件或目录。
3、error C2011: 'C……': 'class' type redefinition
类“C……”重定义。
4、error C2018: unknown character '0xa3'
不认识的字符'0xa3'。(一般是汉字或中文标点符号)
5、error C2057: expected constant expression
希望是常量表达式。(一般出现在switch语句的case分支中)
6、error C2065: 'IDD_MYDIALOG' : undeclared identifier
“IDD_MYDIALOG”:未声明过的标识符。
7、error C2082: redefinition of formal parameter 'bReset'
函数参数“bReset”在函数体中重定义。
8、error C2143: syntax error: missing ':' before '{'
句法错误:“{”前缺少“;”。
9、error C2146: syntax error : missing ';' before identifier 'dc'
句法错误:在“dc”前丢了“;”。
10、error C2196: case value '69' already used
值69已经用过。(一般出现在switch语句的case分支中)
11、error C2509: 'OnTimer' : member function not declared in 'CHelloView'
成员函数“OnTimer”没有在“CHelloView”中声明。
12、error C2511: 'reset': overloaded member function 'void (int)' not found in 'B'
重载的函数“void reset(int)”在类“B”中找不到。
13、error C2555: 'B::f1': overriding virtual function differs from 'A::f1' only by return type or calling convention
类B对类A中同名函数f1的重载仅根据返回值或调用约定上的区别。
14、error C2660: 'SetTimer' : function does not take 2 parameters
“SetTimer”函数不传递2个参数。
15、warning C4035: 'f……': no return value
“f……”的return语句没有返回值。
16、warning C4553: '= =' : operator has no effect; did you intend '='?
没有效果的运算符“= =”;是否改为“=”?
17、warning C4700: local variable 'bReset' used without having been initialized
局部变量“bReset”没有初始化就使用。
18、error C4716: 'CMyApp::InitInstance' : must return a value
“CMyApp::InitInstance”函数必须返回一个值。
19、LINK : fatal error LNK1168: cannot open Debug/P1.exe for writing
连接错误:不能打开P1.exe文件,以改写内容。(一般是P1.Exe还在运行,未关闭)
20、error LNK2001: unresolved external symbol "public: virtual _ _thiscall C……::~C……(void)"
连接时发现没有实现的外部符号(变量、函数等)。
function call missing argument list 调用函数的时候没有给参数。
member function definition looks like a ctor, but name does not match enclosing class 成员函数声明了但没有使用
unexpected end of file while looking for precompiled header directive 在寻找预编译头文件时文件意外结束,编译不正常终止可能造成这种情况
希望对你能有所帮助。
❾ 关于C语言编译阶段的一些问题
呵呵,找一本好书吧。我不能完全给你写清楚,"sting.h"的拼写已经有人说了。
简单地说,要理解几种文件:
A:源文件:例如汇编(asm)、c语言、cpp
B:目标文件
C:库文件(lib)
D:可执行文件
A经过编译器得到B,若干个B可以经过库管理程序得到C,C也可以通过库管理程序得到B(提取)
若干个B通过链接器可以得到D,但是比如strcmp是出现在C中的,但实际上链接器会到C中提取出strcmp所在的B,然后将这个B放入到你的D中。整过过程是一个求闭包的过程,具体参见《Linker and Loader》。
最后说说.h,其实.h本身并不是必要的,但是它可以减少人们的错误,减少重复的代码。
比如printf,你完全可以不include<stdio.h>,你就自己写上一行:
int printf(...);
然后你后面就是直接使用就好了,但是这样会有很多缺陷,这些缺陷可能只有你深刻地理解C语言本身的缺陷后才能明白,不多说了。
❿ 求用简单一点的c语言编写同学录
#include "stdio.h" /*I/O函数*/
#include "stdlib.h" /*标准库函数*/
#include "string.h"/*字符串函数*/
#include "ctype.h" /*字符操作函数*/
#define M 50 /*定义常数表示记录数*/
typedef struct /*定义数据结构*/
{
char num[16];/*序号*/
char name[15]; /*姓名*/
char city[10]; /*户籍*/
char tel[15]; /*电话*/
}addr;
/******以下是函数原型*******/
int enter(addr t[]); /*输入记录*/
void list(addr t[],int n); /*显示记录*/
void search(addr t[],int n); /*按姓名查找显示记录*/
int delete(addr t[],int n); /*删除记录*/
int add(addr t[],int n); /*插入记录*/
void save(addr t[],int n); /*记录保存为文件*/
int load(addr t[]); /*从文件中读记录*/
void display(addr t[]); /*按序号查找显示记录*/
void sort(addr t[],int n); /*按姓名排序*/
void qseek(addr t[],int n); /*快速查找记录*/
void (); /*文件复制*/
void print(addr temp); /*显示单条记录*/
int find(addr t[],int n,char *s) ; /*查找函数*/
int menu_select(); /*主菜单函数*/
/******主函数开始*******/
main()
{
int i;
addr adr[M]; /*定义结构体数组*/
int length; /*保存记录长度*/
clrscr(); /*清屏*/
for(;;)/*无限循环*/
{
switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/
{
case 0:length=enter(adr);break;/*输入记录*/
case 1:list(adr,length);break; /*显示全部记录*/
case 2:search(adr,length);break; /*查找记录*/
case 3:length=delete(adr,length);break; /*删除记录*/
case 4:length=add(adr,length); break; /*插入记录*/
case 5:save(adr,length);break; /*保存文件*/
case 6:length=load(adr); break; /*读文件*/
case 7:display(adr);break; /*按序号显示记录*/
case 8:sort(adr,length);break; /*按姓名排序*/
case 9:qseek(adr,length);break; /*快速查找记录*/
case 10:();break; /*复制文件*/
case 11:exit(0); /*如返回值为11则程序结束*/
}
}
}
/*菜单函数,函数返回值为整数,代表所选的菜单项*/
menu_select()
{
char s[80];
int c;
gotoxy(1,25);/*将光标定为在第25行,第1列*/
printf("press any key enter menu......\n");/*提示压任意键继续*/
getch(); /*读入任意字符*/
clrscr(); /*清屏*/
gotoxy(1,1);
printf("********************MENU*********************\n\n");
printf(" 0. Enter record\n");
printf(" 1. List the file\n");
printf(" 2. Search record on name\n");
printf(" 3. Delete a record\n");
printf(" 4. add record \n");
printf(" 5. Save the file\n");
printf(" 6. Load the file\n");
printf(" 7. display record on order\n");
printf(" 8. sort to make new file\n");
printf(" 9. Quick seek record\n");
printf(" 10. the file to new file\n");
printf(" 11. Quit\n");
printf("***********************************************\n");
do{
printf("\n Enter you choice(0~11):"); /*提示输入选项*/
scanf("%s",s); /*输入选择项*/
c=atoi(s); /*将输入的字符串转化为整型数*/
}while(c<0||c>11); /*选择项不在0~11之间重输*/
return c; /*返回选择项,主程序根据该数调用相应的函数*/
}
/***输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度*/
int enter(addr t[])
{
int i,n;
char *s;
clrscr(); /*清屏*/
printf("\nplease input num \n"); /*提示信息*/
scanf("%d",&n); /*输入记录数*/
printf("please input record \n"); /*提示输入记录*/
printf("num name city telphone\n");
printf("------------------------------------------------\n");
for(i=0;i<n;i++)
{
scanf("%s%s%s%s",t[i].num,t[i].name,t[i].city,t[i].tel); /*输入记录*/
printf("----------------------------------------------\n");
}
return n; /*返回记录条数*/
}
/*显示记录,参数为记录数组和记录条数*/
void list(addr t[],int n)
{
int i;
clrscr();
printf("\n\n*******************addr******************\n");
printf("num name city telphone\n");
printf("------------------------------------------------\n");
for(i=0;i<n;i++)
printf("%-16s%-15s%-10s%-15s\n",t[i].num,t[i].name,t[i].city,t[i].tel);
if((i+1)%10==0) /*判断输出是否达到10条记录*/
{
printf("Press any key continue...\n"); /*提示信息*/
getch(); /*压任意键继续*/
}
printf("************************end********************\n");
}
/*查找记录*/
void search(addr t[],int n)
{
char s[20]; /*保存待查找姓名字符串*/
int i; /*保存查找到结点的序号*/
clrscr(); /*清屏*/
printf("please search name\n");
scanf("%s",s); /*输入待查找姓名*/
i=find(t,n,s); /*调用find函数,得到一个整数*/
if(i>n-1) /*如果整数i值大于n-1,说明没找到*/
printf("not found\n");
else
print(t[i]); /*找到,调用显示函数显示记录*/
}
/*显示指定的一条记录*/
void print(addr temp)
{
clrscr();
printf("\n\n********************************************\n");
printf("num name city telphone\n");
printf("------------------------------------------------\n");
printf("%-16s%-15s%-10s%-15s\n",temp.num,temp.name,temp.city,temp.tel);
printf("**********************end***********************\n");
}
/*查找函数,参数为记录数组和记录条数以及姓名s */
int find(addr t[],int n,char *s)
{
int i;
for(i=0;i<n;i++)/*从第一条记录开始,直到最后一条*/
{
if(strcmp(s,t[i].name)==0) /*记录中的姓名和待比较的姓名是否相等*/
return i; /*相等,则返回该记录的下标号,程序提前结结束*/
}
return i; /*返回i值*/
}
/*删除函数,参数为记录数组和记录条数*/
int delete(addr t[],int n)
{
char s[20]; /*要删除记录的姓名*/
int ch=0;
int i,j;
printf("please deleted name\n"); /*提示信息*/
scanf("%s",s);/*输入姓名*/
i=find(t,n,s); /*调用find函数*/
if(i>n-1) /*如果i>n-1超过了数组的长度*/
printf("no found not deleted\n"); /*显示没找到要删除的记录*/
else
{
print(t[i]); /*调用输出函数显示该条记录信息*/
printf("Are you sure delete it(1/0)\n"); /*确认是否要删除*/
scanf("%d",&ch); /*输入一个整数0或1*/
if(ch==1) /*如果确认删除整数为1*/
{
for(j=i+1;j<n;j++) /*删除该记录,实际后续记录前移*/
{
strcpy(t[j-1].num,t[j].num);
strcpy(t[j-1].name,t[j].name); /*将后一条记录的姓名拷贝到前一条*/
strcpy(t[j-1].city,t[j].city); /*将后一条记录的户籍拷贝到前一条*/
strcpy(t[j-1].tel,t[j].tel); /*将后一条记录的电话拷贝到前一条*/
}
n--; /*记录数减1*/
}
}
return n; /*返回记录数*/
}
/*插入记录函数,参数为结构体数组和记录数*/
int add(addr t[],int n)/*插入函数,参数为结构体数组和记录数*/
{
addr temp; /*新插入记录信息*/
int i,j;
char s[20]; /*确定插入在哪个记录之前*/
printf("please input record\n");
printf("************************************************\n");
printf("num name city telphone\n");
printf("--------------------------------------------------\n");
scanf("%s%s%s%s",temp.num,temp.name,temp.city,temp.tel); /*输入插入信息*/
printf("------------------------------------------------\n");
printf("please input locate name \n");
scanf("%s",s); /*输入插入位置的姓名*/
i=find(t,n,s); /*调用find,确定插入位置*/
for(j=n-1;j>=i;j--) /*从最后一个结点开始向后移动一条*/
{
strcpy(t[j+1].num,t[j].num); /*当前记录的序号拷贝到后一条*/
strcpy(t[j+1].name,t[j].name); /*当前记录的姓名拷贝到后一条*/
strcpy(t[j+1].city,t[j].city); /*当前记录的户籍拷贝到后一条*/
strcpy(t[j+1].tel,t[j].tel); /*当前记录的电话拷贝到后一条*/
}
strcpy(t[i].num,temp.num); /*将新插入记录的序号拷贝到第i个位置*/
strcpy(t[i].name,temp.name); /*将新插入记录的姓名拷贝到第i个位置*/
strcpy(t[i].city,temp.city); /*将新插入记录的户籍拷贝到第i个位置*/
strcpy(t[i].tel,temp.tel); /*将新插入记录的电话拷贝到第i个位置*/
n++; /*记录数加1*/
return n; /*返回记录数*/
}
/*保存函数,参数为结构体数组和记录数*/
void save(addr 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"); /*输出提示信息*/
fprintf(fp,"%d",n); /*将记录数写入文件*/
fprintf(fp,"\r\n"); /*将换行符号写入文件*/
for(i=0;i<n;i++)
{
fprintf(fp,"%-16s%-15s%-10s%-15s",t[i].num,t[i].name,t[i].city,t[i].tel);/*格式写入记录*/
fprintf(fp,"\r\n"); /*将换行符号写入文件*/
}
fclose(fp);/*关闭文件*/
printf("****save success***\n"); /*显示保存成功*/
}
/*读入函数,参数为结构体数组*/
int load(addr t[])
{
int i,n;
FILE *fp; /*指向文件的指针*/
if((fp=fopen("record.txt","rb"))==NULL)/*打开文件*/
{
printf("can not open file\n"); /*不能打开*/
exit(1); /*退出*/
}
fscanf(fp,"%d",&n); /*读入记录数*/
for(i=0;i<n;i++)
fscanf(fp,"%16s%15s%10%15s",t[i].num,t[i].name,t[i].city,t[i].tel); /*按格式读入记录*/
fclose(fp); /*关闭文件*/
printf("You have success read data from file!!!\n"); /*显示保存成功*/
return n; /*返回记录数*/
}
/*按序号显示记录函数*/
void display(addr 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(addr),1); /*移动文件指针到该记录位置*/
print(t[id]); /*调用输出函数显示该记录*/
printf("\r\n");
}
else
printf("no %d number record!!!\n ",id); /*如果序号不合理显示信息*/
fclose(fp); /*关闭文件*/
}
/*排序函数,参数为结构体数组和记录数*/
void sort(addr t[],int n)
{
int i,j,flag;
addr temp; /*临时变量做交换数据用*/
for(i=0;i<n;i++)
{
flag=0; /*设标志判断是否发生过交换*/
for(j=0;j<n-1;j++)
if((strcmp(t[j].name,t[j+1].name))>0) /*比较大小*/
{
flag=1;
strcpy(temp.name,t[j].num); /*交换记录*/
strcpy(temp.name,t[j].name);
strcpy(temp.city,t[j].city);
strcpy(temp.tel,t[j].tel);
strcpy(t[j].num,t[j+1].num);
strcpy(t[j].name,t[j+1].name);
strcpy(t[j].city,t[j+1].city);
strcpy(t[j].tel,t[j+1].tel);
strcpy(t[j+1].num,temp.num);
strcpy(t[j+1].name,temp.name);
strcpy(t[j+1].city,temp.city);
strcpy(t[j+1].tel,temp.tel);
}
if(flag==0)break; /*如果标志为0,说明没有发生过交换循环结束*/
}
printf("sort sucess!!!\n"); /*显示排序成功*/
}
/*快速查找,参数为结构体数组和记录数*/
void qseek(addr t[],int n)
{
char s[20];
int l,r,m;
printf("\nPlease sort before qseek!\n"); /*提示确认在查找之前,记录是否已排序*/
printf("please enter name for qseek\n"); /*提示输入*/
scanf("%s",s); /*输入待查找的姓名*/
l=0;r=n-1; /*设置左边界与右边界的初值*/
while(l<=r) /*当左边界<=右边界时*/
{
m=(l+r)/2; /*计算中间位置*/
if(strcmp(t[m].name,s)==0) /*与中间结点姓名字段做比较判是否相等*/
{
print(t[m]); /*如果相等,则调用print函数显示记录信息*/
return ; /*返回*/
}
if(strcmp(t[m].name,s)<0) /*如果中间结点小*/
l=m+1; /*修改左边界*/
else
r=m-1; /*否则,中间结点大,修改右边界*/
}
if(l>r) /*如果左边界大于右边界时*/
printf("not found\n"); /*显示没找到*/
}
/*复制文件*/
void ()
{
char outfile[20]; /*目标文件名*/
int i,n;
addr temp[M]; /*定义临时变量*/
FILE *sfp,*tfp; /*定义指向文件的指针*/
clrscr();/*清屏*/
if((sfp=fopen("record.txt","rb"))==NULL) /*打开记录文件*/
{
printf("can not open file\n"); /*显示不能打开文件信息*/
exit(1); /*退出*/
}
printf("Enter outfile name,for example c:\\f1\\te.txt:\n"); /*提示信息*/
printf("Enter outfile name,for example c:\\f1\\te.txt:\n"); /*提示信息*/
scanf("%s",outfile); /*输入目标文件名*/
if((tfp=fopen(outfile,"wb"))==NULL) /*打开目标文件*/
{
printf("can not open file\n"); /*显示不能打开文件信息*/
exit(1); /*退出*/
}
fscanf(sfp,"%d",&n); /*读出文件记录数*/
fprintf(tfp,"%d",n);/*写入目标文件数*/
fprintf(tfp,"\r\n"); /*写入换行符*/
for(i=0;i<n;i++)
{
fscanf(sfp,"%15s%15s%10s%15s\n",temp[i].num,temp[i].name,temp[i].city,temp[i].tel); /*读入记录*/
fprintf(tfp,"%-15s%-20s%-30s%-10s\n",temp[i].num,temp[i].name, temp[i].city,temp[i].tel); /*写入记录*/
fprintf(tfp,"\r\n"); /*写入换行符*/
}
fclose(sfp); /*关闭源文件*/
fclose(tfp); /*关闭目标文件*/
printf("you have success file!!!\n"); /*显示复制成功*/
}