西南交通大学高级语言程序设计实验2

实验内容:

假设你所在的班级(班级人数最多30人)要进行班长和团支书选举,为此开发如下选举系统。

  1. 系统初始化

运行选举系统后,首先从键盘输入候选人数目m(3£m£8),然后屏幕显示提示信息“请输入第i个候选人姓名:”(i=1,2,…, m),并依次输入m个候选人姓名,将输入的m个候选人姓名存于字符串数组。其中,候选人姓名允许使用中文;

  1. 学生投票

系统在屏幕显示提示信息“请输入学号完成投票(输入-1结束):”,投票学生输入学号后,系统显示当前m个候选人的姓名及已得票数,已得票数显示方式形如:3/8,其中3表示得3票,8表示总共8名学生已投票;

系统在屏幕显示提示信息“请输入你选择的班长:”,完成班长输入(输入形式可采用姓名或候选人编号);

系统在屏幕显示提示信息“请输入你选择的团支书:”,完成团支书输入(输入形式可采用姓名或候选人编号);若团支书与该生已选择的班长是同一候选人,提示“你选择的团支书与班长不允许是同一人,请重新输入你选择的团支书:”,继续输入团支书;

系统在屏幕显示提示信息“你已完成投票,谢谢!”,然后再次显示“请输入学号完成投票(输入-1结束):”,重复上述过程,若输入的学号已投票,显示“该学号已完成投票!”,然后继续显示“请输入学号完成投票(输入-1结束):”;

若输入学号为-1,表示结束当前学生投票过程,进入(3)。

(3)投票结果显示

系统显示如下菜单:

  1. 显示投票学生人数和学号清单

完成投票学生人数和学号清单显示

  1. 显示候选人得票情况

显示格式形如:

共10人投票,

张三(班长得6票,团支书得1票)

李四(班长得3票,团支书得0票)

  1. 显示班长选举结果

按得票数由大至小显示班长各候选人的得票,形如:

班长:

张三(6/10)

李四 (3/10)

4.显示团支书选举结果

显示格式与3.类似

5.继续投票

再次进入(2)功能;

6.保存投票结果*(投票数据存于字符文件,此功能不要求必须实现)

«以下撰写实验报告并粘贴源程序代码»

一、 程序设计描述:

此次实验小程序采用C语言基础程序,运用数组、结构体、指针、函数、文件操作等知识,穿插排序、递归等算法,实现C语言输入与输出的综合功能,应用于班委选举小程序的开发。

