实验内容:
假设你所在的班级(班级人数最多30人)要进行班长和团支书选举,为此开发如下选举系统。
系统初始化
运行选举系统后,首先从键盘输入候选人数目m(3£m£8),然后屏幕显示提示信息“请输入第i个候选人姓名:”(i=1,2,…, m),并依次输入m个候选人姓名,将输入的m个候选人姓名存于字符串数组。其中,候选人姓名允许使用中文;
学生投票
系统在屏幕显示提示信息“请输入学号完成投票(输入-1结束):”,投票学生输入学号后,系统显示当前m个候选人的姓名及已得票数,已得票数显示方式形如:3/8,其中3表示得3票,8表示总共8名学生已投票;
系统在屏幕显示提示信息“请输入你选择的班长:”,完成班长输入(输入形式可采用姓名或候选人编号);
系统在屏幕显示提示信息“请输入你选择的团支书:”,完成团支书输入(输入形式可采用姓名或候选人编号);若团支书与该生已选择的班长是同一候选人,提示“你选择的团支书与班长不允许是同一人,请重新输入你选择的团支书:”,继续输入团支书;
系统在屏幕显示提示信息“你已完成投票,谢谢!”,然后再次显示“请输入学号完成投票(输入-1结束):”,重复上述过程,若输入的学号已投票,显示“该学号已完成投票!”,然后继续显示“请输入学号完成投票(输入-1结束):”;
若输入学号为-1,表示结束当前学生投票过程,进入(3)。
(3)投票结果显示
系统显示如下菜单:
显示投票学生人数和学号清单
完成投票学生人数和学号清单显示
显示候选人得票情况
显示格式形如:
共10人投票,
张三(班长得6票,团支书得1票)
李四(班长得3票,团支书得0票)
…
显示班长选举结果
按得票数由大至小显示班长各候选人的得票,形如:
班长:
张三(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语言,在今后学习中我要更多的动脑,综合运用所学,多看相关东西,多上机练习,提高电脑水平,增强自学能力,把已会的东西掌握好。