山东科技大学OJ部分题目记答案

更新时间:2024-06-07 23:20:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

//////////Problem D: 货币兑换 Description

给出人民币对美元、欧元、日元的当日汇率,求给定金额的人民币能兑换成外币的金额,求给定金额的外币能兑换成人民币的金额。 要计算的外币有三种:美元、欧元、日元。 Input

输入有三行。

第一行依次为美元、欧元、日元外币汇率,用空格分开。汇率用100外币为单位,精确到小数点后4位,如668.5200表示“100美元=668.5200人民币”。汇率浮动范围为(0,10000)。 第二行为外币金额x,第三行为人民币金额y。x,y均为整数,且0

输出为两行。

第一行为金额为x的美元、欧元、日元兑换成人民币的金额,用空格分开。 第二行为金额为y的人民币兑换成美元、欧元、日元的金额,用空格分开。 所有金额精确到小数点后两位。 Sample Input

668.5200 908.0685 7.9852 1500 1500

Sample Output

10027.80 13621.03 119.78

#include int main() {

double i,j,k,a,b,c,d,e,f; double x,y;

scanf (\ scanf (\

a=x/100*i;b=y/100*j;c=x/100*k; d=y*100/i;e=y*100/j;f=y*100/k;

printf (\ printf (\}

////Problem E: 求字符的值////

Description

从键盘输入3个字符(不含双字节字符),分别输出每个字符的十进制值(ASCII码)、八进制值和十六进制值。 Input

输入为3个字符。 Output

输出为3行。

每一行为每个字符(对应输入顺序)的十进制、八进制和十六进制值,用空格分隔开。每个输出的值占3个字符,不足3个字符前面补0。 Sample Input

0 A

Sample Output

048 060 030 032 040 020

065 101 041

#include int main() {

char x,y,z;

scanf (\

printf (\ printf (\ printf (\ }

Problem A: 简单的打折计算 Description

商店规定:消费满n元,可以打八八折。设某件商品标价m元,输入购买的件数x,计算出需要支付的金额(单位:元),精确到分。 Input

输入只有一行,三个整数m、n和x,且0

输出金额,精确到分。 Sample Input

95 300 4

Sample Output

334.40

HINT

了解浮点型的输出控制,注意整型和浮点型混合运算过程中的数据类型转换。 #include int main() {int m,n,x; float s;

scanf (\if (m*x>=n)

s=m*x*0.88; else

s=m*x;

printf (\ }

Problem C: 水仙花数 Description

如果一个三位十进制数等于其各位数字的立方和,则称这个数为水仙花数。如:13+53+33=153。 Input

一个整数x,100<=x<=999。 Output

x是水仙花数,则输出“YES”,否则为“NO”。

#include int main() {

int x,a,b,c;

scanf (\ a=x; b=x/10;

c=x/100;

if(a*a*a+b*b*b+c*c*c==x) printf (\ else

printf (\}

Problem A: 多少张钞票 Description

客户去商店买东西时,不超过100美金的账单喜欢用现金支付。商店喜欢用最少的钞票给付客户的找零。请你编写一个程序帮助商店计算出:当客户买了x元商品给了一张100美元的钞票后,商店应该付给客户多少张20美元、10美元、5美元和1美元的钞票,使得钞票总数最少。假设不存在其他面值的钞票,也不会有几角几分的价格,商店的各种钞票总是够用的。 Input

输入一个整数x,0

按顺序输出20美金、10美金、5美金和1美金面值的钞票张数。输出格式见sample。 Sample Input

7

Sample Output

$20 bills: 4 $10 bills: 1 $5 bills: 0 $1 bills: 3

#include int main()

{int x,s,a,b,c,d; scanf (\s=100-x; a=s/20;

b=(s-20*a)/10;

c=(s-20*a-10*b)/5; d=s-20*a-10*b-c*5;

printf (\printf (\printf (\printf (\}

Problem B: 自动拨出电话的程序 Sample Input

(0532)621-15486

Sample Output

008653262115486

HINT

这是个可以用scanf()解决的问题,请注意电话号码都是数字这个规律。 #include int main() {

int a,b,c;

scanf(\ printf(\}

///////Problem C: 求1+2+...+n=?

Description

给定一个n,求出s = 1+2+3+...+n的值。 Input

输入只有一行,包含一个正整数n(n<=232)。 Output

输出一行,为1+2+...+n的值。 Sample Input

10

Sample Output

55

HINT

n的数据范围大,需注意数据类型的选择和计算次序,以避免数据溢出。 #include int main() {

unsigned long long int n,s,i; scanf(\ if(n%2==0)

s=n/2*(n+1); else

s=(n+1)/2*n; printf (\}

/////////////Problem D: 2的多少次幂 Description

从键盘输入一个数x,x是2的整数次幂(x=2y),请编程求出y的值。 Input

一个非负有理数x,x在[0,2256]范围内。 Output

一个整数y。

#include #include int main() {double x,n;

scanf (\

n=(log10(x))/(log10(2)); printf (\}

////Problem A: 输出是m的倍数或n的倍数、但不是m和n的公倍数的数

Description

输出1~k之间是m的倍数或n的倍数、但不是m和n的公倍数的数,其中1<=m,n

输入三个整数,依次为k、m、 n。 Output

从小到大输出符合题意的所有整数,两数之间用一个空格分开。 Sample Input

15 2 3

Sample Output

2 3 4 8 9 10 14 15

#include int main() {

int k,m,n,i=0,j;

scanf (\ for (j=1;j<=k;j++) {

if ((j%m==0&&j%n!=0)||(j%m!=0&&j%n==0)) {i++; if(i==1)

printf (\ else

printf (\ } }

/////Problem B: n个数的最大值和最小值

Description

找出n个数中最大的数和最小的数,并将它们的值输出出来。 Input

输入为n+1个整数,都在int类型范围内。这些数可能用若干空格或者换行符分隔开。 输入的第1个数为n,表示后续有n个数输入。从输入的第2个数开始,求出直到第n+1个数中最大的数和最小的数。 Sample Input

3 0 1 -1

Sample Output

The maximum number is 1. The minimum number is -1.

#include int main() {

int i,n,m,max,min;

scanf (\ min=max;

for(i=1;i

{scanf (\ if (m>max) max=m; if(m

printf(\}

Problem C: 成绩的等级 Description

把百分制的考试成绩转换成五级制的成绩: 90~100:Excellent 80~89:Good 70~79:Average 60~69:Pass 0~59:Failing

不在0~100之间的输入是非法数据,输出“Error”。 Input

输入多行,每行一个整数。 Output

输入所对应的成绩等级。 #include #include #include \int main() {

int n;

while (scanf (\ {

if (n==100)

printf (\ else if(n<0||n>100) printf (\ else

switch (n/10)

{case 9:printf (\ case 8:printf (\ case 7:printf (\ case 6:printf (\ default :printf (\

} }

return 0; }

/////Problem E: A+B Problem (II) : Input/Output Pratice

Description

计算a+b,0<=a,b<1000。 Input

输入的第一行是一个整数N,后面有N对整数a和b,每对a和b占一行,a,b用空格分开。 Output

每行输出一个a+b的和,顺序与输入对应。 Sample Input

2 1 2 10 20

Sample Output

3 30

HINT

N给出了测试样例数,用for循环处理方便。 #include int main() {

int N,i,j;

scanf(\ int a[N][2];

for (i=0;i

for (j=0;j<2;j++)

scanf (\ }

for (i=0;i

printf (\}

Problem A: A+B Problem (III) : Input/Output Pratice Description

计算a+b,0<=a,b<1000。 Input

输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。当测试样为0 0时表示输入结束,0 0不参与运算。 Sample Input

1 2 10 20 0 0

Sample Output

3 30

#include int main() { int a,b; while(1) {

scanf(\ if(a==0&&b==0) break; else

printf(\ } }

Problem C: 只有一个二元运算符的表达式运算 Description

编程序读入并计算只有一个二元运算符的表达式的值。用到的二元运算符有:“+”、“-”、“*”、“/”、“%”,与C语言的语法一致。 Input

每行输入一个表达式,格式为:二个整型的操作数a和b,中间用一个符号分开,这个符号就是运算符。测试样例不存在除数为0的情况。 输入以a和b为0,且用一个空格分开结束。 Output

每行对应输入的运算符为“+”、“-”、“*”、“/”、“%”,则计算a+b、a-b、a*b、a/b、a%b的值;否则输出“invalid op”。

HINT

教材上有非常相似的例题可以参考。 #include int main() {

int a,b; char i; while(1)

{scanf (\ if(a==0&&b==0&&i==32) break; else

{switch(i) {

case '+':printf(\ case '-':printf(\ case '*':printf(\ case '/':printf(\ case '%':printf(\ default:printf(\ } } } }

Problem D: 求100以内的素数 Description

素数是只能被1和自身整除的正整数,根据数学定义1不是素数。素数也叫质数。 Input

输入为两个整数m和n,满足0<=m<=n<=100。 Output

从大到小输出m~n之间的所有素数,一个素数一行。如果m~n之间没有素数,则不输出任何数。

输出的所有数在两行“=====”之间。 Sample Input

2 12

Sample Output

===== 11 7 5 3 2 =====

HINT

利用素数的数学规律可以很容易的解出此题,题目给出的数据范围是关键。 #include int main() {

int m,n,i,j,k;

scanf(\ printf(\ for(i=n;i>=m;i--) { k=0;

for(j=1;j

printf(\

}

printf(\}

Problem E: 十进制整数转二进制 Description

给出一个十进制的非负整数x,x<=216,把它转换成二进制数输出。 Input

输入为多行,每行一个整数x,至读入EOF结束。 Output

每行输出x对应的二进制数值。

#include int main() {

int i,j,m,n,k; int a[17];

while(scanf(\ {if(n==0)

printf(\ else

{

for(m=0;m<=16;m++) {

i=n%2; j=n/2; n=j; a[m]=i; }

for(m=16;m>=0;m--) {

if(a[m]==1) {k=m; break;} }

for(m=k;m>=0;m--) printf(\ printf(\

} } }

/////Problem F: 辗转相除法 最大公约数的算法 Description

辗转相除法,也称欧几里得算法,是求最大公约数的算法。Input

输入为多行,每行有一对非负整数a,b,且a*b不会超出int类型的数据范围。输入至EOF结束。 Output

每行输出一对a,b的最大公约数和最小公倍数,顺序与输入对应。

从数论上的整除定义出发:若a整除b(b除以a没有余数),则b是a的倍数,a是b的约数,这里要求b不为0。因此0是任意整数的倍数,但是0不能是约数。

#include int main()

{ int a,b,c,m,t;

while(scanf(\ { if(a==0&&b!=0)

printf(\ else if(a!=0&&b==0)

printf(\ else

{ if(a

while(c!=0) { a=b; b=c; c=a%b; } printf(\

////Problem A: 简单的整数排序

Description

对给出的若干整数按从小到大排序。 Input

输入的第一个数为n(n<=1000),后接n个整数。 Output

按从小到大的顺序输出这些整数,每两个整数之间用一个空格分隔开,最后一个整数后面没有空格。 Sample Input

10 3 9 1 5 2 8 5 6 7 3

Sample Output

1 2 3 3 5 5 6 7 8 9

#include int main() {

int i,j,n,t; int a[1000]; scanf(\ for(i=0;i

scanf(\ for (i=1;i

for(j=0;ja[j+1])

{t=a[j]; a[j]=a[j+1];a[j+1]=t; } for(i=0;i

printf(\ else

printf(\ } }

/////Problem B: 兔子的繁殖问题

Description

假设一对兔子每月能生一对小兔(一雌一雄),每对小兔出生后的下一个月是没有繁殖能力的,至出生后的第三个月开始又可以每月生一队小兔,问从一对刚出生的小兔开始,经过若干个月后一共有多少兔子(假设在此过程中兔子没有死亡)? Input

输入的第一个数为n,接下来有n个数字。每个数字为一个月份m(m<=45)。 Output

输出为n行,每行为第m个月后的兔子总数。 Sample Input

6

1 2 3 4 5 10

Sample Output

1 2 3 5 8 89

HINT

当n较大时,菲波那契序列的第n项值和计算量都是很大的,可以先计算出菲波那契序列并用数组存储下来,然后查询出每月兔子数,避免重复运算。 #include int main()

{

int i,j,k,n;

int a[50]={0,1,2},b[50]; for(i=3;i<=45;i++)

a[i]=a[i-1]+a[i-2]; scanf(\ for(k=0;k

scanf(\ for(k=0;k

printf(\}

//////Problem C: 产生等差序列之一

Description

根据给出的初始数、公差和序列长度求等差序列。 Input

输入为一行,格式见sample。其中,start为初始数,step为公差,times为序列长度。满足,times>0,step不为0。 Output

把这个等差序列输出在一行里,序列两数之间用一个空格分隔。 Sample Input

start = 1, step = 2, times = 100

Sample Output

1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 101 103 105 107 109 111 113 115 117 119 121 123 125 127 129 131 133 135 137 139 141 143 145 147 149 151 153 155 157 159 161 163 165 167 169 171 173 175 177 179 181 183 185 187 189 191 193 195 197 199

HINT

Append Code

#include int main() {

int i,j,k,n;

char d[100],b[100],c[100]; int a[1000];

scanf(\ for(n=0;n

a[n]=i+j*n; }

for(n=0;n

if(n==k-1)

printf(\ else

printf(\ } }

////Problem D: 产生等差序列之二

Description

根据给出的初始数、公差和终止条件求等差序列。 Input

输入为一行,格式见sample。其中,start为初始数,step为公差,end为终止条件。满足,step不为0,并且start和end的大小关系与step的方向一致。end不一定是序列的最后一个数。 Output

把这个等差序列输出在一行里,序列两数之间用一个空格分隔。 Sample Input

start = 1, step = 2, end = 200

Sample Output

1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 101 103 105 107 109 111 113 115 117 119 121 123 125 127 129 131 133 135 137 139 141 143 145 147 149 151 153 155 157 159 161 163 165 167 169 171 173 175 177 179 181 183 185 187 189 191 193 195 197 199

#include int main() {

int i,j,k,b,n; int a[1000];

scanf(\ a[0]=i; if(j>=0)

for(n=0;a[n]<=k;n++) a[n+1]=i+(n+1)*j; else

for(n=0;a[n]>=k;n++) a[n+1]=i+(n+1)*j; for(b=0;b

printf(\ else

printf (\}

////Problem A: 字符串的逆序

Sample Input

abcde

Sample Output

edcba

#include #include int main()

{int i,j; char s[101]; scanf(\ i=strlen(s);

for(j=i-1;j>=0;j--)printf(\

Problem B: 去行首行尾的空白符 Description

在C语言中,将ASCII字符集中的制表符('\\t')、回车符('\\r')、换行符('\\n')、垂直制表符('\\v')、换页符('\\f')和空格字符(' ')称作空白符。

你的任务是读入每行字符串,去掉行首和行尾的连续空白符,但是在任意非空白符中间的空白符不要去除。 Input

输入为多行,每行为一个串(不超过100个字符),至某行输入的非空白符仅为“END”结束。

Output输出为多行,为每行输入的去掉前后空白符的串。“END”也输出。

#include #include #include int main() {

int i,j=0,k,m,n,a;

char s[1224][123]={{0},{0}},b[1234]={0}; for(i=1;strcmp(s[i-1]+j,\ { gets(s[i]);

for(j=0;isspace(s[i][j])!=0;j++);

for(n=strlen(s[i])-1;isspace(s[i][n])!=0;n--); s[i][n+1]='\\0'; puts(s[i]+j); } }

/////Problem C: 回文

Input

输入为多行,到文件末尾结束。每行为一个串,且不会超过1000个字符,且全部由可显示的ASCII码字符组成。Output当一个串中的字母和数字部分能够构成一个回文,即输出“Yes.”;否则输出“No.”。

HINT

首先要考虑如何去除空白符(空格、回车、换行、制表符等),标点和各种符号(如“,!\和“#@<>{}”等),并且把串中的英文字符统一大小写,最后才能进行回文判定。

请注意,用gets()和scanf()判断文件尾的方法是不一样的。gets()函数的返回值请查阅C语言的语法手册。

#include #include #include int main() {

int i,j,k;

char a[1001],b[1001]; while(gets(a)!=NULL) {

for(i=0,j=0;a[i]!='\\0';i++) {

if(isalnum(a[i])!=0) {

b[j]=a[i]; j++; } }

for(i=0,k=0;i

if(tolower(b[i])==tolower(b[j-1-i])) k++; }

if(k==ceil(j/2.0)) printf(\ else

printf(\ } }

Problem D: Matrix Problem : Array Pratice Description 求一个m×n阶矩阵A的转置矩阵AT。矩阵A的每个元素都在int类型的范围之内。 Input

输入的第一行为一个整数M(M>0),后面有M组输入数据。每组数据以两个正整数m和n开始,满足0

输出为多组,每组输出A的转置矩阵AT。矩阵的输出为:每行两个元素之间用一个空格分开,每行最后一个元素之后为一个换行,在下一行开始输出矩阵的下一行。每两组输出之间用一个空行分隔开。 Sample Input

1 3 3 1 2 3 4 5 6

7 8 9

Sample Output

1 4 7 2 5 8 3 6 9

HINT

二维数组存储矩阵。 #include int main() {

int i,j,c,d,m,n;

int a[100][100],b[100][100]; scanf(\ for(d=0;d

{scanf(\ for(i=0;i

scanf(\ for(i=0;i

printf(\ else

printf (\ printf(\ }

printf(\} }

Problem A: 编写函数maxValue(编程题) Description

编写一个函数maxValue,求三个整数的最大值,其原型为: int maxValue(int a,int b,int c);

其中a、b、c是参与比较的三个整数,返回值是三个数的最大值。 Input

输入三个int类型的整数,两两之间用空格隔开。 Output

输出三个整数的最大值。 Sample Input

1 2 3

Sample Output

3

HINT

Append Code append.c,

#include

int maxValue(int a,int b,int c) {

int x; x=a>b?a:b; if(x

int main() {

int x,y,z;

scanf(\ printf(\ return 0; }

Problem B: 编写函数myFloor和myCeil(编程题)

取整函数有四个,分别是 fix, floor, ceil, round。这里要求你编写myFloor和myCeil函数,它们的原型分别是: int myFloor(double data); int myCeil(double data);

其中myFloor函数的结果是不大于data的最大整数,myCeil函数的结果是不小于data的最小整数。

注意:不能使用math.h和stdlib.h两个头文件。 Input

输入有多行,每行是一个需要转换的实数。 Output

输出为多行,与上述输入一一对应。每行先输出floor函数的结果,再输出ceil函数的结果。两者之间用一个空格隔开。取整之后的结果不超出int类型的表示范围。 Sample Input

1.3 -1.5 2

Sample Output

1 2 -2 -1 2 2

HINT

Append Code append.c,

#include

int myFloor(double data) { int i; if(data>0)

for(i=0;;i++)

{if(data-i>=0&&data-i<1) break; } else

for(i=0;;i--)

{if(i-data<=0&&i-data>-1)

break; } return i; }

int myCeil(double data) {

int i; if(data>0) for(i=0;;i++)

{if(i-data>=0&&i-data<1) break; } else

for(i=0;;i--)

{if(data-i<=0&&data-i>-1) break; }

return i; }

int main() {

double data;

while (scanf(\ {

printf(\ }

return 0; }

Problem C: 求字符串的长度(编程题) Description

编写一个求字符串长度的函数,其原型如下: int strlen(char str[]);

其中str[]表示待求长度的字符串,返回值是str[]的长度。

注意:主函数已经给出,只需提交strlen()函数及必要的头文件包含命令。 Input

输入为多行。第一行N>0表示有N个测试用例,后面有N行,每行包含一个字符串(不超过1000个字符)。 Output

输出为多行,每行对应于一个测试用例。每行的格式为: case i:lenght=j.

其中i表示测试用例编号(从1开始),j表示相应的字符串长度。,

#include int strlen(char str[]) {

int i;

for(i=0;str[i]!='\\0';i++); return i; }

int main() {

int i,N;

char str[1001]; scanf(\ getchar(); gets(str);

printf(\ for (i=2;i<=N;i++) {

gets(str);

printf(\ }

return 0; }

Problem B: 你交换了吗?之二(函数) Description

从标准输入读取两个整数,按先小后大的次序输出,并且输出是否交换过位置。 注意:a和b相等时不产生交换。 请注意阅读append.c里的代码! Input

两个较小的整数a,b,用空格分开。 Output

输出有两种情况:

1) “a b NO”, 当a,b没有交换过 2) “b a YES”, 当a,b交换过 Sample Input

5 3

Sample Output

3 5 YES

#include

int is_swapped(int *p1,int *p2) {

if(*p1>*p2) return 1; else return 0; }

int main() { int a, b;

scanf(\ if(is_swapped(&a, &b))

printf(\ else

printf(\}

Problem C: 编写函数unionSet(编程题) Description

编写一个函数unionSet,对2个集合求并集。其原型为: int unionSet(int setA[],int setB[],int numA,int numB);

其中setA和setB是两个待合并的集合,numA和numB分别是2个集合的元素个数。该函数将两个集合合并后,放在数组setA中,返回值为并集中的元素个数。 Input

输入为2行,每行是一个集合,每行的输入以数值0作为结束,个数不超过100个。2个集合合并后的元素取值均在[1,100]内。 Output

输出2个集合求并后的结果,两两之间用一个空格隔开。输出时,先输出第一个集合中的元素,再输出从第2个集合中合并过来的元素。见样例。 Sample Input

1 2 3 4 5 7 0 2 4 6 8 19 0

Sample Output

1 2 3 4 5 7 6 8 19

HINT

Append Code append.c,

#include

int unionSet(int setA[],int setB[],int numA,int numB) {

int i,j,k,m=0;

for(i=0;setB[i]!=0;i++) {k=0;

for(j=0;j

if(setA[j]!=setB[i]) k++; }

if(k==numA) {

m++;

setA[numA+m-1]=setB[i]; } }

return numA+m; }

int main() {

int setA[101],setB[101],numA,numB,i; numA=numB=0;

scanf(\ while (setA[numA]!=0) {

numA++;

scanf(\ }

scanf(\ while (setB[numB]!=0) {

numB++;

scanf(\ }

numA=unionSet(setA,setB,numA,numB); printf(\ for (i=1; i

printf(\ return 0; }

Problem A: 结构体的使用(编程题) Description

设有结构体定义如下: typedef struct Student {

char major[50];//专业 char name[50];//姓名

int score[3];//3门课程的成绩

} STU;

编写一个子函数,输出每个学生的总分,函数原型如下:

void printInfo(STU students[],int num);

其中students[]是由num个STU类型的结构体组成的数组。 输出格式见下。

注意:主函数已经给出,提交时需提交以下内容:上述结构体STU的定义(直接复制上就可以,要放在头文件包含命令之后)、必要的头文件包含命令以及printInfo函数的代码。

Input

输入为多行。第一行N>0表示有N个学生的信息。之后有N行,每一行包含5个部分,分别表示每位学生的专业、姓名和3门课程的成绩,两两之间用空格隔开。成绩为正整数。

Output

输出为N行,每一行为一名学生的信息,格式为:

major,name:totalSocre.

其中major表示学生的专业,name表示学生的姓名,totalScore表示该生的总分。所有的标点符号均为半角字符。

Sample Input

3

Computer Tom 100 98 89 Information Jack 98 89 87 Management Mary 89 89 89

Sample Output

Computer,Tom:287. Information,Jack:274. Management,Mary:267.

HINT

Append Code

append.c,

#include typedef struct Student {

char major[50]; char name[50]; int score[3]; } STU;

void printInfo(STU students[],int num) {

int i,j; int s;

for(i=0;i

for(j=0;j<3;j++)

s+=students[i].score[j];

printf(\ printf(\ } }

int main() {

int i,N;

scanf(\ STU stus[N]; getchar();

for (i=0;i

scanf(\

scanf(\ }

printInfo(stus,N); return 0; }

Problem B: 谁能上春晚?(编程题) Description

科大电视台将在2013年2月10日举办一场大型春节晚会。为了选拔好节目,科大电视台将于近日举办一次“直通科大春晚”的节目,届时将有M名选手和N名评委参加,并选拔排名前三甲的选手参加春晚。

选手的排序原则是:对每名选手,N个评委的评分需要去掉一个最高分和一个最低分,然后求其平均分,按照平均分进行递减排序。假定任意2名选手的平均得分都不相同。

现在,已知每位评委给每名参数选手的评分,需要你来编写一个程序,输出能够参加春晚的三名选手的名字和得分。 为方便起见,本题要用到如下结构体定义:

typedef struct {

int score[10];//选手的10个得分,得分与评委一一对应 double aver;//选手的平均分 char name[81];//选手的姓名 } Choice;

要求你编写两个函数。一个是

int inputChoice(Choice peo[],int M,int N);

用于输入M名选手的信息。其中peo[]是存储选手信息的结构体数组,M和N分别是选手数和评委数。 第二个是

int sort(Choice peo[],int M,int N);

用于对M名选手根据平均得分排成递减序。其中peo[]是由inputChoice函数输入的M名选手的结构体数组,M和N是选手数和评委数。

main函数已经给出,提交时,只需提交必要的编译预处理命令、结构体定义(直接复制上面的定义语句即可)以及你所编写的函数。

Input

输入的第一行是M和N,表示有M名选手和N名评委。其中3

之后是M行输入,每行以选手的名字为开头(选手名字不超过80个字符,且不含任何空白符),之后是一个空格以及N个得分,得分两两之间用一个空格隔开。

Output

输出为三行,每行是一个能够上春晚的选手的名字和得分,名字和得分用一个空格隔开。输出顺序为冠军、亚军和季军。

Sample Input

4 5

Jack 91 92 93 94 95

Tom 85 84 83 82 81 Mary 92 92 92 92 92 Smith 73 73 73 73 73

Sample Output

Jack 93.00 Mary 92.00 Tom 83.00

HINT

Append Code

append.c,

#include typedef struct {

int score[10]; double aver; char name[81]; } Choice;

int inputChoice(Choice peo[],int M,int N) { int k,j; for(k=0;k

int sort(Choice peo[],int M,int N) { int j,k,a,b,m,n; double s; Choice t; for(k=0;ka) a=peo[k].score[j]; if(peo[k].score[j]

return 0; }

int main() {

Choice peoples[30]; int M,N,i;

scanf(\

inputChoice(peoples,M,N); sort(peoples,M,N); for (i=0; i<3; i++)

printf(\ return 0; }

////Problem B: 填空题:顺序输出字母

Description

按字母顺序输出两个字母st和ed之间的所有字母,但不包括st和ed。不输出逆序。

Input

两个字母st和ed,都是大写字母,用一个空格分开。

Output

在一行内按顺序输出st和ed之间的所有字母,但不包括st和ed。 例如:

输入为A和E,则输出为BCD;

输入为A和B,则什么字母也不输出,只有一个空行; 输入为E和A,也是什么字母也不输出, 只有一个空行。 最后要输出一行(行尾不回车): ***END***

Sample Input

A C

Sample Output

B

***END***

HINT

Append Code

#include int main() {

int i;

char st, ed;

scanf(\

for(i = st+1; i!=ed&&st

printf(\ return 0; }

Problem D: 输出金字塔(填空) Input

输入只有一行,包含一个正整数n和一个字符ch,两者用一个空格隔开。其中n表示金字塔的行数,ch表示构成金字塔的字符。

Output

n行字符ch组成的金字塔,每行要居中。样例所示。

Sample Input

5 *

Sample Output

* *** ***** ******* *********

#include int main() {

int i,j,n; char ch;

scanf(\ for (i=1; i<=n; i++) {

for (j=1; j<=n-i; j++) putchar(' '); for (j=1;j<2*i; j++) putchar(ch); if (i

putchar('\\n'); }

return 0; }

Problem E: 求数组中的最大值(填空)

现有一个不超过1000个整数组成的数组,其中可能有重复数据出现。要求编写一个程序,求该数组中的最大值以及最大值所在的所有下标。部分程序已经给出,请填充空白语句,并提交填充后的完整程序。 部分程序如下:

Input

输入分为2行:第一行是一个正整数0

Output

输出是一行,其格式为:

maximum number is ?, whose positions are:*

其中“?”代表最大值(唯一的),“*”代表最大值所在的位置。如果最大值出现多次,则需输出所有的下标,下标两两之间由半角的逗号“,”隔开。

Sample Input

9

1 2 3 9 5 8 7 8 9

Sample Output

maximum number is 9, whose positions are:3,8

HINT

Append Code

#include int main() {

int array[1000],N,maxIndex[1000],max,i,numOfMax; scanf(\ for (i=0;i

scanf(\ max=array[0]; numOfMax=0;

maxIndex[numOfMax++]=0;

本文来源:https://www.bwwdw.com/article/rkt6.html

Top