二、源程序及注释:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <conio.h>
struct candidate
{ 
   char s[100];
   int number1;
   int number2;
};
typedef struct candidate candidate ;
void main()
{   
   int m, total;
   int i,j;
   int b[30];
   candidate a[8];
   int x;
   char c1 [100] ,c2[100] ;
   int count;
   int p[8], q[8];
   int k;
   printf("请输入候选人数目: ");
   scanf("%d", &m) ;
   for (i=0;i<m;i++)
   {
       printf("请输入第%d个候选人姓名: ", i+1);
       scanf("%s",a[i].s);
       a[i]. number1=0;
       a[i]. number2=0;
    }                                                         //*输入候选人姓名*//
    i=0;
    while(1)
    {
        printf("请输入学号完成投票(输入-1结束): ");
        scanf ("%d", &x) ;
        if(x==-1)  break;
        count = 0;
        for (j=0;j<=i-1;j++)
        {
             if(x==b[j])
             count = 1;
        }
        if (count)  printf("该学号已完成投票! \n");
        else
        {
            b[i] = x;
             printf("请输入你选择的班长: ");
             scanf("%s",c1);
             for (j=0; j<m;j++)
             {
                 if(strcmp(c1,a[j]. s)==0)a[j]. number1++;
             }
             printf("请输入你选择的团支书: ");
             scanf("%s", c2) ;
             while (strcmp (c2, c1)==0)
             {
                 printf ("你选择的团支书与班长不允许是同一人,请重新输入你选择的团支书:");
                 scanf ("%s", c2);
             }
             for (j=0; j<m;j++)
             {
                 if (strcmp (c2,a[j].s)==0)a[j]. number2++;
                 printf("你已完成投票,谢谢! \n"); 
                 i++;
             }
          }                                                      //*投票人投票*//
         total = i;
int menu_select() 
{                                                                 //*菜单函数*//
       inta;
       do{
              system("cls");/*运行前清屏*/  /*菜单选择*/
              printf("             ||Students' Grade ManagementSystem||                    \n");
              printf("                                                                 \n");
              printf("|01.显示投票学生人数和投票清单                                    \n");
              printf("|02.显示候选人得票情况                                           \n");
              printf("|03.显示班长选举结果                                             \n");
              printf("|04.显示团支书选举结果                                           \n");
              printf("|05.继续投票                                                    \n");
              printf("|06.保存投票结果                                                 \n");
              
              printf("                 || Please enter your choice: ||                         \n");
 
              scanf("%d",&a);                                                //*读入选择*//
       }while (a < 0 || a > 13);
       returna;/*返回选择*/
}
void main()
{
   printf(" 投票学生人数: %d\n", total); 
   printf("学号清单: \n");
   for (i=0;i<total;i++)
   printf("%d\n", b[i]) ;
   printf(" 候选人得票情况: \n")
   printf("共%d人投票,\n", total);
   for (i=0;i<m; i++)
   printf("%s(班长得%d票,团支书得%d票)\n", a[i].s, a[i]. number1, a[i]. number2);          
   for (i=0;i<m;i++)                                       //*显示各候选人得票情况*//
   {
       p[i]=i;
       q[i]=i;
   }
   for(i=1;i<m;i++)
   {
       for (j=0;j<m-1:j++)
       {
           if(a[p[j]]. number1<a[p[j+1]]. number1)
           {
                k=p[j];
                p[j]=p[j+1]; 
                p[j+1]=k;
           }
          if(a[q[j]]. number2<a[q[j+1]]. number2)
       {
           k=q[j];
           q[j]=q[j+1]; 
           q[j+1]=k;
       }
   }                                                                 //*排序*//
   printf("显示班长选举结果");
   for(j=1;j<=10;j++)
   {
       printf("%d/10",q[j]);
   }
   for(j=1;j<=10;j++)
   {
       printf("%d/10",q[j]);
   }
}
fclose(fp);/*关闭文件*/
       printf("Successed!\n");
       List_record(stu,n, m);
       printf("\t\t\t");
       system("pause");
       return(n);
}
 
void WritetoText(Student stu[], int n, intm) 
{                                                          /*将选举信息写入文件*/
       inti = 0, k;
       FILE*fp;                                                      /*定义文件指针*/
       charfilename[20];                                                /*定义文件名*/
       printf("WriteRecords to a Text File\n");                            /*输入文件名*/
       printf("Inputthe filename:");
       scanf("%s",filename);
       if(!(fp = fopen(filename, "w")) ) 
       {                                                            /*打开文件*/
                 printf("cann't open the file\n");
                 system("pause");
                 return;
       }
       fprintf(fp,"%d\n", n);                                            /*循环写入数据*/
       while(i < n) 
       {
              fprintf(fp,"%s%s", stu[n + i].num, stu[n + i].name);
              for(k = 0; k < m; k++) 
              {
                     fprintf(fp,"%d", stu[n + i].score[k]);
              }                                                    //写入选举结果到文件
       i++;
       }
       fclose(fp);                                                      /*关闭文件*/
       printf("Successed!\n");                                            /*返回成功信息*/
}

三、大作业反思:

通过实验我也发现了自己不少的问题,这都是只看书上的程序而没有自己亲身上机编写程序而无法得知的,假如我们只因看熟书上的程序就以为自己已经掌握了C语言那就大错特错了。

我主要存在以下的这些缺点:

1、学习耐心 与细心不足,如scanf("%d",&n);中的“&”有时候会忘了。而在最后输出时又错写成printf("%d",&n);从而错误得输出了地址而不是我原来想要的答案。

2、编程思想不够发散, 看着题目有时想不出解答的方法,更不用说编写程序来解题了。

实验中我深刻意识到完成程序的编写,决不意味着万事大吉。认为万无一失的程序, 实际上机运行时可能会出现很多意想不到的问题。有时编译程序检测出一大堆错误,有时程序能够顺利运行,但是运行结果并不是你预期中想要的。因为开发环境所提供的编译系统无法发现程序逻辑错误,或者是你原来所设计时的理论错误,这就只能靠自己的上机经验来分析判断错误的所在了。所以程序的调试是一个技巧性很强的工作,它可能比编个程序耗时更多,体现了上机的重要性。

为了能更好地学好C语言,在今后学习中我要更多的动脑,综合运用所学,多看相关东西,多上机练习,提高电脑水平,增强自学能力,把已会的东西掌握好。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fanfan.V

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值