- 如果代码存在问题,麻烦大家指正 ~ ~
- 有帮助麻烦点个赞 ~ ~
编程练习5 - 函数与指针
- 6-1 求实数和的函数(分数 10)
- 6-2 求解一元二次方程实根的函数(分数 10)
- 6-3 求集合数据的均方差(分数 10)
- 6-4 计算Fibonacci数列每一项时所需的递归调用次数(分数 10)
- 6-5 字符串加密(分数 10)
- 6-6 万年历显示函数(分数 15)
6-1 求实数和的函数(分数 10)
作者 吕淑琴
单位 武汉理工大学
本题要求实现一个函数,求给定的N个实数的和。
函数接口定义:
float sum (float data[], int N );
其中给定实数存放在数组 data[]中,正整数N是数组元素个数。该函数须返回N个 data[]元素的和。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
float sum ( float data[], int N );
int main ()
{
int n, i;
float data[MAXN];
scanf("%d", &n);
for ( i=0; i<n; i++ )
scanf("%f", &data[i]);
printf("%.2f\n", sum( data, n));
return 0;
}
/* 请在这里填写答案 */
输入样例:
3
12.3 45.6 -67.8
输出样例:
在这里给出相应的输出。例如:
-9.90
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
参考代码
float sum(float data[], int N)
{
float sum = 0;
for (int i = 0; i < N; i++)
sum += data[i];
return sum;
}
6-2 求解一元二次方程实根的函数(分数 10)
作者 李民
单位 武汉理工大学
要求计算一元二次方程ax2+bx+c=0(a≠0)的根。
主函数中给出3个浮点系数a、b、c,调用函数rootOfEquation()求解方程的实根。方程的根通过指针类型的参数x1、x2传回主函数,其中x1是值较大的根,x2是值较小的根。
- 若方程有两个相等的实根,函数返回1;
- 若方程有两个不等的实根,函数返回2;
- 若方程无实根,函数返回0。
函数接口定义:
int rootOfEquation(double a, double b, double c, double *x1, double *x2);
裁判测试程序样例:
#include<stdio.h>
#include<math.h>
int rootOfEquation(double a, double b, double c, double *x1, double *x2);
int main()
{ double a,b,c;
double x1,x2;
scanf("%lf %lf %lf",&a,&b,&c);
int flag;
flag=rootOfEquation(a,b,c,&x1,&x2);
if(flag==0)
printf("方程无实根");
else if(flag==1)
printf("方程有两个相等的实根 x1=x2=%.2f", x1);
else
printf("方程有两个不等的实根 x1=%.2f,x2=%.2f", x1, x2);
return 0;
}
/* 请在这里填写答案 */
输入样例:
1 3 2
输出样例:
方程有两个不等的实根 x1=-1.00,x2=-2.00
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
参考代码
int rootOfEquation(double a, double b, double c, double *x1, double *x2)
{
double z=b*b-4*a*c;
if(z<0) return 0;
else if(z==0){
*x1 = -b/(2*a);
return 1;
}
else if(z>0) {
*x1=(-b+sqrt(z))/(2*a);;
*x2=(-b-sqrt(z))/(2*a);
return 2;
}
}
6-3 求集合数据的均方差(分数 10)
作者 孙骏
单位 武汉理工大学
本题希望输入 n (0<n<=100)个整数,求n个整数的均方差。若将 n个数的平均值记为 Avg,则均方差计算公式为:
函数接口定义:
double Avg ( int N, int data[] );
double StdDev( int N, int data[] );
函数Avg计算并返回数组的平均值;函数StdDev计算并返回n个数据的均方差。
其中 N 和 data 都是用户传入的参数。 N 是要计算的数据个数; data 是传入的数组。
裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如:
#include <stdio.h>
double Avg ( int N, int data[] );
double StdDev( int N, int data[] );
int main()
{
int N ,i, data[100];
scanf("%d", &N);
for(i=0;i<N;i++)
scanf("%d",&data[i]);
printf("Average = %.4f\n", Avg(N, data));
printf("Standard Deviation = %.4f",StdDev(N,data));
return 0;
}
/* 请在这里填写答案 */
输入样例:
10
6 3 7 1 4 8 2 9 11 5
输出样例:
Average = 5.6000
Standard Deviation = 3.0397
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
参考代码
double Avg ( int N, int data[])
{
double sum=0;
for(int i=0; i<N; i++)
sum += data[i];
return sum/N;
}
double StdDev( int N, int data[])
{
double sum=0.0, avg=Avg(N, data);
for(int i=0; i<N; i++)
sum += (data[i]-avg)*(data[i]-avg);
return sqrt(sum/N);
}
6-4 计算Fibonacci数列每一项时所需的递归调用次数(分数 10)
作者 李宁x
单位 武汉理工大学
计算并打印Fibonacci数列每一项时所需的递归调用次数,数列第一项从1开始。
要求:
1)定义表示调用次数的全局变量count;
2)定义用递归方法求Fibonacci数列的Fib()函数。
函数接口定义:
long Fib(int a);
a为大于0的正整数。
裁判测试程序样例:
#include <stdio.h>
long Fib(int a);
/* 你的代码将被嵌在这里 */
int main()
{
int n, i, x;
printf("Input n:");
scanf("%d", &n);
for (i=1; i<=n; i++)
{
count = 0; //计算下一项Fibonacci数列时将计数器count清零
x = Fib(i);
printf("Fib(%d)=%d, count=%d\n", i, x, count);
}
return 0;
}
输入样例:
3
输出样例:
Fib(1)=1, count=1
Fib(2)=1, count=1
Fib(3)=2, count=3
代码长度限制
20 KB
时间限制
1000 ms
内存限制
100 MB
参考代码
int count=0;
long Fib(int a)
{
count++;
if(a<3)
return 1;
else
return Fib(a-1)+Fib(a-2);
}
6-5 字符串加密(分数 10)
作者 吕淑琴
单位 武汉理工大学
本题要求实现一个函数,能对一行字符串(字符串的长度<80)加密。
加密函数采用的加密算法:如果不是英文字母,就不加密,原样显示;否则就将字母加上一个偏移值5实现加密。注意大小写英文字母分别构成一个封闭环,如字符‘w’,加密后为字符‘b’。
函数接口定义:
void cryptograp(char ch[],int n);
其中给定一行英文字符串存放在数组ch[]中,n是这行字符串的实际长度。
裁判测试程序样例:
#include<stdio.h>
#include<string.h>
void cryptograp(char ch[],int n); //加密函数
int main()
{
int count = 0;
char text[80] = {'\0'}; //存放明文字符串
gets(text);
count = strlen(text);
cryptograp(text,count);
printf("加密后的密文是:\n%s\n", text);
return 0;
}
/* 请在这里填写答案 */
输入样例:
Hello World!
输出样例:
加密后的密文是:
Mjqqt Btwqi!
代码长度限制
99 KB
时间限制
400 ms
内存限制
64 MB
参考代码
void cryptograp(char ch[],int n)
{
for(int i=0; i<n; i++) {
if(ch[i]>='a' && ch[i]<='u')
ch[i] += 5;
else if(ch[i] >='v' && ch[i]<='z')
ch[i] -= 21;
if(ch[i]>='A' && ch[i]<='U')
ch[i] += 5;
else if(ch[i]>='V' && ch[i]<='Z')
ch[i] -= 21;
}
}
6-6 万年历显示函数(分数 15)
作者 吕淑琴
单位 武汉理工大学
设计一个万年历,当用户输入年份和月份时,显示这个月的日历表。程序重点是这个月的第一天是星期几和这个月有几天,有了这两个值,只需通过排列,就可以显示这个日历。程序要求用户输入的年份是从1900年开始,已知1900年1月1日是星期一。
日历中每个具体的日期占5个字符宽度,右对齐,上下的分隔线分别是由35个’*’ 连字符构成,表示星期的字符是三个字符,加两个空格分隔。
函数接口定义:
void ShowDate(int y, int m);
其中,参数y是给定年,参数m是给定月,函数功能是根据给定的年月,显示该月日历。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
int IsLeapYear(int y); /*判断是否闰年,细节不表*/
int GetDaysofMonth(int y, int m); /*确定某个月的天数,细节不表*/
int GetTotalDays(int y, int m); /*计算从1900年1月开始到给定年月间的天数,不包含给定月的天数,细节不表*/
int GetFirstDayInTable(int y, int m); /*计算给定年月的第一天在日历表中的位置,返回值为0对应Sun位置,返回值为6对应Sta位置,细节不表*/
void ShowDate(int y, int m); /*显示日历*/
int main()
{
int y,m;
scanf("%d%d",&y,&m);
ShowDate(y,m);
return 0;
}
/* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如:
1949 10
输出样例:
***********************************
Sun Mon Tue Wen Thur Fri Sta
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
***********************************
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
参考代码
void ShowDate(int y, int m)
{
int i, flag=0, index=0;
int n = GetFirstDayInTable(y,m);
int x = GetDaysofMonth(y,m);
printf("***********************************\n");
printf(" Sun Mon Tue Wen Thur Fri Sta\n");
for(i=0; i<5*n; i++)
printf(" ");
for(i=1; i<=x; i++) {
if(n+i==8 && flag==0) {
flag=1;
index=0;
printf("\n");
}
printf("%5d", i);
if(flag && ++index%7==0)
printf("\n");
}
printf("\n***********************************");
}