一个投票系统

一个投票系统C语言

这个里面的程序涵盖了大部分c语言基础知识

  • 这是实现边框的打印
  • 光标的跳转
  • 下面这可以去掉
  • 去掉后要把之后的gotoxy();类似的都要去掉
//实现光标的移动
void gotoxy(int x, int y)
{
	COORD pos;
	HANDLE hOutput;
	pos.X = x;
	pos.Y = y;
	hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOutput, pos);
}
//边框类容内容
void gotoprint(int x, int y)
{
	gotoxy(x, y);
	printf("■");
}
//打印边框
void boundary()
{
	int i;
	for (i = 4; i<62; i += 2)
	{
		gotoprint(i, 2);
		gotoprint(i, 31);
	}
	for (i = 2; i < 32; i++)
	{
		gotoprint(4, i);
		gotoprint(60, i);
		printf("\n");
	}
}
void overmenu()
{
	system("cls");
	boundary();
	gotoxy(30, 13);
	printf("谢谢使用");
	gotoxy(30, 14);
	getchar();
	gotoxy(64,34);
}
  • 以下是完整的程序
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<time.h>
#include<conio.h>
//数组定义
struct stduent {
	char name[20];
	long int ID;
	int id;
	int num;
} stu[1000];
//实现光标的移动
void gotoxy(int x, int y)
{
	COORD pos;
	HANDLE hOutput;
	pos.X = x;
	pos.Y = y;
	hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOutput, pos);
}
//边框类容内容
void gotoprint(int x, int y)
{
	gotoxy(x, y);
	printf("■");
}
//打印边框
void boundary()
{
	int i;
	for (i = 4; i<62; i += 2)
	{
		gotoprint(i, 2);
		gotoprint(i, 31);
	}
	for (i = 2; i < 32; i++)
	{
		gotoprint(4, i);
		gotoprint(60, i);
		printf("\n");
	}
}
void overmenu()
{
	system("cls");
	boundary();
	gotoxy(30, 13);
	printf("谢谢使用");
	gotoxy(30, 14);
	getchar();
	gotoxy(64,34);
}
//信息的录入
void enter(int N)
{
	for (int i = 1; i <=N; i++)
	{
		system("cls");
		boundary();
		gotoxy(15, 13);
	 	printf("请输入第%4d 个参选人的学号:", i);
		scanf("%ld", &stu[i].ID);
		stu[i].id=stu[i].ID%1000;
		gotoxy(15, 14);
		printf("请输入第%4d 个参选人的姓名:", i);
		scanf("%s", stu[i].name);
	}
}
//隐藏字符并将char类型数字字符转化为int型
int digital_hiding(int N)
{
	int n=0,i = 0;
    char in[12],ch;
   	while(1)
    {
        //getchar();
        ch = getch();
        if(ch == '\r')
        {
            in[i]='\0';
            break;
        }
        else
        {
            in[i++] = ch;
            gotoxy(30+i, N+10);
            //if(ch!='\b'&&i<=3)
            printf("*");
        }
    }
        if(in[0]=='n')
            return -1;
        else
        {
            i=0;
            while(in[i]!='\0')
            {
                n=n*10+(int)in[i++]-48;
            }
        }
    return n;
}
//格式排版
void layout(int N,int a)
{
	system("cls");
	boundary();
	gotoxy(15, 3);
	printf("*********************************");
	gotoxy(15, 4);
	printf("*    输入参选人对应学号后三位   *");
	gotoxy(15, 5);
	printf("*   回车投票或者重输,输入n结束  *");
	gotoxy(15, 6);
	printf("*********************************");
	for (int i = 1; i <= N; i++)
	{
		if(stu[i].id<10)
		{
			gotoxy(15,i+6);
			printf("*%8s 的学号后三位是   00%d  *", stu[i].name, stu[i].id);
		}
		else if(stu[i].id<100)
		{
			gotoxy(15,i+6);
			printf("*%8s 的学号后三位是   0%d  *", stu[i].name, stu[i].id);
		}
		else
		{
			gotoxy(15,i+6);
			printf("*%8s 的学号后三位是   %d  *", stu[i].name, stu[i].id);
		}

	}
	gotoxy(15, N+7);
	printf("*********************************");
	gotoxy(15, N+8);
	printf("***输入学号后三位 回车即可投票***");
	gotoxy(15, N+9);
	printf("*********************************");
	gotoxy(15, N+10);
	printf("请第%d名学生输入:",a);
}


