C语言模拟通讯录(大一C语言期末大作业)

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类题。通过这次实践任务,我明白了幸福是靠自己奋斗出来的,写完程序的快乐只有自己知道。
优点:可以供使用者自由选择通讯录功能,有良好的交互提示和输出界面。
缺点:输入姓名错误时没有错误提示,直接跳出循环。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值