几个小题目 inC

1. 投票程序

【要求】设有代号为a.b.c 三个 足球先生候选人,根据投票者在选票上 对他们编号的 填写顺序分别计分5~3~2.请编程从键盘上 输入投票人数及投票结果,统计他们的 得分,并输出那位当选足球 先生。

【注意】;若同一张票上写 有两个相同的代号,则显示“次票无效”,若最终前两名得分相同应显示“重新投票”,否则显示三个候选人得分并输出“祝贺X当选冠军!”。

例如

投票人数5

输入投票内容;

a b c

c b a

c a a 该票无效

c b a

b c a

三位候选人得分:

a:12

b:13

c:15

祝贺c当选冠军!

【提示】

数据可以用结构体数组,结构体成员包括代号、得分。或者采用二维数组,行方向对应一张投票,列方向对应个候选人得分。

==========================

#include<stdio.h> #define WEIGHT1 5 #define WEIGHT2 3 #define WEIGHT3 2 #define TOTALCANDIDATES 3 //TODO 改进:并列第一名问题! main() { //分别存放各个候选人总票数(得分) int totalVotesOf[TOTALCANDIDATES] = {0}; //分别存放三种不同权重 int weightsOf[TOTALCANDIDATES] = {WEIGHT1, WEIGHT2, WEIGHT3}; //一张票的三个 char voteOf[TOTALCANDIDATES] = {'\0'}; //最多票数 int maxVote = 0; //最多票数的足球先生的编号 a-->0 b-->1 c-->2 int footballKingNo; int i,j; printf("请输入你的投票顺序(足球先生候选人有a,b,c三个,不能重复投票!例如:b,a,c)$,$,$结束投票!\n"); //三个投票者分别为A B C投票 while(1) { scanf("%c,%c,%c", &voteOf[0], &voteOf[1], &voteOf[2]); fflush(stdin); if(voteOf[0]=='$') break;//结束投票 //三张票必须不能重复 if((voteOf[0] != voteOf[1]) && (voteOf[1] != voteOf[2]) && (voteOf[0] != voteOf[2])) { //根据每张选票的投票顺序给各个候选人累加票数 for(j = 0; j < TOTALCANDIDATES; j++) { int tem = voteOf[j] - 'a';//得出候选人号码 totalVotesOf[tem] += weightsOf[j];//给相应候选人累加票数 } } else printf("警告:这次投票有错误投票,在结果中会将其过滤\n"); } //统计投票结果 printf("统计结果:\n\ta的票数为%d\n\tb的票数为%d\n\tc的票数为%d\n",totalVotesOf[0], totalVotesOf[1], totalVotesOf[2]); for(i = 0; i < TOTALCANDIDATES; i++) if(maxVote<totalVotesOf[i]) maxVote = totalVotesOf[i],footballKingNo = i; printf("本次的足球先生获得者为: %c先生!!!\n", footballKingNo + 'a'); }

2. 数组游戏

【要求】

设有n 个正整数(n<=20),将他们连成一排,组成一个最大的多位数。程序输入:n,程序 输出:n 数连接成的 多位数。

【提示】

一下是设计思路

可以将 问题这样变化一下

比如 输入的是123233100612这样几个数字。

先找出最大的 数字的位数为4为,再将所有的 数字变成4位数:1230 2000 3300 1006 1200

然后进行排序:

3300 2000 1200 1006

这样将后面加上去的0去掉的序列不 就是最大数字吗?于是最大数字就是:

3 3 2 1 2 3 1 2 1 0 0 6

#include<stdio.h> #include<stdlib.h> #define N 5 #define BITS 1000 //TODO 原始数据为零会造成死循环,没有动态申请合适的数组个数,需要手动改变N值 main() { // int N; // int i, j, k, l, m; // int * originalData; // int * sortedIndex; // int * sameBitsData; // printf("you want to imput how many integers?"); // scanf("%d",N); // originalData = (int *)calloc(N, sizeof(int)); // sortedIndex = (int *)calloc(N, sizeof(int)); // sameBitsData = (int *)calloc(N, sizeof(int)); int originalData [N] = {0}; int sortedIndex [N] = {0}; int sameBitsData [N] = {0}; int i, j, k, l, m; //获得原始数据,原始数据不能为零! for(i = 0; i < N; i++) scanf("%d",originalData + i); //根据原始数据位数将其规整化,全部变为四位存入sameBitsData数组 for(j = 0; j < N; j++) { //如果少于四位,则给这个数乘十倍,直到成为四位数 *(sameBitsData + j) = *(originalData + j); while(!(*(sameBitsData + j)/BITS))//TODO 原始数据为零会造成死循环 *(sameBitsData + j) *= 10; } //将sameBitsData数值从大到小对应的下标分别存入sortedIndex for(k = 0; k < N;k++) { int max = 0, maxIndex = -1; for(l = 0; l < N; l++) { if(*(sameBitsData + l) > max) max = *(sameBitsData + l),maxIndex = l; } *(sameBitsData + maxIndex) = -1;//已经选出,将其变为最小的避免下一次误当作最大值 sortedIndex[k] = maxIndex; } //按照sortedIndex存储的元素从大到小对应的index取出original的数值拼凑出最大值 for(m = 0; m < N; m++) printf("%d",*(originalData + sortedIndex[m])); printf("\n"); // free(originalData); // free(sortedIndex); // free(sameBitsData); }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值