几个小题目 inC

本文介绍两个C语言编程实例:一个是通过用户输入确定足球先生的投票程序,处理了重复投票和并列第一的情况;另一个是数组游戏,要求将一组数字连成最大的多位数。

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

<think>好的,我现在需要帮用户找一些C语言相关的练习题,特别是涉及周几和第几周的问题。首先,我得看看用户提供的引用内容里有没有相关的信息。 用户提到了引用[1],里面有一个关于计算后天是星期几的C程序。这个例子挺直接的,用户可能想要类似的题目,比如计算某一天之后或之前是星期几,或者根据日期计算周数。另外引用[4]也提到了计算某年每月第一天是星期几的问题,这应该也是相关的。这两个引用都涉及到日期和星期的计算,所以我可以围绕这些知识点来设计题目。 接下来,用户的需求是寻找C语言练习题,可能包括周次和日期的处理。我需要确保题目覆盖不同的难度层次,比如基础题、进阶题和应用题。比如,基础题可以像计算后天星期几那样简单,进阶题可能涉及到给定日期计算当天的星期,或者计算两个日期之间的周数差。应用题可能需要结合文件操作,比如引用[4]中的例子,将结果写入文件。 另外,用户可能还需要一些关于如何解决这些问题的思路,比如使用基姆拉尔森公式来计算星期,或者利用模运算来处理星期的循环。同时要注意边界条件,比如闰年的判断,月份的天数不同,这些都会影响日期的计算。 还需要考虑代码实现的细节,例如如何处理输入输出,如何验证输入的有效性,以及如何优化算法以提高效率。例如,在引用[1]的代码中,输入验证部分检查了星期数是否在1到7之间,否则输出错误信息,这样的处理是必要的。 最后,生成相关问题时要确保问题覆盖用户可能感兴趣的各个方面,比如具体的函数实现、不同的应用场景、以及更复杂的日期计算问题。同时,要引导用户参考提供的引用资料,特别是已有的代码示例,帮助他们理解如何实现这些功能。</think>### C语言日期/周次练习题及解答 ### 一、基础题目 1. **计算后天的星期** 题目要求:输入1-7的整数表示星期一到星期日,输出后天的星期数 ```c #include <stdio.h> int get_aftertomorrow(int today) { return (today + 2 - 1) % 7 + 1; // 保证结果为1-7[^1] } int main() { int d; scanf("%d", &d); printf("%d", (d < 1 || d > 7) ? -1 : get_aftertomorrow(d)); return 0; } ``` 2. **计算第n天后的星期** 扩展题目:输入起始星期和天数,计算结果星期 ```c int calc_weekday(int start, int days) { return (start + days - 1) % 7 + 1; // 循环计算[^1] } ``` ### 二、进阶题目 3. **计算指定日期的星期** 要求:输入年月日,输出当天星期(需考虑闰年) ```c // 基姆拉尔森公式实现 int zeller_formula(int y, int m, int d) { if(m < 3) { m += 12; y--; } return (d + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400 + 1) % 7 + 1; } ``` 4. **计算第几周** 要求:输入日期,判断属于当年的第几周(国际标准:1月1日为第1周,每周从周一开始) ```c int get_week_number(int y, int m, int d) { // 需结合日期差和起始星期计算 // 实现细节需处理闰年、月份天数等[^4] } ``` ### 三、应用题目 5. **生成全年日历** 要求:输出某年各月日历表,标出每周的起始日 ```c void print_calendar(int year) { // 需调用星期计算函数 // 按每月天数循环输出 } ``` 6. **周次统计系统** 要求:读取文件中的日期数据,统计每个日期对应的周次并输出报表 ```c // 文件操作参考 void count_weeks(FILE *in, FILE *out) { // 读取日期→计算周次→统计结果 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值