#include
#include
#include
#include
struct Elector
{
char name[32];
int tickets;
};
struct Elector* initXM(struct Elector *pxm,int ptotal)
{
int n;
if (pxm == NULL){
printf("请确定候选人人数为:\n");
scanf("%d",ptotal);
pxm = (struct Elector)malloc(ptotalsizeof(struct Elector));
if (pxm == NULL){
puts("error:分配空间失败");
assert(pxm != NULL);
}
}
int i;
puts("请再次确定参选人都为:");
for (i=0;i<*ptotal;i++){
pxm->tickets = 0;
printf("第%d个参选人为:\n",i+1);
scanf("%s",pxm->name);
pxm++;
}
pxm = pxm -*ptotal;
return pxm;
}
int doVot(struct Elector *pxm,int *ptotal)
{
int i,j;
int mark = 0;
int feipiao = 0;
struct Elector *p = pxm;
char tmpname[32];
int tmp;
puts("请确定参与投票人数:");
scanf("%d",&tmp);
for (i=0;i
memset(tmpname,'\0',sizeof(tmpname));
mark = 0;
pxm = p;
puts("请问你投给谁:");
scanf("%s",tmpname);
for (j=0;j<*ptotal;j++){
if (strcmp(tmpname,pxm->name) == 0){
pxm->tickets++;
mark = 1;
}
pxm++;
}
if (mark == 0){
puts("error:投票无效,废票!!");
feipiao++;
}
}
return feipiao;
}
void printXM(struct Elector *pxm,int feipiao,int total)
{
int i;
struct Elector *max;
int bak = 0;
max = pxm;
for (i=0;i
printf("名字: %s,票数: %d\n",pxm->name,pxm->tickets);
pxm++;
}
printf("废票为%d张\n",feipiao);
pxm = max ;
for (i=0;i
if (max->tickets < pxm->tickets){
max = pxm;
}
pxm++;
}
printf("%s最终以最高票数%d票当选人大代表\n",max->name,max->tickets);
}
int main()
{
struct Elector *xm = NULL;
int total = 0;
int feipiao = 0;
xm = initXM(xm,&total);
feipiao = doVot(xm,&total);
printXM(xm,feipiao,total);
return 0;
}
可以循环遍历存放投票信息的结构数组,然后判断相同的则打印他的名字和票数即可,下面是一个实现,供参考:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
struct Elector
{
char name[32];
int tickets;
};
struct Elector* initXM(struct Elector *pxm,int *ptotal)
{
int n;
if (pxm == NULL){
printf("请确定候选人人数为:\n");
scanf("%d",ptotal);
pxm = (struct Elector *)malloc(*ptotal*sizeof(struct Elector));
if (pxm == NULL){
puts("error:分配空间失败");
assert(pxm != NULL);
}
}
int i;
puts("请再次确定参选人都为:");
for (i=0;i<*ptotal;i++){
pxm->tickets = 0;
printf("第%d个参选人为:\n",i+1);
scanf("%s",pxm->name);
pxm++;
}
pxm = pxm -*ptotal;
return pxm;
}
int doVot(struct Elector *pxm,int *ptotal)
{
int i,j;
int mark = 0;
int feipiao = 0;
struct Elector *p = pxm;
char tmpname[32];
int tmp;
puts("请确定参与投票人数:");
scanf("%d",&tmp);
for (i=0;i<tmp;i++){
memset(tmpname,'\0',sizeof(tmpname));
mark = 0;
pxm = p;
puts("请问你投给谁:");
scanf("%s",tmpname);
for (j=0;j<*ptotal;j++){
if (strcmp(tmpname,pxm->name) == 0){
pxm->tickets++;
mark = 1;
}
pxm++;
}
if (mark == 0){
puts("error:投票无效,废票!!");
feipiao++;
}
}
return feipiao;
}
void printXM(struct Elector *pxm,int feipiao,int total)
{
int i;
struct Elector *max;
int bak = 0;
max = pxm;
for (i=0;i<total;i++){
printf("名字: %s,票数: %d\n",pxm->name,pxm->tickets);
pxm++;
}
printf("废票为%d张\n",feipiao);
pxm = max ;
for (i=0;i<total;i++){
if (max->tickets < pxm->tickets){
max = pxm;
}
pxm++;
}
printf("%s最终以最高票数%d票当选人大代表\n",max->name,max->tickets);
}
void printSame(struct Elector * pxm, int total){
char temp[32];
int t;
for (int i=0;i<total-1; i++){
for(int j=i;j<total;j++){
if(pxm[i].tickets<pxm[j].tickets){
strcpy(temp,pxm[i].name);
strcpy(pxm[i].name,pxm[j].name);
strcpy(pxm[j].name,temp);
t = pxm[i].tickets;
pxm[i].tickets=pxm[j].tickets;
pxm[j].tickets=t;
}
}
}
/** printf(" 排序后的数据为:\n");
for (int i=0;i<total; i++){
printf("姓名:%s , 票数:%d .\n", pxm[i].name, pxm[i].tickets);
}*/
printf("票数相同的有:\n");
int i=0;
int notsame=0;
while(i<total-1){
if(pxm[i].tickets==pxm[i+1].tickets){ //如果前后的票数相同则打印他们的信息
//printf("in if.\n");
printf("姓名:%s , 票数:%d .\n", pxm[i].name, pxm[i].tickets);
printf("姓名:%s , 票数:%d .\n", pxm[i+1].name, pxm[i+1].tickets);
i++;
while((i<total-1)&&(pxm[i].tickets==pxm[i+1].tickets)){ //如果前后的票数相同,则打印后面一个的票数信息,前面那个已经打印所以不再打印
//if(strcmp(pxm[i].name,pxm[i+1].name )!=0){
//printf("int scond while if,pxm[i].name=%s,pxm[i+1].name=%s .\n",pxm[i].name,pxm[i+1].name);
printf("姓名:%s , 票数:%d .\n", pxm[i+1].name, pxm[i+1].tickets);
//}
notsame=1; //标志已经不同了,即i已经++
i++;
}
}
if(notsame==0){ //如果没有经过比较没有++,则i++,以比较下一个
i++;
}
notsame=0;
}
}
int main()
{
struct Elector *xm = NULL;
int total = 0;
int feipiao = 0;
xm = initXM(xm,&total);
feipiao = doVot(xm,&total);
printXM(xm,feipiao,total);
printSame(xm,total);
return 0;
}