键盘修士 2022-08-14 17:08 采纳率: 50%
浏览 53
已结题

怎样判断票数相同的,并打印输出

我想要达到的结果

#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(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<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);
}
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;
}

  • 写回答

1条回答 默认 最新

  • a5156520 2022-08-14 20:09
    关注

    可以循环遍历存放投票信息的结构数组,然后判断相同的则打印他的名字和票数即可,下面是一个实现,供参考:

    #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;
    }
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月15日
  • 已采纳回答 8月15日
  • 创建了问题 8月14日

悬赏问题

  • ¥15 win10权限管理,限制普通用户使用删除功能
  • ¥15 minnio内存占用过大,内存没被回收(Windows环境)
  • ¥65 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 求螺旋焊缝的图像处理
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?
  • ¥15 网络通信安全解决方案
  • ¥50 yalmip+Gurobi
  • ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面