1.
候选人得票统计程序。设有3个候选人,每次输入一个得票候选人的名字,不考虑弃权情况,要求最后输出各个候选人的得票结果(参加投票的人数由程序运行时输入)。 输入格式: "输入%d个候选人的基本信息:姓名\n" "%s" "输入参加投票的人数:" "%d" "输入%d个参加投票人的投票情况\n" "%s" 输出格式: "输出%d个候选人的基本信息:姓名,票数\n" "%s %d\n" 程序的运行示例如下: 输入3个候选人的基本信息:姓名 a b c 输入参加投票的人数:5 输入5个参加投票人的投票情况 a a b b c 输出3个候选人的基本信息:姓名,票数 a 2 b 2 c 1
#include <stdio.h>
#include <string.h>
#define MAXN 3
struct Candidate
{
char name[10];
int ticket;
};
typedef struct Candidate cPepl;
int main (void)
{
cPepl a[MAXN];
printf ("输入%d个候选人的基本信息:姓名\n", MAXN);
int i;
for (i = 0; i < MAXN; i ++)
{
scanf ("%s", &a[i].name);
a[i].ticket = 0;
}
int iSum;
printf ("输入参加投票的人数:");
scanf ("%d", &iSum);
printf ("输入%d个参加投票人的投票情况\n", iSum);
for (i = 0; i < iSum; i ++)
{
char vote[10];
scanf ("%s", vote);
if (strcmp (vote, a[0].name) == 0)
{
a[0].ticket ++;
}
if (strcmp (vote, a[1].name) == 0)
{
a[1].ticket ++;
}
if (strcmp (vote, a[2].name) == 0)
{
a[2].ticket ++;
}
}
printf ("输出%d个候选人的基本信息:姓名,票数\n", MAXN);
for (i = 0; i < MAXN; i ++)
{
printf ("%s %d\n", a[i].name, a[i].ticket);
}
}
2.
|
写一个函数接收两个日期,如果两个日期相同,则返回0,如果第一个日期晚于第二个日期,则返回1,如果第一个日期早于第二个日期,则返回-1。并编写main函数测试它。 **输入格式要求:"%d%d%d" 提示信息:"请输入当前日期(年 月 日):" **输出格式要求:"当前日期:%d年%d月%d日!\n" "第一个日期晚于第二个日期!" "第一个日期早于第二个日期!" "两个日期相同!" 程序运行示例如下: 请输入当前日期(年 月 日):2012 9 10↙ 请输入当前日期(年 月 日):2013 7 10↙ 当前日期:2012年9月10日! 当前日期:2013年7月10日! 第一个日期早于第二个日期!
#include <stdio.h>
const char *msg[] = {"第一个日期晚于第二个日期!", "第一个日期早于第二个日期!", "两个日期相同!"};
struct date_rec
{
int day;
int month;
int year;
};
typedef struct date_rec data;
typedef struct date_rec *sPtr;
void Compre (sPtr p, sPtr q);
int main (void)
{
data d1, d2;
printf ("请输入当前日期(年 月 日):");
scanf ("%d%d%d", &d1.year, &d1.month, &d1.day);
printf ("请输入当前日期(年 月 日):");
scanf ("%d%d%d", &d2.year, &d2.month, &d2.day);
printf ("当前日期:%d年%d月%d日!\n", d1.year, d1.month, d1.day);
printf ("当前日期:%d年%d月%d日!\n", d2.year, d2.month, d2.day);
sPtr p = &d1;
sPtr q = &d2;
Compare (p, q);
return 0;
}
void
Compare (sPtr p, sPtr q)
{
if (p -> year < q -> year)
{
printf ("%s", msg[1]);
}
else if (p -> year > q -> year)
{
printf ("%s", msg[0]);
}
else if (p -> year == p -> year)
{
if (p -> month == q -> month)
{
if (p -> day == q -> day)
{
printf ("%s", msg[2]);
}
else if (p -> day > q -> day)
{
printf ("%s", msg[0]);
}
else
{
printf ("%s", msg[1]);
}
}
else if (p -> month > q -> month)
{
printf ("%s", msg[0]);
}
else
{
printf ("%s", msg[1]);
}
}
}
3.
中国有句俗语叫“三天打鱼两天晒网”,某人从90年1月1日起开始“三天打鱼两天晒网”。问这个人在以后的某一天中是在“打渔”,还是在“晒网”. **输入格式要求:"%d%d%d" 提示信息:"Enter year/month/day:" **输出格式要求:"He is fishing.\n" "He is sleeping.\n" 程序运行示例如下: Enter year/month/day:1990 1 5 He is sleeping.
#include<stdio.h>
struct date
{
int year;
int month;
int day;
};
const int Month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
int year_day(int year);
int days (int year, int month, int day);
void isFish (int t);
int main (void)
{
struct date t;
printf ("Enter year/month/day:");
scanf ("%d %d %d", &t.year, &t.month, &t.day);
int n = days (t.year, t.month, t.day);
isFish (n);
}
int
year_day (int year)
{
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
return 366;
}
return 365;
}
int
days (int year, int month, int day)
{
int t = 0, i;
for (i = 1990; i < year; i ++)
{
t += year_day(i);
}
for (i = 0; i < month - 1; i ++)
{
t += Month[i];
}
t += day;
if (year_day(year) == 366 && month > 2)
{
t ++;
}
return t;
}
void
isFish (int t)
{
if (t % 5 == 4 || t % 5 == 0)
{
printf ("He is sleeping.\n");
}
else
{
printf ("He is fishing.\n");
}
}
4.
完成对输入的字符串中C关键词的查找统计。 程序运行示例如下: 本程序将为您统计C语言的关键字的个数,请输入,输入end结束输入: if do while while do break goto helloworld end 您的输入中C语言关键字出现的次数统计如下: break : 1 do : 2 goto : 1 if : 1 while : 2 输入格式: "本程序将为您统计C语言的关键字的个数,请输入,输入end结束输入:\n" 输出格式: "您的输入中C语言关键字出现的次数统计如下:\n" "%-10s: %6d\n"
#include <stdio.h>
#include <string.h>
#define MAXN 32
struct Key
{
char name[10];
int count;
};
struct Key array[MAXN] = {{"break", 0}, {"auto", 0}, {"case",0}, {"char",0}, {"const", 0}, {"continue", 0}, {"do", 0}, {"goto", 0},
{"int", 0}, {"double", 0}, {"long", 0}, {"float", 0}, {"void", 0}, {"strcut", 0}, {"short", 0}, {"signed", 0},
{"unsigned", 0}, {"if", 0}, {"else", 0}, {"for", 0}, {"while", 0}, {"return", 0}, {"sizeof", 0}, {"static", 0},
{"default", 0}, {"case", 0}, {"swicth", 0}, {"register", 0}, {"typedef", 0}, {"union", 0}, {"enum", 0}, {"volatile", 0}};
int main (void)
{
printf ("本程序将为您统计C语言的关键字的个数,请输入,输入end结束输入:\n");
char str[10] = {' '};
int i;
while (strcmp (str, "end") != 0)
{
scanf ("%s", str);
for (i = 0; i <MAXN; i ++)
{
if (strcmp (str, array[i].name) == 0)
{
array[i].count ++;
}
}
}
printf("您的输入中C语言关键字出现的次数统计如下:\n");
for (i = 0; i < MAXN - 1; i ++)
{
if (array[i].count != 0)
{
printf ("%-10s: %6d\n", array[i].name, array[i].count);
}
}
return 0;
}
5.
13个人围成一圈,从第1个人开始顺序报号1、2、3,凡报到3的人退出圈子。找出最后留在圈子里的人原来的序号。要求用结构体编程实现。 输出提示 "出圈成员及顺序:" 格式 "%3d" 输出提示 "\n最后的成员是:" 格式 "%3d" 程序的运行示例如下: 出圈成员及顺序: 3 6 (后面以此类推,抱歉这里的输出结果保密,暂不公开,注意最后一个人是不出圈的哦) 最后的成员是: (抱歉这里的输出结果保密,暂不公开)
#include <stdio.h>
#define MAXN 13
#define MAXP 12
#define MAXH 3
int main (void)
{
int p[MAXN] = {0};
int rest = MAXP;
int cnt = 1;
int j = 0;
printf("出圈成员及顺序:");
while (rest != 0)
{
while (p[j] != 0)
{
j = (j + 1) % MAXN;
}
if (cnt == MAXH)
{
p[j] = 1;
printf ("%3d", j + 1);
rest --;
j = (j + 1) % MAXN;
cnt = 1;
}
else
{
cnt ++;
j = (j + 1) % MAXN;
}
}
printf ("\n最后的成员是:");
int i;
for (i = 0; i < MAXN; i ++)
{
if (p[i] != 1)
{
printf ("%3d", i + 1);
break;
}
}
return 0;
}
6.
给定如下定义: struct time_rec { int hours ; int mins ; int secs ; } ; struct time_rec current_time ; 写一个程序包含如下的函数,完成: (a) 输入current_time的值: void input_time(struct time_rec *current_time) (b) 将current_time增加1秒: void increment_time(struct time_rec *current_time) (c) 显示current_time的新值。 void output_time(struct time_rec *current_time) **输入格式要求:"%d%d%d" 提示信息:"请输入当前时间(时 分 秒):" **输出格式要求:"当前时间:%d时%d分%d秒!
#include <stdio.h>
struct time_rec
{
int hours;
int mins;
int secs;
};
struct time_rec current_time;
void input_time(struct time_rec *current_time);
void increment_time(struct time_rec *current_time);
void output_time(struct time_rec *current_time);
int main (void)
{
printf ("请输入当前时间(时 分 秒):");
struct time_rec *sp = ¤t_time;
input_time (sp);
increment_time (sp);
output_time (sp);
return 0;
}
void
input_time(struct time_rec *sp)
{
scanf ("%d%d%d", &sp -> hours, &sp -> mins, &sp -> secs);
}
void
increment_time(struct time_rec *sp)
{
if (sp -> secs == 59)
{
sp -> secs = 0;
if (sp -> mins == 59)
{
sp -> mins = 0;
if (sp -> hours == 23)
{
sp -> hours = 0;
}
else
{
sp -> hours ++;
}
}
else
{
sp -> mins ++;
}
}
else
{
sp -> secs ++;
}
}
void
output_time(struct time_rec *sp)
{
printf ("当前时间:%d时%d分%d秒!", sp -> hours, sp -> mins, sp -> secs);
}
7.
编程统计候选人的得票数。设有3个候选人zhang、li、wang(候选人姓名不区分大小写),10个选民,选民每次输入一个得票的候选人的名字,若选民输错候选人姓名,则按废票处理。选民投票结束后程序自动显示各候选人的得票结果和废票信息。要求用结构体数组candidate表示3个候选人的姓名和得票结果。 例如: Input vote 1:li Input vote 2:li Input vote 3:Zhang Input vote 4:wang Input vote 5:zhang Input vote 6:Wang Input vote 7:Zhang Input vote 8:wan Input vote 9:li Input vote 10:lii Election results: li:3 zhang:3 wang:2 Wrong election:2 输入格式: "Input vote %d:" "%s" 输出格式: "Election results:\n" 候选人姓名+"%8s:%d\n" "Wrong election:%d\n"
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#define MAXN 10
#define MAXP 3
struct Candidat
{
char name[10];
int ticket;
};
char *toUpper (char *str);
int main (void)
{
struct Candidat candidate[MAXP] = {{"zhang", 0}, {"li", 0}, {"wang", 0}};
int wrong = 0;
int i;
for (i = 0; i < MAXN; i ++)
{
printf ("Input vote %d:", i + 1);
char vote[10];
scanf ("%s", vote);
bool bFlag = false;
if (strcmp (toUpper (vote), "ZHANG") == 0)
{
candidate[0].ticket ++;
bFlag = true;
}
if (strcmp (toUpper (vote), "LI") == 0)
{
candidate[1].ticket ++;
bFlag = true;
}
if (strcmp (toUpper (vote), "WANG") == 0)
{
candidate[2].ticket ++;
bFlag = true;
}
if (bFlag == false)
{
wrong ++;
}
}
printf ("Election results:\n");
printf ("%8s:%d\n", candidate[1].name, candidate[1].ticket);
printf ("%8s:%d\n", candidate[0].name, candidate[0].ticket);
printf ("%8s:%d\n", candidate[2].name, candidate[2].ticket);
printf ("Wrong election:%d\n", wrong);
return 0;
}
char
*toUpper (char *str)
{
char *p = str;
while (*p != '\0')
{
if (*p >= 'a' && *p <= 'z')
{
*p -= 32;
}
p ++;
}
return str;
}
8.
以下程序有若干语法错误,不能正确输出成员a和成员v的值。请找出错误并改正之。
|
#include <stdio.h>
union
{
int a;
struct
{
int u;
float v;
} b;
} m;
int main (void)
{
m.a=200;
m.b.u=500;
m.b.v=120.5;
printf ("%d\t%f\n",m.a,m.b.v);
return 0;
}
9.
*约瑟夫问题。这是十七世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个基督教徒和15个异教徒在海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了个办法:30个人围成一个圆圈,从第一个人开始依次报数,每数到第9个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是异教徒。 本题示例为 @ @ @ @ + + + + + @ @ + @ @ @ + @ + + @ @ + + + @ + + @ @ + (第一个人前无空格,每人中间1个空格) **输出格式要求:"The original circle is (+:papandom, @:christian);\n" "%c "
#include <stdio.h>
#define MAXN 30
#define MAXP 15
#define MAXH 9
int main (void)
{
int p[MAXN] = {0};
int rest = MAXP;
int cnt = 1;
int j = 0;
while (rest != 0)
{
while (p[j] != 0)
{
j = (j + 1) % MAXN;
}
if (cnt == MAXH)
{
p[j] = 1;
rest --;
j = (j + 1) % MAXN;
cnt = 1;
}
else
{
cnt ++;
j = (j + 1) % MAXN;
}
}
printf ("The original circle is (+:papandom, @:christian);\n");
int i;
for (i = 0; i < MAXN; i ++)
{
if (p[i] == 1)
{
printf ("+ ");
}
else
{
printf ("@ ");
}
}
return 0;
}
10.
定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天?注意闰年问题。 输入格式要求:"请输入日期(年,月,日)\n" 输出格式要求:"%d月%d日是%d年的第%d天\n" 程序的运行示例如下: 请输入日期(年,月,日) 1990,2,14↙ 2月14日是1990年的第45天。
#include <stdio.h>
#include <stdbool.h>
struct Date
{
int year;
int month;
int day;
};
bool isLeap (int year);
int main (void)
{
printf("请输入日期(年,月,日)\n");
struct Date date;
scanf ("%d,%d,%d", &date.year, &date.month, &date.day);
bool bFlag = isLeap (date.year);
int sum = 0;
int i;
for (i = 1; i < date.month; i++)
{
if (i == 4 || i == 6 || i == 9 || i == 11)
{
sum += 30;
}
else if (i == 2)
{
if (bFlag == false)
{
sum += 28;
}
else
{
sum += 29;
}
}
else
{
sum += 31;
}
}
sum += date.day;
printf ("%d月%d日是%d年的第%d天\n", date.month, date.day, date.year, sum);
return 0;
}
bool
isLeap (int year)
{
if ((year % 400 == 0) | (year % 100 != 0 && year % 4 == 0))
{
return true;
}
return false;
}