//当选者分析
void electee(int N)
{
    int a=0;
	system("cls");
	boundary();
	stu[0]=stu[1];
	gotoxy(28, 3);
	printf("投票结果");
	//将最大值赋值给stu[0]
	for (int i = 1; i <= N; i++)
	{
		gotoxy(17, 3+i);
		printf("*%8s %-11ld的票数是%3d  *", stu[i].name,stu[i].ID, stu[i].num);
 		if(stu[0].num<stu[i].num)
			stu[0]=stu[i];
	}
	//判断最大值是否为一个
	for(int i=1;i<=N;i++)
	{
		if(stu[0].num==stu[i].num)
			a++;
	}
	if(a==1)
	{
		gotoxy(17, 4+N);
		printf("***********************************\n");
		gotoxy(17, 5+N);
		printf("*   当选者是:%8s %-11ld *\n",stu[0].name,stu[0].ID);
		gotoxy(17, 6+N);
		printf("***********************************\n");
		gotoxy(17, 7+N);
		system("pause");
		overmenu();
	}
	else
	{
		gotoxy(20, 4+N);
		printf("***************************\n");
		for(int i=1;i<=N;i++)
		{
			if(stu[0].num==stu[i].num)
			{

				gotoxy(20, 4+N+i);
				printf("%8s",stu[i].name);
			}
		}
		gotoxy(20, 5+N+N);
		printf("他们的票相等且最大无法选出获胜者");
		gotoxy(20,6+N+N);
		system("pause");
		overmenu();
	}
}

//投票函数
void vote(int N)
{
	int temp,a=1;
	while(1)
	{
		layout(N,a);
		temp=digital_hiding(N);
		if(temp==-1)
		{
			break;
		}
		for(int j=1;j<=N;j++)
		{
			if(stu[j].id==temp)
			{
			stu[j].num++;
			a++;
			gotoxy(15,N+11);
			printf("投票成功,继续投票");
			system("pause");
			break;
			}
			else if(j+1>N)
			{
			gotoxy(15,N+11);
			printf("请输入正确的候选人学号");
			gotoxy(15,N+12);
			printf("继续投票");
			system("pause");
			}
  		}
	}
	electee(N);
}
//菜单界面
int menu()
{
	int N;
	boundary();
	gotoxy(25, 13);
	printf("欢迎使用投票系统");
	gotoxy(25, 14);
	printf("请输入参选人数:");
	scanf("%6d",&N);
	return N;
}
int home()
{
    int a;
	boundary();
	gotoxy(25, 13);
	printf("欢迎使用投票系统");
	gotoxy(25, 14);
	printf("请选择:\n");
	gotoxy(25, 15);
	printf("1.新建投票\n");
	gotoxy(25, 16);
	printf("2.查看以前投票\n");
	gotoxy(25, 17);
	printf("3.关闭投票系统\n");
	gotoxy(25, 18);
	scanf("%d",&a);
	system("cls");
	return a;
}
void write_txt(char *names,int N)
{
    FILE *fp;
    fp=fopen(names,"w");
    fprintf(fp,"%-8s %-10s  %-6s\n","姓名","学          号","得票数");
    for(int i=1;i<=N;i++)
    fprintf(fp,"%-8s%10ld%6d\n",stu[i].name,stu[i].ID,stu[i].num);
    fclose(fp);
}
void read_txt(char *names,int N)
{
    FILE *fp;
    fp=fopen(names,"r");
    fscanf(fp,"%*[^\n]");  //跳过一行文字
    for(int i=1;i<=N;i++)
    {
        fscanf(fp,"%s%ld%d\n",stu[i].name,&stu[i].ID,&stu[i].num);
    }
    electee(N);
    fclose(fp);
}
int main()
{
	int N,a;
	char namefile[20];
	system("color 0e");
	system("mode con cols=66 lines=40");
	while(1)
    {
        a=home();
        if(a==2)
        {
            boundary();
            gotoxy(25, 13);
            printf("欢迎使用投票系统");
            gotoxy(25, 14);
            printf("请输入想要读取的文件名");
            getchar();
            gets(namefile);
            read_txt(namefile,N);
        }
        else if(a==1)
        {
            boundary();
            gotoxy(25, 13);
            printf("欢迎使用投票系统");
            gotoxy(25, 14);
            printf("请输入文件名");
            getchar();
            gets(namefile);

            N=menu();
            enter(N);
            vote(N);
            write_txt(namefile,N);
        }
        else break;

    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值