目录
81、习题7-7 字符串替换
82、习题8-10 输出学生成绩
83、习题8-2 在数组中查找指定元素
84、习题8-3 数组循环右移
85、题8-9 分类统计各类字符个数
86、习题9-2 计算两个复数之积
87、习题9-6 按等级统计学生成绩
88、习题11-1 输出月份英文名
89、习题11-2 查找星期
90、练习10-1 使用递归函数计算1到n之和
91、习题10-2 递归求阶乘和
92、习题8-5 使用函数实现字符串部分复制
93、习题8-6 删除字符
94、习题8-8 判断回文字符串
95、习题10-3 递归实现指数函数
96、习题10-4 递归求简单交错幂级数的部分和
97、习题10-5 递归计算Ackermenn函数
98、习题10-6 递归求Fabonacci数列
99、习题10-7 十进制转换二进制
100、习题10-8 递归实现顺序输出整数
81、习题7-7 字符串替换
本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换:
原字母 | 对应字母 |
A | Z |
B | Y |
C | X |
D | W |
... | ... |
X | C |
Y | B |
Z | A |
输入格式:
输入在一行中给出一个不超过80个字符、并以回车结束的字符串。
输出格式:
输出在一行中给出替换完成后的字符串。
输入样例:
Only the 11 CAPItaL LeTtERS are replaced.
输出样例:
Lnly the 11 XZKRtaO OeGtVIH are replaced.
注: 编程重点
A+Z=155
B+Y=155
C+X=155
D+W=155
… …
X+C=155
Y+B=155
Z+A=155
代码:
#include<stdio.h>
// A+Z=155
// B+Y=155
// ......
int main()
{
char str[81];
gets(str);
int i;
for(i=0;i<strlen(str);i++)
{
if(str[i]>='A'&&str[i]<='Z')
{
str[i]=155-str[i];
}
}
puts(str);
}
82、习题8-10 输出学生成绩
本题要求编写程序,根据输入学生的成绩,统计并输出学生的平均成绩、最高成绩和最低成绩。建议使用动态内存分配来实现。
输入格式:
输入第一行首先给出一个正整数N,表示学生的个数。接下来一行给出N个学生的成绩,数字间以空格分隔。
输出格式:
按照以下格式输出:
average = 平均成绩
max = 最高成绩
min = 最低成绩
结果均保留两位小数。
输入样例:
3
85 90 95
输出样例:
average = 90.00
max = 95.00
min = 85.00
代码:
#include<stdio.h>
double fun(int *arr,int n,int l)
{
int i;
int index=0;
for(i=1;i<n;i++)
{
if(l==1)
{
if(arr[i]>=arr[index]) index=i;
}
else
{
if(arr[i]<=arr[index]) index=i;
}
}
return arr[index]/1.0;
}
int main()
{
int N;
int arr[10000];
scanf("%d",&N);
int i;
int sum=0;
for(i=0;i<N;i++)
{
scanf("%d",&arr[i]);
sum+=arr[i];
}
printf("average = %.2lf\n",sum/(double)N);
printf("max = %.2lf\n",fun(&arr,N,1));
printf("min = %.2lf\n",fun(&arr,N,2));
return 0;
}
83、习题8-2 在数组中查找指定元素
本题要求实现一个在数组中查找指定元素的简单函数。
函数接口定义:
int search( int list[], int n, int x );
其中list[]是用户传入的数组;n(≥0)是list[]中元素的个数;x是待查找的元素。如果找到
则函数search返回相应元素的最小下标(下标从0开始),否则返回−1。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
int search( int list[], int n, int x );
int main()
{
int i, index, n, x;
int a[MAXN];
scanf("%d", &n);
for( i = 0; i < n; i++ )
scanf("%d", &a[i]);
scanf("%d", &x);
index = search( a, n, x );
if( index != -1 )
printf("index = %d\n", index);
else
printf("Not found\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
5
1 2 2 5 4
2
输出样例1:
index = 1
输入样例2:
5
1 2 2 5 4
0
输出样例2:
Not found
代码:
int search( int list[], int n, int x )
{
int i;
int l=-1;
for(i=0;i<n;i++)
{
if(list[i]==x){l=1;break;}
}
if(l==1) return i;
else return l;
}
84、习题8-3 数组循环右移
本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置,即将a中的数据由变换为(最后m个数循环移最前面的m个位置)。
函数接口定义:
int ArrayShift( int a[], int n, int m );
其中 a[] 是用户传入的数组;n是数组的大小;m是右移的位数。函数 ArrayShift 须将循环右移后的数组仍然存在a[]中。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
int ArrayShift( int a[], int n, int m );
int main()
{
int a[MAXN], n, m;
int i;
scanf("%d %d", &n, &m);
for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);
ArrayShift(a, n, m);
for ( i = 0; i < n; i++ ) {
if (i != 0) printf(" ");
printf("%d", a[i]);
}
printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
代码:
int ArrayShift( int a[], int n, int m )
{
int i;
int k;
for(k=1;k<=m;k++)
{
int temp=a[n-1];
for(i=n-1;i>0;i--)
{
a[i]=a[i-1];
}
a[0]=temp;
}
}
85、题8-9 分类统计各类字符个数
本题要求实现一个函数,统计给定字符串中的大写字母、小写字母、空格、数字以及其它字符各有多少。
函数接口定义:
void StringCount( char *s );
其中 char *s 是用户传入的字符串。函数 StringCount 须在一行内按照
大写字母个数 小写字母个数 空格个数 数字个数 其它字符个数
的格式输出。
裁判测试程序样例:
#include <stdio.h>
#define MAXS 15
void StringCount( char *s );
void ReadString( char *s ); /* 由裁判实现,略去不表 */
int main()
{
char s[MAXS];
ReadString(s);
StringCount(s);
return 0;
}
/* Your function will be put here */
输入样例:
aZ&*?
093 Az
输出样例:
2 2 1 3 4
代码:
void StringCount( char *s )
{
int suma=0; //小写字母个数
int sumA=0; //大写字母个数
int sum_=0; //空格个数
int sum1=0; //数字个数
// int sumO=0;
int i;
int len=strlen(s);
for(i=0;i<len;i++)
{
if(s[i]>='A'&&s[i]<='Z') sumA++;
if(s[i]>='a'&&s[i]<='z') suma++;
if(s[i]==' ') sum_++;
if(s[i]>='0'&&s[i]<='9') sum1++;
}
printf("%d %d %d %d %d\n",sumA,suma,sum_,sum1,len-(suma+sumA+sum_+sum1));
}
86、习题9-2 计算两个复数之积
本题要求实现一个计算复数之积的简单函数。
函数接口定义:
struct complex multiply(struct complex x, struct complex y);
其中 struct complex 是复数结构体,其定义如下:
struct complex{
int real;
int imag;
};
裁判测试程序样例:
#include <stdio.h>
struct complex{
int real;
int imag;
};
struct complex multiply(struct complex x, struct complex y);
int main()
{
struct complex product, x, y;
scanf("%d%d%d%d", &x.real, &x.imag, &y.real, &y.imag);
product = multiply(x, y);
printf("(%d+%di) * (%d+%di) = %d + %di\n", x.real, x.imag, y.real, y.imag, product.real, product.imag);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
3 4 5 6
输出样例:
(3+4i) * (5+6i) = -9 + 38i
代码:
struct complex multiply(struct complex x, struct complex y)
{
struct complex t;
t.real=x.real*y.real-x.imag*y.imag;
t.imag=x.real*y.imag+y.real*x.imag;
return t;
};
87、习题9-6 按等级统计学生成绩
本题要求实现一个根据学生成绩设置其等级,并统计不及格人数的简单函数。
函数接口定义:
int set_grade( struct student *p, int n );
其中 p 是指向学生信息的结构体数组的指针,该结构体的定义为:
struct student{
int num;
char name[20];
int score;
char grade;
};
n 是数组元素个数。学号 num 、姓名 name 和成绩 score 均是已经存储好的。set_grade 函数需要根据学生的成绩 score 设置其等级 grade 。等级设置:85-100为A,70-84为B,60-69为C,0-59为D。同时, set_grade 还需要返回不及格的人数。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
struct student{
int num;
char name[20];
int score;
char grade;
};
int set_grade( struct student *p, int n );
int main()
{
struct student stu[MAXN], *ptr;
int n, i, count;
ptr = stu;
scanf("%d\n", &n);
for(i = 0; i < n; i++){
scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score);
}
count = set_grade(ptr, n);
printf("The count for failed (<60): %d\n", count);
printf("The grades:\n");
for(i = 0; i < n; i++)printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
10
31001 annie 85
31002 bonny 75
31003 carol 70
31004 dan 84
31005 susan 90
31006 paul 69
31007 pam 60
31008 apple 50
31009 nancy 100
31010 bob 78
输出样例:
The count for failed (<60): 1
The grades:
31001 annie A
31002 bonny B
31003 carol B
31004 dan B
31005 susan A
31006 paul C
31007 pam C
31008 apple D
31009 nancy A
31010 bob B
代码:
int set_grade( struct student *p, int n )
{
int i;
int temp=0;
for(i=0;i<n;i++)
{
if(p[i].score>=85&&p[i].score<=100) p[i].grade='A';
if(p[i].score>=70&&p[i].score<=84) p[i].grade='B';
if(p[i].score>=60&&p[i].score<=69) p[i].grade='C';
if(p[i].score>=0&&p[i].score<=59) {p[i].grade='D';temp++;}
}
return temp;
}
88、习题11-1 输出月份英文名
本题要求实现函数,可以返回一个给定月份的英文名称。
函数接口定义:
char *getmonth( int n );
函数 getmonth 应返回存储了 n 对应的月份英文名称的字符串头指针。如果传入的参数 n 不是一个代表月份的数字,则返回空指针NULL。
裁判测试程序样例:
#include <stdio.h>
char *getmonth( int n );
int main()
{
int n;
char *s;
scanf("%d", &n);
s = getmonth(n);
if ( s==NULL ) printf("wrong input!\n");
else printf("%s\n", s);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
5
输出样例1:
May
输入样例2:
15
输出样例2:
wrong input!
代码:
char *getmonth( int n )
{
if(n>12||n<=0) return NULL;
else
{
if(n==1) return "January";
if(n==2) return "February";
if(n==3) return "March";
if(n==4) return "April";
if(n==5) return "May";
if(n==6) return "June";
if(n==7) return "July";
if(n==8) return "August";
if(n==9) return "September";
if(n==10) return "October";
if(n==11) return "November";
if(n==12) return "December";
}
}
89、习题11-2 查找星期
本题要求实现函数,可以根据下表查找到星期,返回对应的序号。
序号 | 星期 |
0 | Sunday |
1 | Monday |
2 | Tuesday |
3 | Wednesday |
4 | Thursday |
5 | Friday |
6 | Saturday |
函数接口定义:
int getindex( char *s );
函数 getindex 应返回字符串 s 序号。如果传入的参数 s 不是一个代表星期的字符串,则返回-1。
裁判测试程序样例:
#include <stdio.h>
#include <string.h>
#define MAXS 80
int getindex( char *s );
int main()
{
int n;
char s[MAXS];
scanf("%s", s);
n = getindex(s);
if ( n==-1 ) printf("wrong input!\n");
else printf("%d\n", n);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
Tuesday
输出样例1:
2
输入样例2:
today
输出样例2:
wrong input!
代码:
int getindex( char *s )
{
char str[8][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int i,j;
int len=strlen(s);
int l=-1;
for(i=0;i<7;i++)
{
if(strcmp(s,str[i])==0)
{
l=1;break;
}
}
if(l==1) return i;
else return -1;
}
90、练习10-1 使用递归函数计算1到n之和
本题要求实现一个用递归计算1+2+3+…+n的和的简单函数。
函数接口定义:
int sum( int n );
该函数对于传入的正整数n返回1+2+3+…+n的和;若n不是正整数则返回0。题目保证输入输出在长整型范围内。建议尝试写成递归函数。
裁判测试程序样例:
#include <stdio.h>
int sum( int n );
int main()
{
int n;
scanf("%d", &n);
printf ("%d\n", sum(n));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
10
输出样例1:
55
输入样例2:
0
输出样例2:
0
代码:
int sum( int n )
{
if(n>0)
{
if(n==1) return 1;
else return n+sum(n-1);
}
else return 0;
}
91、习题10-2 递归求阶乘和
本题要求实现一个计算非负整数阶乘的简单函数,并利用该函数求 1!+2!+3!+...+n! 的值。
函数接口定义:
double fact( int n );
double factsum( int n );
函数 fact 应返回 n 的阶乘,建议用递归实现。函数 factsum 应返回 1!+2!+...+ n! 的值。题目保证输入输出在双精度范围内。
裁判测试程序样例:
#include <stdio.h>
double fact( int n );
double factsum( int n );
int main()
{
int n;
scanf("%d",&n);
printf("fact(%d) = %.0f\n", n, fact(n));
printf("sum = %.0f\n", factsum(n));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
10
输出样例1:
fact(10) = 3628800
sum = 4037913
输入样例2:
0
输出样例2:
fact(0) = 1
sum = 0
代码:
double fact( int n )
{
if(n==1||n==0) return 1;
else return n*fact(n-1);
}
double factsum( int n )
{
int i;
double sum=0;
if(n==0) return 0;
else
{
for(i=1;i<=n;i++)
sum+=fact(i);
return sum;
}
}
92、习题8-5 使用函数实现字符串部分复制
本题要求编写函数,将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。
函数接口定义:
void strmcpy( char *t, int m, char *s );
函数strmcpy将输入字符串char *t中从第m个字符开始的全部字符复制到字符串char *s中。若m超过输入字符串的长度,则结果字符串应为空串。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 20
void strmcpy( char *t, int m, char *s );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */
int main()
{
char t[MAXN], s[MAXN];
int m;
scanf("%d\n", &m);
ReadString(t);
strmcpy( t, m, s );
printf("%s\n", s);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
7
happy new year
输出样例:
new year
代码:
void strmcpy( char *t, int m, char *s )
{
int len=strlen(t);
int i=0;
if(m>len) *s=NULL;
else
{
m=m-1;
while(t[m]!='\0')
{
s[i++]=t[m];
m++;
}
s[i]='\0';
}
}
93、习题8-6 删除字符
本题要求实现一个删除字符串中的指定字符的简单函数。
函数接口定义:
void delchar( char *str, char c );
其中char *str是传入的字符串,c是待删除的字符。函数delchar的功能是将字符串str中出现的所有c字符删除。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 20
void delchar( char *str, char c );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */
int main()
{
char str[MAXN], c;
scanf("%c\n", &c);
ReadString(str);
delchar(str, c);
printf("%s\n", str);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
a
happy new year
输出样例:
hppy new yer
代码:
void delchar( char *str, char c )
{
int len=strlen(str);
char *strTemp=(char*)malloc(sizeof(char)*len);
int i=0;
int t=0;
while(str[i]!='\0')
{
if(str[i]!=c) strTemp[t++]=str[i];
i++;
}
strTemp[t]='\0';
for(i=0;i<=t;i++)
str[i]=strTemp[i];
}
94、习题8-8 判断回文字符串
本题要求编写函数,判断给定的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。如“XYZYX”和“xyzzyx”都是回文。
函数接口定义:
bool palindrome( char *s );
函数palindrome判断输入字符串char *s是否为回文。若是则返回 true ,否则返回 false 。
裁判测试程序样例:
#include <stdio.h>
#include <string.h>
#define MAXN 20
typedef enum {false, true} bool;
bool palindrome( char *s );
int main()
{
char s[MAXN];
scanf("%s", s);
if ( palindrome(s)==true )
printf("Yes\n");
else
printf("No\n");
printf("%s\n", s);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
thisistrueurtsisiht
输出样例1:
Yes
thisistrueurtsisiht
输入样例2:
thisisnottrue
输出样例2:
No
thisisnottrue
代码:
bool palindrome( char *s )
{
int len=strlen(s);
int i;
int l=1;
for(i=0;i<len/2;i++)
{
if(s[i]!=s[len-1-i])
{
l=0;
break;
}
}
if(l==1) return true;
else return false;
}
95、习题10-3 递归实现指数函数
本题要求实现一个计算(n≥1)的函数。
函数接口定义:
double calc_pow( double x, int n );
函数 calc_pow 应返回 x 的 n 次幂的值。建议用递归实现。题目保证结果在双精度范围内。
裁判测试程序样例:
#include <stdio.h>
double calc_pow( double x, int n );
int main()
{
double x;
int n;
scanf("%lf %d", &x, &n);
printf("%.0f\n", calc_pow(x, n));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
2 3
输出样例:
8
代码:
double calc_pow( double x, int n )
{
if(n==1) return x;
else return x*calc_pow(x,n-1);
}
96、习题10-4 递归求简单交错幂级数的部分和
本题要求实现一个函数,计算下列简单交错幂级数的部分和:
f(x,n)=x−−−
函数接口定义:
double fn( double x, int n );
其中题目保证传入的n是正整数,并且输入输出都在双精度范围内。函数fn应返回上述级数的部分和。建议尝试用递归实现。
裁判测试程序样例:
#include <stdio.h>
double fn( double x, int n );
int main()
{
double x;
int n;
scanf("%lf %d", &x, &n);
printf("%.2f\n", fn(x,n));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
0.5 12
输出样例:
0.33
代码:
double fn( double x, int n )
{
if(n==1) return x;
else return pow(-1,n-1)*pow(x,n)+fn(x,n-1);
}
97、习题10-5 递归计算Ackermenn函数
本题要求实现Ackermenn函数的计算,其函数定义如下:
函数接口定义:
int Ack( int m, int n );
其中 m 和 n 是用户传入的非负整数。函数 Ack 返回Ackermenn函数的相应值。题目保证输入输出都在长整型范围内。
裁判测试程序样例:
#include <stdio.h>
int Ack( int m, int n );
int main()
{
int m, n;
scanf("%d %d", &m, &n);
printf("%d\n", Ack(m, n));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
2 3
输出样例:
9
代码:
int Ack( int m, int n )
{
if(m==0) return n+1;
else
{
if(n==0&&m>0) return Ack(m-1,1);
if(n>0&&m>0) return Ack(m-1,Ack(m,n-1));
}
}
98、习题10-6 递归求Fabonacci数列
本题要求实现求Fabonacci数列项的函数。Fabonacci数列的定义如下:
f(n)=f(n−2)+f(n−1) (n≥2),其中f(0)=0,f(1)=1。
函数接口定义:
int f( int n );
函数 f 应返回第 n 个Fabonacci数。题目保证输入输出在长整型范围内。建议用递归实现。
裁判测试程序样例:
#include <stdio.h>
int f( int n );
int main()
{
int n;
scanf("%d", &n);
printf("%d\n", f(n));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
6
输出样例:
8
代码:
int f( int n )
{
if(n==0||n==1) return n;
//else if(n==1) return 1;
else
{
return f(n-2)+f(n-1);
}
}
99、习题10-7 十进制转换二进制
本题要求实现一个函数,将正整数n转换为二进制后输出。
函数接口定义:
void dectobin( int n );
函数 dectobin 应在一行中打印出二进制的 n 。建议用递归实现。
裁判测试程序样例:
#include <stdio.h>
void dectobin( int n );
int main()
{
int n;
scanf("%d", &n);
dectobin(n);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
10
输出样例:
1010
代码:
void dectobin( int n )
{
if(n<2) printf("%d",n%2);
else
{
dectobin(n/2);
printf("%d",n%2);
}
}
100、习题10-8 递归实现顺序输出整数
本题要求实现一个函数,对一个整数进行按位顺序输出。
函数接口定义:
void printdigits( int n );
函数 printdigits 应将 n 的每一位数字从高位到低位顺序打印出来,每位数字占一行。
裁判测试程序样例:
#include <stdio.h>
void printdigits( int n );
int main()
{
int n;
scanf("%d", &n);
printdigits(n);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
12345
输出样例:
1
2
3
4
5
代码:
void printdigits( int n )
{
if(n<=10) printf("%d\n",n%10);
else
{ printdigits(n/10);
printf("%d\n",n%10);
}
}