C语言模拟简易通讯录(大一C语言期末大作业)
前言
大一第一个学期,我们初学C语言,临近寒假,老师给我们布置了期末大作业,分为A类和B类,A类是最高分为100分,B类是最高分为70分,我选择了B类题里的模拟简易通讯录。下面是详细,技术不精,还请各位大佬指点。
设计目的
题目要求建立一个通讯录,通讯录的结构记录包括:姓名、生日(年月日)、电话号码,程序需要实现下列功能:(1)按姓名查询某人的信息并输出查询结果;(2)修改某人的电话号码;(3)按年龄从大到小排序;(4)输出通讯录中的所有信息。同时程序需要有良好的交互提示和清晰的显示界面。
总体设计
具体代码如下:
#include<stdio.h>
#include<string.h>
struct birthday{ /*定义生日结构,年·月·日*/
int year;
int month;
int day;
};
struct person {
char name [10];
struct birthday birth; /*定义生日成员,嵌套入个人信息*/
char phonenumber[20];
};
int main (void)
{
int i,n,j,choice,index;
char namex[10],namey[10],phonex[20];
struct person persons[50],temp;
printf ("请输入通讯录中的联系人人数:");
scanf ("%d",&n);
for (i=0;i<n;i++){ /*开始输入通讯录信息*/
printf ("请输入此联系人的姓名:");
scanf ("%s",persons[i].name);
printf ("请输入生日:");
scanf ("%d.%d.%d",&persons[i].birth.year,&persons[i].birth.month,&persons[i].birth.day);
printf ("请输入联系电话:");
scanf ("%s",&persons[i].phonenumber);
printf ("\n");
}
while (1) {
/*输出选项菜单*/
printf ("\n");
printf ("以下为本程序为您提供的通讯录功能选项:(输入数字以选择功能)\n");
printf ("查询通讯录成员个人信息请输入'1';\n");
printf ("修改通讯录成员电话号码请输入'2';\n");
printf ("将通讯录成员按年龄从大到小排序请输入'3';\n");
printf ("输出通讯录所有信息请输入'4';\n");
printf ("退出通讯录服务请输入'0';\n");
printf ("请输入您的选项(数字):");
scanf ("%d",&choice);
printf ("\n");
if (choice==0) { /*选项为‘0’时,退出程序*/
break;
}
switch (choice) {
case 1: /*功能一:查找*/
printf ("请输入您要查找的联系人姓名:");
scanf ("%s",namex);
for (i=0;i<n;i++){
if (strcmp(namex,persons[i].name)==0){
printf ("\n");
printf ("姓名:%s\n",persons[i].name);
printf ("生日:%d.%d.%d\n",persons[i].birth.year,persons[i].birth.month,persons[i].birth.day);
printf ("联系电话:");
puts(persons[i].phonenumber);
printf ("\n");
break;
}
}
break;
case 2: /*功能二:修改*/
printf ("请输入您要修改的联系人姓名:");
scanf ("%s",namey);
printf ("请为您的联系人设置新的联系电话:");
scanf ("%s",phonex);
for (i=0;i<n;i++){
if (strcmp(namey,persons[i].name)==0){
strcpy (persons[i].phonenumber,phonex);
printf ("\n");
printf ("姓名:%s\n",persons[i].name);
printf ("生日:%d.%d.%d\n",persons[i].birth.year,persons[i].birth.month,persons[i].birth.day);
printf ("联系电话:");
puts(persons[i].phonenumber);
printf ("\n");
break;
}
}
break;
case 3: /*功能三:排序*/
for (i=0;i<n-1;i++){
index=i;
for (j=i+1;j<n;j++){
if (persons[j].birth.year<persons[index].birth.year){
index=j;
}
else if(persons[j].birth.year==persons[index].birth.year&&persons[j].birth.month<persons[index].birth.month){
index=j;
}
else if(persons[j].birth.year==persons[index].birth.year&&persons[j].birth.month==persons[index].birth.month&&persons[j].birth.day<persons[index].birth.day){
index=j;
}
}
temp=persons[index];
persons[index]=persons[i];
persons[i]=temp;
}
for (i=0;i<n;i++){ /*输出排序后的通讯录*/
printf ("\n");
printf ("姓名:%s\n",persons[i].name);
printf ("生日:%d.%d.%d\n",persons[i].birth.year,persons[i].birth.month,persons[i].birth.day);
printf ("联系电话:");
puts(persons[i].phonenumber);
printf ("\n");
}
break;
case 4: /*功能四:输出*/
for (i=0;i<n;i++){
printf ("\n");
printf ("姓名:%s\n",persons[i].name);
printf ("生日:%d.%d.%d\n",persons[i].birth.year,persons[i].birth.month,persons[i].birth.day);
printf ("联系电话:");
puts(persons[i].phonenumber);
}
break;
default :
printf ("\n");
printf ("\n");
printf ("\n");
printf ("您好!您所输入的数字在程序中没有与之对应的功能。\n");
printf ("\n");
printf ("\n");
printf ("\n");
break;
}
}
printf ("\n");
printf ("\n");
printf ("\n");
printf ("感谢您的使用!\n");
return 0;
}
调试与测试
编写程序时第一个问题是如何将每个功能分开调出使用,翻看课本后我决定采用switch语句,将每个功能程序段嵌入switch语句中,依靠输入的数字进行功能选择。
第二个问题是电话号码的输出,我采用了scanf语句输入电话号码,用puts()输出电话号码,从而保证十一位号码的正常输出。
第三个问题是交互提示的优化,提示语采用中文,在输出语句的前面输出空格,便于查看输出结果。
课程实践总结
收获:得知写程序,调试程序的不简单,获得克服困难的喜悦,在看到自己亲手编写的程序运行出来满意的结果时,很有成就感。
体会:虽然这次实践题我选的不是100分的B类题,但我明白自己的能力适合做A类题。通过这次实践任务,我明白了幸福是靠自己奋斗出来的,写完程序的快乐只有自己知道。
优点:可以供使用者自由选择通讯录功能,有良好的交互提示和输出界面。
缺点:输入姓名错误时没有错误提示,直接跳出循环。