精华内容
下载资源
问答
  • C语言项目实训程序(书店销售管理系统)1800行代码 C语言项目实训程序(书店销售管理系统)1800行代码 C语言项目实训程序(书店销售管理系统)1800行代码 C语言项目实训程序(书店销售管理系统)1800行代码
  • 山东科技大学C语言实训项目—万年历:附带实训报告
  • 实训项目一 统计歌唱比赛成绩 有10名选手参加某歌唱比赛,每位选手演唱自己参赛曲目后,7名评委亮出自己的评分,后台人员会去掉最高分和最低分,将剩下的5个值求平均来计算该选手的比赛得分。比赛结束后,将根据此...

    实训项目一 统计歌唱比赛成绩

    有10名选手参加某歌唱比赛,每位选手演唱自己参赛曲目后,7名评委亮出自己的评分,后台人员会去掉最高分和最低分,将剩下的5个值求平均来计算该选手的比赛得分。比赛结束后,将根据此平均分进行排名和颁奖。

    在实训中,我们来模仿这一过程,由用户输入选手名称和评委得分,然后由程序计算每位选手的最高分和最低分并输出,去掉这两个值求得并输出其平均分,然后根据平均分将排名输出。

      具体实现步骤:

    • 定义数组
    • 输入10名选手的名字并保存
    • 输入评委给的分数
    • 找到每位选手的最高分
    • 找到最低分
    • 去掉最高分和最低分,求每位选手的平均分
    • 根据选手得分排名次
    • 输出比赛结果
      #include <stdio.h>
      int max[10],min[10]; 
      double average[10];    
      int no[10]={0,1,2,3,4,5,6,7,8,9}; 
      int main()
      {
        char names[10][10];   /*定义二维字符数组存放选手名字*/
        int i;
        for(i=0;i<10;i++)
        {
          printf("please input the name of the No. %d singer\n",i+1);
                 /*提示用户输入编号为i+1的选手的名字*/
          gets(names[i]);  
                /*将用户输入的字符串作为该选手的名字*/
        } 
      
        int score[10][7],j;
        for(i=0;i<10;i++)
        {
      	  printf("\nplease input the score of the No. %d singer\n",i+1);
                 /*提示用户输入编号为i+1的选手的成绩*/
           for(j=0;j<7;j++)
               scanf("%d",&score[i][j]);
        }
      for(i=0;i<10;i++)
       {
         max[i]=score[i][0];
            for(j=1;j<7;j++)
              if(score[i][j]>max[i])
                 max[i] = score[i][j];
           printf("the highest score of the No.%d singer is:%d\n", i+1, max[i]);
      }
      for(i=0;i<10;i++)
       {
         min[i]=score[i][0];
            for(j=1;j<7;j++)
              if(score[i][j]<min[i])
                 min[i] = score[i][j];
           printf("the lowest score of the No.%d singer is:%d\n", i+1, min[i]);
      }
      int sum,temp;                 	/*清零*/
      for(i=0;i<10;i++)
       {
         sum=0;
         for(j=0;j<7;j++)
         sum+=score[i][j];        		/*累加*/
         sum=sum-max[i]-min[i];      	/*去掉最高和最低分*/
         average[i] = (double)sum/5;    	/*计算平均分*/
         printf("the average score of the No.%d singer is:%lf\n\n", i+1, average[i]);
      }
      for(i=1;i<=6;i++)
      {
           for(j=0;j<7-i;j++)
           {
              /*比较的average[no[j]],而不是no[j]本身*/
              if(average[no[j]]<average[no[j+1]]) 
              {
                 temp=no[j];  no[j]=no[j+1];  no[j+1]=temp;  /*交换排名位置*/
              }
            }
      }
       for(i=0;i<10;i++)
       printf("%d : %s(number:%d) get %lf\n",i,names[no[i]],no[i]+1,average[no[i]]);
       return 0;
      }
      
      
      

       

    展开全文
  • 关于C语言实训项目-查字典,可以尝试做做
  • 六个C语言实训项目

    2010-05-21 12:52:20
    C语言实训项目,挺使用的,也可以检验我们所学
  • C语言实训课件

    2013-05-13 13:07:58
    C语言实训课件 冒泡算法 选择法等算法代码,与实训项目等代码
  • C语言专题 ⑥项目实训-家庭财务管理系统

    千次阅读 多人点赞 2019-07-15 20:41:21
    c语言项目专题实训: 家庭财务管理系统 采用:文件,链表,指针,结构体等 有函数代码及较详细的讲解,有完整代码
    一、关于
    (1)要求:

    1.选题:家庭财务管理系统
    2.项目简介:编程实现一个家庭财务管理系统,系统能够通过菜单提供功能选择,能够实现家庭财务收入及财务支出的添加、查询、删除、 修改等功能,能够实现家庭财务数据的统计功能。
    3. 基础语法(数据类型、运算符与表达式、流程控制数):预处理命令、数组、指针、函数、结构体、链表、文件操作等

    (2)概述
    1. 功能:添加收入/支出;查询;删除;修改;统计;

    2. 实现过程:通过结构体链表储存信息;

      (文末附有完整代码)

    (3)重点及难点
    1. 结构体:对于类似家庭财务管理系统,图书管理系统等项目,需要储存信息的时候使用一连串连续的空间,以便更好地储存信息,保证信息的完整性与可读性,故多选择结构体实现而非数组。

    2. 没有选择全局变量,而是在主函数中定义一个指针变量,防止了全局变量可能出现的错误;但注意:每个函数入口处基本上都会传递指针的头节点所在地址;在调用修改添加删除函数时返回头节点。

    3. 很多函数不是定义为void型,但也不一定会使用其返回值。不定义为void类型主要是为了能更好的控制该函数的结束(例如:int函数中若满足某种条件可以直接return 0或者其他数字来结束函数),使用可以更方便。

    4. do-while语句的方便使用(很多时候可以替换常见的while语句,让程序更简单明了)

    5. 特别注意:本文只给出了写的部分收入的代码,如果还要完整添加支出代码的话,在代码中的函数类型不是INPUT *的函数可以直接使用在支出函数里面,而用INPUT *定义的函数则需要重新编写(即把INPUT *改为OUTPUT *

    二、实现过程及代码分析

    (都附有函数代码及较详细的讲解)

    • 主函数部分
    int main()
    {
     int n = 1;
     INPUT *head=NULL;
     menu(n);
     scanf("%d", &n);
     while (n) {
      switch (n) {
      case 1:
       head=add_in(head);
       break;
      case 2:
       search_in(head);
       break;
      case 3:
       head=del_in(head);
       break;
      case 4:
       modify_in(head);
       break;
      case 5:
       //    add_out(); 
       break;
      case 6:
       //    search_out();
       break;
      case 7:
       //    del_out();
       break;
      case 8:
       //    modify_out();
       break;
      case 9:
       total_in(head);
       break;
      case 10:
    //   total_out();
      default:
       printf(">输入的数字有误,请重新输入!\n\n");  //如果选择的操作不合理,则会输出提示并要求重新输入;
      }
      if (n>0 && n<10) {
       system("cls");
      }
      menu(n);
      scanf("%d", &n);
     }
     return 0;
    }
    • 菜单函数
    void menu(int n){
     if (n > 0 && n < 11){
      printf("                                                      \n");
      printf("  ---------------------------------------------------- \n");
      printf(" |                  家庭财务管理系统                  |\n");
      printf(" |----------------------------------------------------|\n");
      printf(" |                  >收入管理                         |\n");
      printf(" |----------------------------------------------------|\n");
      printf(" |                     1.添加收入                     |\n");
      printf(" |                     2.查询收入详情                 |\n");
      printf(" |                     3.删除收入                     |\n");
      printf(" |                     4.修改收入                     |\n");
      printf(" |----------------------------------------------------|\n");
      printf(" |                  >支出管理                         |\n");
      printf(" |----------------------------------------------------|\n");
      printf(" |                     5.添加支出                     |\n");
      printf(" |                     6.查询支出详情                 |\n");
      printf(" |                     7.删除支出                     |\n");
      printf(" |                     8.修改支出                     |\n");
      printf(" |----------------------------------------------------|\n");
      printf(" |                  >统计                             |\n");
      printf(" |----------------------------------------------------|\n");
      printf(" |                     9.统计总收入                   |\n");
      printf(" |                     10.统计总支出                  |\n");  
      printf(" |----------------------------------------------------|\n");
      printf(" |                     0.退出系统                     |\n");
      printf("  ---------------------------------------------------- \n");
      printf("                                                       \n");
      printf(">请选择要进行的操作(0-10):");
     }
      else if (n >= 11 || n < 0){       
      printf(">请选择要进行的操作(0-10):");
     }
    }
    • 添加收入函数:
      输出信息一行一行提示,根据提示输入所填信息;
      输入编号后要查重;
      提交成功后,询问是否继续输入(嵌套,递归调用)
      是否返回主菜单
    //增加收入函数(可以根据用户的需求申请空间,将信息储存在结构体中并通过链表连接)
    INPUT *add_in(INPUT *head){ 
     char c='y';
     int a;
     while(c=='y' || c=='Y'){
      head=build(head);              		 //使用build函数
      printf(">是否继续输入?(y/n):");
      scanf(" %c",&c); 
     }
     if(c=='n' || c=='N'){
      printf(">请选择要进行的操作(1.返回主菜单;2.直接退出):");  //可以返回主菜单
      scanf("%d",&a);
      if(a==2)
      
       exit(0);
     }
     return head;
    }
    //建立链表(使新申请空间的结构体通过链表串起来)
    INPUT *build(INPUT *head){
     INPUT *pt=NULL;    //添加后的当前链表尾节点 ;; 
     INPUT *prept=NULL;   //当前链表尾节点;
     pt=(INPUT *)malloc(sizeof(INPUT));
     if(pt!=NULL){
      printf(">请输入编号:"); 
      scanf("%d",&pt->num);
      while(checknum(head,pt->num)!=NULL){    //使用checknum函数
       printf(">编号重复,请重新输入:");    //可以检查编号是否重复
       scanf("%d",&pt->num);
      }
      printf(">请输入姓名:");
      scanf("%s",pt->Name);
      printf(">请输入日期(例如:20190711):"); 
      scanf("%ld",&pt->date); 
      printf(">请输入收入金额:");
      scanf("%d",&pt->money);
      printf(">请输入备注:");
      scanf("%s",pt->other);
      
      printf(">输入成功!\n"); 
      if(head==NULL){
       head=pt;
       prept=pt; 
      }
      else{
       prept=findlast(head);   //如果指针没有到达当前链表末尾,则知道找到末指针为止(使用findlast函数)
       prept->next=pt;
      }
      pt->next=NULL;
      return head;
     }
    }
    //查找并指向尾节点
    INPUT *findlast(INPUT *head){
     INPUT *pr;
     pr=head;
     while(pr->next!=NULL){
      pr=pr->next;
     }
     return pr;
    }
    INPUT *checknum(INPUT *head,int m)  //编号查询 (如果传入函数的编号和结构体链表中储存的编号有相同,则输出该结构体的地址,否则输出NULL)
    {
     INPUT *pr;
     pr=head;
     while(pr!=NULL){
      if(pr->num==m){
       return pr; 
      }
      else
      pr=pr->next;
     }
     return NULL;
    }
    • 查询收入明细:
      提示查询依据:名字/月份/年份;
      输出所有已查到的信息
      是否继续查询
      是否返回主菜单
    //添加收入函数
    void search_in(INPUT *head){
     int a;
     int sin_num;
     char sin_Name[20];
     long sin_date;
     char c; 
     do{
      INPUT *pr=NULL;
      printf(">请选择查询依据(1.编号;2.月份;3.姓名;4.全部收入):");   //如输入的数字有误,则会报错;
      scanf("%d",&a);
      if(a!=1 && a!=2 && a!=3 && a!=4){
       printf(">输入的数字有误!\n");
       continue;
      }
      else{
       if(a==1){ 
        printf(">输入需要查询的编号:");
        scanf("%d",&sin_num);
        while((pr=checknum(head,sin_num))==NULL){   //按编号查询,调用checknum函数
         printf(">未找到该编号对应的收入信息!\n");
         printf(">请重新输入编号:");
         scanf("%d",&sin_num);
        }
        printf("-------------------------------------------------\n");
        printf(" 编号   成员姓名     日期      收入金额      备注\n");
        printf("% -8d%-13s%-10ld%-14d%-12s\n",pr->num,pr->Name,pr->date,pr->money,pr->other);
       }
       else if(a==2){    
        printf(">输入需要查询的月份(例如:201907):");
        scanf("%ld",&sin_date);
        while(checkmonth(head,sin_date)==0){         //按月份查询,调用checkmonth函数
         printf(">未找到该月份对应的收入信息!\n");
         printf(">请重新输入月份:");
         scanf("%d",&sin_date);
        }
       }
       else if(a==3){
        printf(">输入需要查询的姓名:");
        scanf("%s",&sin_Name);
        while(checkName(head,sin_Name)==0){       //按姓名查询,调用checkName函数
         printf(">未找到该姓名对应的收入信息!\n");
         printf(">请重新输入姓名:");
         scanf("%s",&sin_Name);
        }
       }
       else if(a==4){   		 //显示所有 
        show(head);
       }
       
       printf(">是否继续查询(y/n):");
       getchar();
       scanf("%c",&c);
      } 
     }while(c=='y' ||c=='Y');
     if(c=='n' || c=='N'){
      printf(">请选择要进行的操作(1.返回主菜单;2.直接退出):");
      scanf("%d",&a);
      if(a==2)
      
       exit(0);
     }
    }
     //月份查询 (原理同checunum)
    int checkmonth(INPUT *head,int m)     
    {
     m=m*100;
     int k=0;
     INPUT *pr;
     pr=head;
     if((pr->date)>m && (pr->date)<m+100){
      printf("-------------------------------------------------\n");
      printf(" 编号   成员姓名     日期      收入金额      备注\n");
     }
     while(pr!=NULL){
      if((pr->date)>m && (pr->date)<m+100){
       printf("% -8d%-13s%-10ld%-14d%-12s\n",pr->num,pr->Name,pr->date,pr->money,pr->other);
       pr=pr->next;
       k++;
      }
      else
      pr=pr->next;
     }
     return k;
    }
    //名字查询 (原理同checunum)
    int checkName(INPUT *head,char m[]){
     int k=0;
     INPUT *pr;
     pr=head;
     if(strcmp(pr->Name,m)==0){
      printf("-------------------------------------------------\n");
      printf(" 编号   成员姓名     日期      收入金额      备注\n");
     }
     while(pr!=NULL){
      if(strcmp(pr->Name,m)==0){
       printf("% -8d%-13s%-10ld%-14d%-12s\n",pr->num,pr->Name,pr->date,pr->money,pr->other);
       pr=pr->next;
       k++;
      }
      else
      pr=pr->next;
     }
     return k;
    }
    //显示所有 
    void show(INPUT * head){
     INPUT * p = head;
     printf("\n-------------------------------------------------\n");
     printf(" 编号   成员姓名     日期      收入金额      备注\n"); 
     while (p != NULL){
      printf("%-8d%-13s%-10ld%-14d%-12s\n",p->num,p->Name,p->date,p->money,p->other);
      p = p->next;
     }
    }
    • 删除: 输入编号,判断是否存在,若该信息存在则删除,若不存在则提示错误 (这里特意加的编号,因为其余所有信息都可以一样,这里的话就通过编号以便删除信息) 是否继续删除 是否返回主菜单
    //删除收入
    INPUT *del_in(INPUT *head){
     int a;
     int k=0; 
     INPUT *pt=head;
     INPUT *pr=NULL;
     long del_num;
     char c;
     if(pt==NULL){
      printf(">系统里没有录入数据!要返回主菜单");
      system("pause"); 
      return NULL;
     }
     do{
      pt=head;
      k=0;
      if(pt==NULL){
       printf(">系统里没有录入数据!要返回主菜单");
       system("pause");
       return NULL;
      }
      printf(">请输入需要删除的编号:");
      scanf("%ld",&del_num); 
      
      while(pt!=NULL){
       if(del_num!=pt->num && pt->next!=NULL){   //如果pt不为尾节点而且pt当前所指结构体num编号数据不等于要查询的数据,就让pt指向下一个结构体,pr指向当前结构体
        pr=pt;
        pt=pt->next;
       }
       else if(del_num!=pt->num && pt->next==NULL){    //如果尾节点为空,即跳出循环,说明整个链表中没有找到;
        break;
       } 
       else if(pt->num==del_num &&pt->next!=NULL){     //如果找到了编号相同的结构体且该结构体不为尾节点
        if(pt==head){     //如果该结构体为头,若删掉该结构体就必须更改head的值;
         head=pt->next;
        }
        else{      //如果该结构体不为头,就让上一个pr,即上一个当前结构体直接指向下一个结构体(相当于跨过中间的结构体),让整个链表还是能连接起来;
         pr->next=pt->next;
        }
        k++;
        break;
       }
       else if(pt->num==del_num &&pt->next==NULL){   //如果找到了编号相同的结构体且该结构体为尾节点,则令pr,即上一个当前结构体指向空,即为结束;
        if(pt==head){
         head=pt->next=NULL;
        }
        else{
         pr->next=NULL;
        } 
        k++;
        break;
       }
      }
      
      if(k==0){
       printf(">没有找到需要删除的数据!\n"); 
      }
      else{
       printf(">删除成功!\n"); 
      }
      printf(">是否继续删除(y/n):");
      scanf(" %c",&c); 
     }while(c=='y' || c=='Y');
     printf(">请选择要进行的操作(1)返回主菜单(2)直接退出):");
     scanf("%d",&a);
     if(a==1){
            return head;
     }
     else{
            exit(0);
     }
    }
    • 修改: 询问修改的编号,通过编号进入需要修改内容的收入信息中; 选择修改内容(编号/日期/姓名/备注/金额) 询问是否继续修改当前条数 询问是否修改其他条数 是否返回主菜单
      (修改部分的逻辑较为复杂,建议理解清楚:修改分为是否继续修改当前内容和是否继续修改其他内容,如果都不修改的话才会退出该功能)
    //修改收入
    void modify_in(INPUT *head){
     INPUT *pr;
     char c;
     int a,m_num,s;
     int k=0;
     char ch; 
     do{
      k=0;
      pr=head;
      printf("请输入需要修改的收入编号:");      //第一次修改,没有循环结构
      scanf("%d",&m_num);
      while(pr!=NULL){
       if(pr->num==m_num){
        k+
        printf("请选择需要修改的内容(1.编号;2.日期;3.姓名;4.金额;5.备注):");
        scanf("%d",&s);
        printf("请输入修改的内容:"); 
        if(s==1){
         scanf("%d",&pr->num);
        }
        else if(s==2){
         scanf("%ld",&pr->date);
        }
        else if(s==3){
         scanf("%s",pr->Name);
        }
        else if(s==4){
         scanf("%d",&pr->money);
        }
        else if(s==5){
         scanf("%s",pr->other);
        }
        break;
       }
       
       else{
        pr=pr->next;
       }
      }
      if(k==0){
       printf(">未找到对应的收入信息!"); 
       ch='n'; 
      }
      else if(k>0){
       printf(">修改成功!"); 
       printf("是否继续修改当前收入的内容?(y/n)");
       scanf(" %c",&ch);
      } 
      while(ch=='y' ||ch=='Y'){       //第二次及以后的修改,这里添加了循环结构
       k=0;
       while(pr!=NULL){
        if(pr->num==m_num){
         k++;
         printf("请选择需要修改的内容(1.编号;2.日期;3.姓名;4.金额;5.备注):");
         scanf("%d",&s);
         printf("请输入修改的内容:"); 
         if(s==1){
          scanf("%d",&pr->num);
         }
         else if(s==2){
          scanf("%ld",&pr->date);
         }
         else if(s==3){
          scanf("%s",pr->Name);
         }
         else if(s==4){
          scanf("%d",&pr->money);
         }
         else if(s==5){
          scanf("%s",pr->other);
         }
         break;
        } 
        else{
         pr=pr->next;
        }
       }
       if(k>0){
        printf("修改成功!\n");
       }
       else{
        printf(">未找到对应的收入信息!"); 
       }
       printf("是否继续修改当前收入的内容?(y/n)");
       scanf(" %c",&ch);
      }
      printf("是否继续修改收入?(y/n)");
      scanf(" %c",&c); 
     }while(c=='y'||c=='Y');
     printf(">请选择要进行的操作(1.返回主菜单;2.直接退出):");
     scanf("%d",&a);
     if(a==2){
      exit(0);
     }
    }
    • 统计: 提示所需统计的依据,即姓名/年份/月份 输出总收入,总支出,净收入
    //统计总收入
    INPUT *total_in(INPUT *head)
    {
     INPUT *p=head;
     char ch;
     char c;
     int n,k,a;
     long fin_year,fin_month;
     char fin_Name[20];
     long sum=0;
     do{
      sum=0;
      k=0;
      p=head;
      if(p==NULL){
       printf("系统里没有任何数据!要返回主菜单");
       system("pause");
       return NULL;
      }
      printf("请选择统计依据:(1.姓名;2.年份;3.月份;4.总金额):");
      scanf("%d",&n);
      switch(n){
       case 1:
        printf("请输入姓名:");
        scanf("%s",&fin_Name);
        while(p!=NULL){
         if(!strcmp(fin_Name,p->Name)){
          sum=sum+p->money;
          k++;
         }
         p=p->next;
        }
        if(k==0){
         printf("没有找到该姓名对应的收入信息!\n"); 
        }
        else{
         printf("用户为%s的收入总和为%ld\n",fin_Name,sum);
        }
        break;
       case 2:
        printf("请输入年份:");
        scanf("%ld",&fin_year);
        fin_year=fin_year*10000;
        while(p!=NULL){
         if((fin_year<p->date) &&(fin_year+10000)>p->date){
          sum+=p->money;
          k++;
         }
         p=p->next;
        }
        if(k==0){
         printf("没有找到该年份对应的收入信息!\n"); 
        }
        else{
         printf("年份为%ld的收入总和为%ld\n",fin_year/10000,sum);
        }
        break;
       case 3:
        printf("请输入月份:");
        scanf("%ld",&fin_month);
        fin_month=fin_month*100;
        while(p!=NULL){
         if(fin_month<p->date &&(fin_month+100)>p->date){
          sum+=p->money;
          k++;
         }
          p=p->next;
        }
        if(k==0){
         printf("没有找到该年份对应的收入信息!\n"); 
        }
        else{
         printf("月份为%ld的收入总和为%ld\n",fin_month/100,sum);
        }
        break;
       case 4:
        while(p!=NULL){
         sum=sum+p->money;
         p=p->next;
        } 
        printf("总收入为:%ld\n",sum);
        break;
       default:
        printf("输入的编号有误,请重新输入!");
        break;
       }
      printf("是否要继续查询统计?(y/n)");
      scanf(" %c",&ch);
     }while(ch=='y' ||ch=='Y');
     printf(">请选择要进行的操作(1.返回主菜单;2.直接退出):");
     scanf("%d",&a);
     if(a==2){
      exit(0);
     }
    }

    这里是小小的心得体会(与代码不是特别相关的部分):

    1.因为之前在学课上学c的话只是简单的讲讲语法,讲讲用法及思路,没有真正了解到工程的做法与具体实施,这一次通过合作完成项目了解了一个工程的大概步骤,对真正做一个东西有了概念。
    2.做工程写工程文件,这些不止与单个的c或者c++代码文件有关,要注意函数的划分,各个部分之间的衔接与汇总;注意把声明,函数,主函数各个文件分开并以不同的文件夹存储,方便汇总及管理。

    如果有什么问题欢迎大家提出来呀!

    附:

    完整代码:

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    typedef struct input{      //声明结构体变量
     int  num;
     long date;
     char Name[20];
     int  money;
     char other[50];
     struct input *next;
    }INPUT;
    void menu(int n);  //菜单
    INPUT *add_in(INPUT *head);  //添加收入------------------
    INPUT *build(INPUT *head);       //建立链表,输入数据 
    INPUT *findlast(INPUT *head);    //查找尾节点函数;
    void search_in(INPUT *head); //查询收入------------------------------
    void show(INPUT * head);  //显示查询结果 
    INPUT *checknum(INPUT *head,int m);   //查重(编号查重)函数 
    int checkmonth(INPUT *head,int m);
    int checkName(INPUT *head,char m[]);     
    INPUT *del_in(INPUT *head);  //删除收入--------------------------------
    void modify_in(INPUT *head); //修改收入---------------------------------
    void add_out();  //添加支出
    void search_out(); //查询支出
    void del_out();  //删除支出
    void modify_out(); //修改支出
    INPUT *total_in(INPUT *head);  //统计总收入---------------------
    void total_out();      //统计总支出 
    //主函数部分 
    int main()
    {
     int n = 1;
     INPUT *head=NULL;
     menu(n);
     scanf("%d", &n);
     while (n) {
      switch (n) {
      case 1:
       head=add_in(head);
       break;
      case 2:
       search_in(head);
       break;
      case 3:
       head=del_in(head);
       break;
      case 4:
       modify_in(head);
       break;
      case 5:
       //    add_out();
       break;
      case 6:
       //    search_out();
       break;
      case 7:
       //    del_out();
       break;
      case 8:
       //    modify_out();
       break;
      case 9:
       total_in(head);
       break;
      case 10:
    //   total_out();
      default:
       printf(">输入的数字有误,请重新输入!\n\n");
      }
      if (n>0 && n<10) {
       system("cls");
      }
      menu(n);
      scanf("%d", &n);
     }
     return 0;
    }
    //函数部分 
    void menu(int n)
    {
     if (n > 0 && n < 11)
     {
      printf("                                                      \n");
      printf("  ---------------------------------------------------- \n");
      printf(" |                  家庭财务管理系统                  |\n");
      printf(" |----------------------------------------------------|\n");
      printf(" |                  >收入管理                         |\n");
      printf(" |----------------------------------------------------|\n");
      printf(" |                     1.添加收入                     |\n");
      printf(" |                     2.查询收入详情                 |\n");
      printf(" |                     3.删除收入                     |\n");
      printf(" |                     4.修改收入                     |\n");
      printf(" |----------------------------------------------------|\n");
      printf(" |                  >支出管理                         |\n");
      printf(" |----------------------------------------------------|\n");
      printf(" |                     5.添加支出                     |\n");
      printf(" |                     6.查询支出详情                 |\n");
      printf(" |                     7.删除支出                     |\n");
      printf(" |                     8.修改支出                     |\n");
      printf(" |----------------------------------------------------|\n");
      printf(" |                  >统计                             |\n");
      printf(" |----------------------------------------------------|\n");
      printf(" |                     9.统计总收入                   |\n");
      printf(" |                     10.统计总支出                  |\n");  
      printf(" |----------------------------------------------------|\n");
      printf(" |                     0.退出系统                     |\n");
      printf("  ---------------------------------------------------- \n");
      printf("                                                       \n");
      printf(">请选择要进行的操作(0-10):");
     }
     else if (n >= 11 || n < 0)
     {
      printf(">请选择要进行的操作(0-10):");
     }
    }
    INPUT *build(INPUT *head)   //建立链表 
    {
     INPUT *pt=NULL;    //添加后的当前链表尾节点 ;; 
     INPUT *prept=NULL;   //当前链表尾节点;
     pt=(INPUT *)malloc(sizeof(INPUT));
     if(pt!=NULL){
      printf(">请输入编号:"); 
      scanf("%d",&pt->num);
      while(checknum(head,pt->num)!=NULL){
       printf(">编号重复,请重新输入:");
       scanf("%d",&pt->num);
      }
      printf(">请输入姓名:");
      scanf("%s",pt->Name);
      printf(">请输入日期(例如:20190711):"); 
      scanf("%ld",&pt->date); 
      printf(">请输入收入金额:");
      scanf("%d",&pt->money);
      printf(">请输入备注:");
      scanf("%s",pt->other);
      
      printf(">输入成功!\n"); 
      if(head==NULL){
       head=pt;
       prept=pt; 
      }
      else{
       prept=findlast(head);
       prept->next=pt;
      }
      pt->next=NULL;
      return head;
     }
    }
    INPUT *add_in(INPUT *head)     //添加收入—————————————————————————— 
    { 
     char c='y';
     int a;
     while(c=='y' || c=='Y'){
      head=build(head);
      printf(">是否继续输入?(y/n):");
      scanf(" %c",&c); 
     }
     if(c=='n' || c=='N'){
      printf(">请选择要进行的操作(1.返回主菜单;2.直接退出):");
      scanf("%d",&a);
      if(a==2)
      
       exit(0);
     }
     return head;
    }
    INPUT *findlast(INPUT *head)    //查找尾节点 
    {
     INPUT *pr;
     pr=head;
     while(pr->next!=NULL){
      pr=pr->next;
     }
     return pr;
    }
    INPUT *checknum(INPUT *head,int m)  //编号查询 
    {
     INPUT *pr;
     pr=head;
     while(pr!=NULL){
      if(pr->num==m){
       return pr; 
      }
      else
      pr=pr->next;
     }
     return NULL;
    }
    int checkmonth(INPUT *head,int m)      //月份查询 
    {
     m=m*100;
     int k=0;
     INPUT *pr;
     pr=head;
     if((pr->date)>m && (pr->date)<m+100)
     {
      printf("-------------------------------------------------\n");
      printf(" 编号   成员姓名     日期      收入金额      备注\n");
     }
     while(pr!=NULL){
      if((pr->date)>m && (pr->date)<m+100){
       printf("% -8d%-13s%-10ld%-14d%-12s\n",pr->num,pr->Name,pr->date,pr->money,pr->other);
       pr=pr->next;
       k++;
      }
      else
      pr=pr->next;
     }
     return k;
    }
    int checkName(INPUT *head,char m[])   //名字查询 
    {
     int k=0;
     INPUT *pr;
     pr=head;
     if(strcmp(pr->Name,m)==0)
     {
      printf("-------------------------------------------------\n");
      printf(" 编号   成员姓名     日期      收入金额      备注\n");
     }
     while(pr!=NULL){
      if(strcmp(pr->Name,m)==0){
       printf("% -8d%-13s%-10ld%-14d%-12s\n",pr->num,pr->Name,pr->date,pr->money,pr->other);
       pr=pr->next;
       k++;
      }
      else
      pr=pr->next;
     }
     return k;
    }
    void search_in(INPUT *head)      //查询收入———————————————————————————— 
    {
     int a;
     int sin_num;
     char sin_Name[20];
     long sin_date;
     char c; 
     do{
      INPUT *pr=NULL;
      printf(">请选择查询依据(1.编号;2.月份;3.姓名;4.全部收入):"); 
      scanf("%d",&a);
      if(a!=1 && a!=2 && a!=3 && a!=4){
       printf(">输入的数字有误!\n");
       continue;
      }
      else{
       if(a==1){      //按编号查询 
        printf(">输入需要查询的编号:");
        scanf("%d",&sin_num);
        while((pr=checknum(head,sin_num))==NULL){
         printf(">未找到该编号对应的收入信息!\n");
         printf(">请重新输入编号:");
         scanf("%d",&sin_num);
        }
        printf("-------------------------------------------------\n");
        printf(" 编号   成员姓名     日期      收入金额      备注\n");
        printf("% -8d%-13s%-10ld%-14d%-12s\n",pr->num,pr->Name,pr->date,pr->money,pr->other);
       }
       else if(a==2){     //按月份查询 
        printf(">输入需要查询的月份(例如:201907):");
        scanf("%ld",&sin_date);
        while(checkmonth(head,sin_date)==0){
         printf(">未找到该月份对应的收入信息!\n");
         printf(">请重新输入月份:");
         scanf("%d",&sin_date);
        }
       }
       else if(a==3){
        printf(">输入需要查询的姓名:");
        scanf("%s",&sin_Name);
        while(checkName(head,sin_Name)==0){
         printf(">未找到该姓名对应的收入信息!\n");
         printf(">请重新输入姓名:");
         scanf("%s",&sin_Name);
        }
       }
       else if(a==4){    //显示所有 
        show(head);
       }
       
       printf(">是否继续查询(y/n):");
       getchar();
       scanf("%c",&c);
      } 
     }while(c=='y' ||c=='Y');
     if(c=='n' || c=='N'){
      printf(">请选择要进行的操作(1.返回主菜单;2.直接退出):");
      scanf("%d",&a);
      if(a==2)
      
       exit(0);
     }
    }
    void show(INPUT * head)     //显示所有 
    {
     INPUT * p = head;
     printf("\n-------------------------------------------------\n");
     printf(" 编号   成员姓名     日期      收入金额      备注\n"); 
     while (p != NULL)                                                     
     {
      printf("% -8d%-13s%-10ld%-14d%-12s\n",p->num,p->Name,p->date,p->money,p->other);
      p = p->next;
     }
    }
    INPUT *del_in(INPUT *head)  //删除收入—————————————————————————————————— 
    {
     
     int a;
     int k=0; 
     INPUT *pt=head;
     INPUT *pr=NULL;
     long del_num;
     char c;
     if(pt==NULL){
      printf(">系统里没有录入数据!要返回主菜单");
      system("pause"); 
      return NULL;
     }
     do{
      pt=head;
      k=0;
      if(pt==NULL){
       printf(">系统里没有录入数据!要返回主菜单");
       system("pause");
       return NULL;
      }
      
      printf(">请输入需要删除的编号:");
      scanf("%ld",&del_num);
      
      
      while(pt!=NULL){
       if(del_num!=pt->num && pt->next!=NULL){
        pr=pt;
        pt=pt->next;
       }
       else if(del_num!=pt->num && pt->next==NULL){
        break;
       } 
       else if(pt->num==del_num &&pt->next!=NULL){
        if(pt==head){     
         head=pt->next;
        }
        else{
         pr->next=pt->next;
        }
        k++;
        break;
       }
       else if(pt->num==del_num &&pt->next==NULL){
        if(pt==head){
         head=pt->next=NULL;
        }
        else{
         pr->next=NULL;
        } 
        k++;
        break;
       }
      }
      
      if(k==0){
       printf(">没有找到需要删除的数据!\n"); 
      }
      else{
       printf(">删除成功!\n"); 
      }
      printf(">是否继续删除(y/n):");
      scanf(" %c",&c); 
     }while(c=='y' || c=='Y');
     printf(">请选择要进行的操作(1)返回主菜单(2)直接退出):");
     scanf("%d",&a);
     if(a==1){
            return head;
     }
     else{
            exit(0);
     }
    } 
    void modify_in(INPUT *head)      //修改收入—————————————————————————————————— 
    {
     INPUT *pr;
     char c;
     int a;
     int m_num; 
     int s;
     int k=0;
     char ch; 
     do{
      k=0;
      pr=head;
      printf("请输入需要修改的收入编号:");
      scanf("%d",&m_num);
      while(pr!=NULL){
       if(pr->num==m_num){
        k++;
        printf("请选择需要修改的内容(1.编号;2.日期;3.姓名;4.金额;5.备注):");
        scanf("%d",&s);
        printf("请输入修改的内容:"); 
        if(s==1){
         scanf("%d",&pr->num);
        }
        else if(s==2){
         scanf("%ld",&pr->date);
        }
        else if(s==3){
         scanf("%s",pr->Name);
        }
        else if(s==4){
         scanf("%d",&pr->money);
        }
        else if(s==5){
         scanf("%s",pr->other);
        }
        break;
       }
       
       else{
        pr=pr->next;
       }
      }
      if(k==0){
       printf(">未找到对应的收入信息!"); 
       ch='n'; 
      }
      else if(k>0){
       printf(">修改成功!"); 
       printf("是否继续修改当前收入的内容?(y/n)");
       scanf(" %c",&ch);
      } 
      while(ch=='y' ||ch=='Y'){
       k=0;
       while(pr!=NULL){
        if(pr->num==m_num){
         k++;
         printf("请选择需要修改的内容(1.编号;2.日期;3.姓名;4.金额;5.备注):");
         scanf("%d",&s);
         printf("请输入修改的内容:"); 
         if(s==1){
          scanf("%d",&pr->num);
         }
         else if(s==2){
          scanf("%ld",&pr->date);
         }
         else if(s==3){
          scanf("%s",pr->Name);
         }
         else if(s==4){
          scanf("%d",&pr->money);
         }
         else if(s==5){
          scanf("%s",pr->other);
         }
         break;
        } 
        else{
         pr=pr->next;
        }
       }
       if(k>0){
        printf("修改成功!\n");
       }
       else{
        printf(">未找到对应的收入信息!"); 
       }
       printf("是否继续修改当前收入的内容?(y/n)");
       scanf(" %c",&ch);
      }
      printf("是否继续修改收入?(y/n)");
      scanf(" %c",&c); 
     }while(c=='y'||c=='Y');
     printf(">请选择要进行的操作(1.返回主菜单;2.直接退出):");
     scanf("%d",&a);
     if(a==2){
      exit(0);
     }
    }
    INPUT *total_in(INPUT *head)   //统计总收入—————————————————————————————————— 
    {
     INPUT *p=head;
     char ch;
     char c;
     int n;
     int k;
     int a;
     long fin_year,fin_month;
     char fin_Name[20];
     long sum=0;
     do{
      sum=0;
      k=0;
      p=head;
      if(p==NULL){
       printf("系统里没有任何数据!要返回主菜单");
       system("pause");
       return NULL;
      }
      printf("请选择统计依据:(1.姓名;2.年份;3.月份;4.总金额):");
      scanf("%d",&n);
      switch(n){
       case 1:
        printf("请输入姓名:");
        scanf("%s",&fin_Name);
        while(p!=NULL){
         if(!strcmp(fin_Name,p->Name)){
          sum=sum+p->money;
          k++;
         }
         p=p->next;
        }
        if(k==0){
         printf("没有找到该姓名对应的收入信息!\n"); 
        }
        else{
         printf("用户为%s的收入总和为%ld\n",fin_Name,sum);
        }
        break;
       case 2:
        printf("请输入年份:");
        scanf("%ld",&fin_year);
        fin_year=fin_year*10000;
        while(p!=NULL){
         if((fin_year<p->date) &&(fin_year+10000)>p->date){
          sum+=p->money;
          k++;
         }
         p=p->next;
        }
        if(k==0){
         printf("没有找到该年份对应的收入信息!\n"); 
        }
        else{
         printf("年份为%ld的收入总和为%ld\n",fin_year/10000,sum);
        }
        break;
       case 3:
        printf("请输入月份:");
        scanf("%ld",&fin_month);
        fin_month=fin_month*100;
        while(p!=NULL){
         if(fin_month<p->date &&(fin_month+100)>p->date){
          sum+=p->money;
          k++;
         }
          p=p->next;
        }
        if(k==0){
         printf("没有找到该年份对应的收入信息!\n"); 
        }
        else{
         printf("月份为%ld的收入总和为%ld\n",fin_month/100,sum);
        }
        break;
       case 4:
        while(p!=NULL){
         sum=sum+p->money;
         p=p->next;
        } 
        printf("总收入为:%ld\n",sum);
        break;
       default:
        printf("输入的编号有误,请重新输入!");
        break;
       }
      printf("是否要继续查询统计?(y/n)");
      scanf(" %c",&ch);
     }while(ch=='y' ||ch=='Y');
     printf(">请选择要进行的操作(1.返回主菜单;2.直接退出):");
     scanf("%d",&a);
     if(a==2){
      exit(0);
     }
    }
    展开全文
  • C语言实训项目学生信息管理系统,总结C学习的知识,值得新人学习C语言,过来人就不要浪费时间了,呵呵,来自广东轻院--小天天
  • C语言实训指导书

    2012-12-25 11:17:54
    C语言实训指导书,大专院校第一学期c语言课程,项目总概
  • 安徽国防科技职业学院 C 语 言 课 程 设 计 指 导 书 学期12-13 第 1 学期 班级 软件 121 班 实训日期 第 18 周 指导教师 付贤政 C语言程序设计项目设计指导书 实训班级软件111班 实训时间第18周 一设计目的与任务 C...
  • 防灾科技学院 实习报告书 实习题目 语言网络工程认识实习C 学号 # 姓名 # 专业 网络工程 系别 # 实习时间 2015.5-2015.6 实习地点 北504 指导教师 孙晓玲杜春雷 考勤成绩 10 实习态度 10 任务完成 40 实习报告 20 ...
  • PAGE PAGE # / 35 PAGE PAGE # / 35 防灾科技学院 实习报告书 实习题目 网络工程认识实习C语言 学号 # 姓名 # 专业 网络工程 系别 # 实习时间 2015.5-2015.6 实习地点 北504 指导教师 杜春雷 孙晓玲 考勤成绩 10 ...
  • 在这次实训中,我对对C语言有了一个更深的了解认识,也对这个学期学的知识得到巩固,还尝试运行编程,每次运行程序成功,让我对下面的项目就充满信心。通过自己与同学合作编写程序,最终把最初的理论知识转化基本...
  • 安徽国防科技职业学院 C 语 言 课 程 设 计 指 导 书 学期:12-13第 1学期 班级:软件 121班 实训日期:第 18周 指导教师:付贤政 C 语言程序设计项目设计指导书 实训班级:软件 111班 实训时间:第 18周 一设计目的与任务...
  • C语言实训报告

    2014-09-17 10:09:16
    5、学生信息的修改,修改的项目必须都可行 5、系统以菜单方式工作 6、学生信息用文本txt保存,以便查看 7、有说明功能,便于初使用者查看 8、对于上一次操作保存,下一次可以刷新系统,继续统计信息 尽可能的将课本...
  • PAGE PAGE # / 35 PAGE PAGE # / 35 防灾科技学院 实习报告书 实习题目 网络工程认识实习C语言 学号 # 姓名 # 专业 网络工程 系别 # 实习时间 2015.5-2015.6 实习地点 北504 指导教师 杜春雷 孙晓玲 考勤成绩 10 ...
  • C语言实训学完之后

    2015-05-12 15:19:19
    C语言实训学完之后,进行第一个C项目是:交换机电话文件的提取,操作,以及日志显示等功能!
    C语言实训学完之后,进行第一个C项目是:交换机电话文件的提取,操作,以及日志显示等功能!
    
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 386
精华内容 154
关键字:

c语言项目实训

c语言 订阅