编写一个投票程序,每张选票只能填写一个人的名字,输入n(n<100),再依次输入n个选票中被选人的姓名,然后输出得票最高者姓名(可多人并列,先达到票数的排在前面)
怎么实现可多人并列,先达到票数的排在前面
#include
#include"string.h"
struct SPerson
{
char name[20]; //姓名
int num; //的票数
}stu[20];
int main()
{
int i,j,n,x[20]={0};
scanf("%d",&n);
for(i=0;iscanf("%s",stu[i].name);stu[i].num=0;}
for(i=0;ifor(j=0;jif(strcmp(stu[i].name,stu[j].name)==0) stu[i].num++;}
for(i=0;ifor(j=0;jif(stu[i].num>=stu[j].num) x[i]++;if(x[i]==n) printf("%s ",stu[i].name);}
return 0;
}
参考下
#include <stdio.h>
#include <string.h>
struct SPerson {
char name[20]; // 姓名
int num; // 票数
int order; // 达到票数的顺序
} candidates[100];
int main() {
int n;
scanf("%d", &n);
// 初始化每个候选人的票数和顺序为0
for (int i = 0; i < n; i++) {
scanf("%s", candidates[i].name);
candidates[i].num = 0;
candidates[i].order = 0;
}
// 统计每个候选人的得票数和达到票数的顺序
int order = 1;
for (int i = 0; i < n; i++) {
char candidateName[20];
scanf("%s", candidateName);
for (int j = 0; j < n; j++) {
if (strcmp(candidates[j].name, candidateName) == 0) {
candidates[j].num++;
if (candidates[j].order == 0) {
candidates[j].order = order;
order++;
}
break;
}
}
}
// 找到得票最高者(可多人并列),并按照达到票数的顺序排列
struct SPerson maxCandidate = {"", -1, -1};
for (int i = 0; i < n; i++) {
if (candidates[i].num > maxCandidate.num ||
(candidates[i].num == maxCandidate.num && candidates[i].order < maxCandidate.order)) {
maxCandidate = candidates[i];
}
}
printf("%s", maxCandidate.name);
for (int i = 0; i < n; i++) {
if (candidates[i].num == maxCandidate.num && candidates[i].order != maxCandidate.order) {
printf(" %s", candidates[i].name);
}
}
printf("\n");
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct SPerson
{
char name[20]; //姓名
int *num; //指向票数数组的指针
}stu[20];
void addVote(char name[], struct SPerson array[], int n)
{
int i;
for(i=0;i<n;i++)
{
if(strcmp(name,array[i].name)==0)
{
array[i].num[i]++;
break;
}
}
}
int main()
{
int i,j,n;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",stu[i].name);
stu[i].num = (int*)malloc(n * sizeof(int)); //动态分配数组空间
for(j=0;j<n;j++)
{
stu[i].num[j] = 0; //初始化票数
}
}
struct SPerson winners[20];
int max = 0, count = 0;
for(i=0;i<n;i++)
{
addVote(stu[i].name, stu, n); //加票
for(j=0;j<n;j++)
{
if(stu[i].num[j] > max)
{
max = stu[i].num[j];
}
}
}
for(i=0;i<n;i++)
{
if(stu[i].num[i] == max)
{
strcpy(winners[count].name,stu[i].name);
winners[count].num = stu[i].num[i];
count++;
}
}
for(i=0;i<count;i++)
{
printf("%s ",winners[i].name);
}
for(i=0;i<n;i++)
{
free(stu[i].num); //释放数组空间
}
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:#include <stdio.h>
void main()
{
int num[50],n,*p,j,loop,i,m,k;
printf("请输入这一圈人的数量:\n");
scanf("%d",&n);
p=num;
//开始给这些人编号
for (j=0;j<n;j++)
{
*(p+j)=j+1;
}
i=0;//i用于计数,即让指针后移
m=0;//m记录退出圈子的人数
k=0;//k报数1,2,3
while(m<n-1)//当退出的人数不大于总人数时,即留下的人数至少是一个人
//这句不能写成m<n,因为假设有8人,当退出了6人时,此时还是进行人数退出,即m++,
//这时是7<8,剩下的一个人自己喊1,2,3那么他也就退出了,将不会有输出
{
if (*(p+i)!=0)//如果这个人的头上编号不是0就开始报数加1,这里采用的方法是报数为3的人头上编号重置为0
{
k++;
}
if (k==3)
{ k=0; //报数清零,即下一个人从1开始报数
*(p+i)=0;//将报数为3的人编号重置为0
m++; //退出人数加1
}
i++; //指针后移
if (i==n)//这句很关键,如果到了队尾,就要使指针重新指向对头
//并且它只能放在i++后面,因为只有i++了才有可能i==n
{
i=0;
}
}
printf("现在剩下的人是:");
for (loop=0;loop<n;loop++)
{
if (num[loop]!=0)
{
printf("%2d号\n",num[loop]);
}
}
}