本文主要是介绍上海海事大学C语言程序设计上机实验代码参考【第十一周实验】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
C语言学习系列课程之练习专项(第十一周)
本周主要考察函数的使用,其中只需要补全对应功能的函数体,无需对主函数和函数名进行修改
文章目录
- C语言学习系列课程之练习专项(第十一周)
- 一、本系列教程的使用方法
- 二、习题部分
- 1、判断满足条件的三位数 (15分)
- 2、递归求阶乘和 (15分)
- 3、递归实现指数函数 (15分)
- 4、递归求Fabonacci数列 (10分)
- 5、递归计算P函数 (15分)
- 6、数字金字塔 (15分)
- 7、使用函数输出水仙花数 (20分)
- 8、用函数输出指定范围内的Fibonacci数 (20分)
- 9、使用函数求特殊a串数列和 (20分)
- 10、函数验证哥德巴赫猜想 (20分)
- 三、经验分享
- 1、对于本校生
- 2、对于非本校的同学
- 总结
注意:建议大家先自己做一遍,如果实在解决不了在对照答案找问题
一、本系列教程的使用方法
对于上海海事大学的同学,C语言程序设计课程中的实验课程环节的作业基本与本课程的题目相同或类似,可以先自行查找题目,本校使用的编译软件为 Visual C++ 6.0 ,建议有条件的同学使用较新的编译软件,大家可以自行选择比较顺手的编译软件。
对于刚入门的同学,我推荐使用 VS 2022 ,并附上入门教程:教程链接
对于非本校的同学,可以通过本教程自行练习,在吃透本课程后,我相信期末考试取得高分也不是很大的问题,如果只是自学,也可以参考我校的学习进度,自行调整学习计划。
VC 6.0 是1998年所诞生的软件,目前早已停止更新,并且只支持32位的电脑,现如今大家所使用的电脑一般都是64位,大部分人会无法正常使用,并且报错也不智能,所以对于初学者没必要浪费太多的时间在不必要的麻烦上
二、习题部分
1、判断满足条件的三位数 (15分)
本题要求实现一个函数,统计给定区间内的三位数中有两位数字相同的完全平方数(如144、676)的个数。
函数接口定义:
intsearch( int n );
其中传入的参数int n是一个三位数的正整数(最高位数字非0)。函数search返回[101, n]区间内所有满足条件的数的个数。
裁判测试程序样例:
#include <stdio.h>
#include <math.h>
intsearch( int n );
intmain(){
int number;
scanf(“%d”,&number);
printf(“count=%d\n”,search(number));
return0;
}
/* 你的代码将被嵌在这里 */
输入样例:
500
输出样例:
count=6
代码展示:
#include <stdio.h>
#include <math.h>
int search(int n);
int main()
{int number;scanf("%d",&number);printf("count=%d\n",search(number));return 0;
}int search(int n)
{int n1,n2;int x=0;int k1,k2,k3;for(n;n >=101;--n){k1=n%10;k2=(n/10)%10;k3=n/100;if(k1 == k2 || k2 == k3 || k1 == k3){n1=(int)sqrt(n);n2=n1*n1;if(n2 == n){x++;continue;}else{}}else if(k1==k2==k3){}else{}}return x;
}
2、递归求阶乘和 (15分)
递归一般指函数中嵌套函数,可理解为一个小的循环,只不过是函数中在调用一次自己,但是递归只适合在特定的环境下使用,这是因为递归的代码效率不高,所以我们需要避免使用递归
本题要求实现一个简单的递归函数,计算非负整数阶乘,并利用该函数求 1!+2!+3!+…+n! 的值。
函数接口定义:
doublefact( int n );
doublefactsum( int n );
函数fact应返回n的阶乘。函数factsum应返回 1!+2!+…+n! 的值。题目保证输入输出在双精度范围内。
裁判测试程序样例:
#include <stdio.h>
doublefact( int n );
doublefactsum( int n );
intmain(){
int n;
scanf(“%d”,&n);
printf(“fact(%d) = %.0f\n”, n, fact(n));
printf(“sum = %.0f\n”, factsum(n));
return0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
10
输出样例1:
fact(10) = 3628800
sum = 4037913
输入样例2:
0
输出样例2:
fact(0) = 1
sum = 0
代码展示:
#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;
}double fact(int n)//定义函数fact()用于计算阶乘
{int i,x;if(n <= 10 && n > 0){x=n*fact(n-1);}else if(n == 0)x=1;return x;
}double factsum(int n)
{int i;double sum;sum=0;for(i = 1;i <= n;i++)sum=sum+fact(i);return sum;
}
3、递归实现指数函数 (15分)
本题要求实现一个计算x的n次方(n≥1)的递归函数。
函数接口定义:
doublecalc_pow( double x, int n );
函数calc_pow应返回x的n次幂的值。题目保证结果在双精度范围内。
裁判测试程序样例:
#include <stdio.h>
doublecalc_pow( double x, int n );
intmain(){
double x;
int n;
scanf(“%lf %d”, &x, &n);
printf(“%.0f\n”, calc_pow(x, n));
return0;
}
/* 你的代码将被嵌在这里 */
输入样例:
34
输出样例:
81
代码展示:
#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;
}double calc_pow(double x,int n)
{int i;double k=1;for(i=1;i <= n;i++){if(i == 1)k=x;else{k=x*calc_pow(x,n-1);}}return k;
}
4、递归求Fabonacci数列 (10分)
本题要求递归实现求Fabonacci数列项的函数。Fabonacci数列的定义如下:
f(n)=f(n−2)+f(n−1) (n≥2),其中f(0)=0,f(1)=1。
函数接口定义:
intf( int n );
函数f应返回第n个Fabonacci数。题目保证输入输出在长整型范围内。建议用递归实现。
裁判测试程序样例:
#include <stdio.h>
intf( int n );
intmain(){
int n;
scanf(“%d”, &n);
printf(“%d\n”, f(n));
return0;
}
/* 你的代码将被嵌在这里 */
输入样例:
6
输出样例:
8
代码展示:
#include <stdio.h>int f(int n);int main(){int n;scanf("%d", &n);printf("%d\n", f(n));return 0;
}
/* 你的代码将被嵌在这里 */
int f(int n)
{if (n < 2)return n;elsereturn f(n - 2) + f(n - 1);
}
5、递归计算P函数 (15分)
本题要求递归实现下列函数P( n , x )的计算,其函数定义如上:
函数接口定义:
doubleP( int n, double x );
其中n是用户传入的非负整数,x是双精度浮点数。函数P返回P(n,x)函数的相应值。题目保证输入输出都在双精度范围内。
裁判测试程序样例:
#include <stdio.h>
doubleP( int n, double x );
intmain(){
int n;
double x;
scanf(“%d %lf”, &n, &x);
printf(“%.2f\n”, P(n,x));
return0;
}
/* 你的代码将被嵌在这里 */
输入样例:
10 1.7
输出样例:
3.05
代码展示:
#include <stdio.h>
double P(int n,double x);
int main()
{int n;double x;scanf("%d %lf",&n,&x);printf("%.2f\n",P(n,x));return 0;
}
double P(int n,double x)
{double k;switch(n){case 0:k=1;break;case 1:k=x;break;default:k=((2*n-1)*P(n-1,x)-(n-1)*P(n-2,x))/n;break;}return k;
}
6、数字金字塔 (15分)
本题要求实现函数输出n行数字金字塔。
函数接口定义:
voidpyramid( int n );
其中n是用户传入的参数,为[1, 9]的正整数。要求函数按照如样例所示的格式打印出n行数字金字塔。注
意每个数字后面跟一个空格。
裁判测试程序样例:
#include <stdio.h>
voidpyramid( int n );
intmain(){
int n;
scanf(“%d”, &n);
pyramid(n);
return0;
}
/* 你的代码将被嵌在这里 */
输入样例:
5
输出样例:
1 2 2 3 3 3 4 4 4 4
5 5 5 5 5
代码展示:
#include <stdio.h>
void pyramid(int n);
int main()
{int n;scanf("%d",&n);pyramid(n);return 0;
}
void pyramid(int n)
{int k,x,i;for(i=1;i <= n;i++)//控制第几行{for(k=1;k <= n-i+1;k++)//控制数字位置printf(" ");for(x=1;x <= i;x++)//控制每一行的输出printf("%d ",i);printf("\n");}
}
7、使用函数输出水仙花数 (20分)
本题要求编写两个函数,一个判断给定整数是否水仙花数,另一个按从小到大的顺序打印出给定区间(m,n)内所有的水仙花数。水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。
函数接口定义:
intnarcissistic( int number );
voidPrintN( int m, int n );
函数narcissistic判断number是否为水仙花数,是则返回1,否则返回0。
函数PrintN则打印开区间(m, n)内所有的水仙花数,每个数字占一行。题目保证100<m≤n<1000。
裁判测试程序样例:
#include <stdio.h>
intnarcissistic( int number );
voidPrintN( int m, int n );
intmain(){
int m, n;
scanf(“%d %d”, &m, &n);
if ( narcissistic(m) ) printf(“%d is a narcissistic number\n”, m);
PrintN(m, n);
if ( narcissistic(n) ) printf(“%d is a narcissistic number\n”, n);
return0;
}
/* 你的代码将被嵌在这里 */
输入样例:
153 400
输出样例:
153 is a narcissistic number
370
371
代码展示:
#include <stdio.h>
int narcissistic(int number);
void PrintN(int m,int n);
int main()
{int m,n;scanf("%d %d",&m,&n);if(narcissistic(m))printf("%d is a narcissistic number\n",m);PrintN(m,n);if(narcissistic(n))printf("%d is a narcissistic number\n",n);return 0;
}
int narcissistic(int number)
{int n1,n2,n3,x,k;n1=number%10;n2=number/10%10;n3=number/100;k=n1*n1*n1+n2*n2*n2+n3*n3*n3;if(k == number)x=1;elsex=0;return x;
}
void PrintN(int m,int n)
{int x;for(m++;m <= n;m++){x=narcissistic(m);if(x == 1)printf("%d\n",m);}
}
8、用函数输出指定范围内的Fibonacci数 (20分)
本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m≤n≤10000)之间的所有Fibonacci数。所谓Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列。
函数接口定义:
intfib( int n );
voidPrintFN( int m, int n );
其中函数fib须返回第n项Fibonacci数;函数PrintFN要在一行中输出给定范围[m, n]内的所有Fibonacci数,相邻数字间有一个空格,行末不得有多余空格。如果给定区间内没有Fibonacci数,则输出一行“No Fibonacci number”。
裁判测试程序样例:
#include <stdio.h>
intfib( int n );
voidPrintFN( int m, int n );
intmain(){
int m, n, t;
scanf(“%d %d %d”, &m, &n, &t);
printf(“fib(%d) = %d\n”, t, fib(t));
PrintFN(m, n);
return0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
20 100 7
输出样例1:
fib(7) = 13
21 34 55 89
输入样例2:
2000 25008
输出样例2:
fib(8) = 21
No Fibonacci number
代码展示:
#include <stdio.h>
int fib(int n);
void PrintFN(int m,int n);int main()
{int m,n,t;scanf("%d %d %d",&m,&n,&t);printf("fib(%d) = %d\n",t,fib(t));PrintFN(m,n);return 0;
}int fib(int n)
{if(n == 1 || n == 2)return 1;elsereturn fib(n-2)+fib(n-1);
}void PrintFN(int m,int n)
{int i=1,x;for(;x != m;i++){x=fib(i);if(x >= m)break;elsecontinue;}for(;fib(i) <= n;i++){printf("%d ",fib(i));}printf("\n");
}
9、使用函数求特殊a串数列和 (20分)
给定两个均不超过9的正整数a和n,要求编写函数求a+aa+aaa++⋯+aa⋯a(n个a)之和。
函数接口定义:
intfn( int a, int n );
intSumA( int a, int n );
其中函数fn须返回的是n个a组成的数字;SumA返回要求的和。
裁判测试程序样例:
#include <stdio.h>
intfn( int a, int n );
intSumA( int a, int n );
intmain(){
int a, n;
scanf(“%d %d”, &a, &n);
printf(“fn(%d, %d) = %d\n”, a, n, fn(a,n));
printf(“s = %d\n”, SumA(a,n));
return0;
}
/* 你的代码将被嵌在这里 */
输入样例:
2 3
输出样例:
fn(2, 3) = 222
s = 246
代码展示:
#include <stdio.h>
#include <math.h>int fn(int a, int n);
int SumA(int a, int n);int main()
{int a, n;scanf("%d %d", &a, &n);printf("fn(%d, %d) = %d\n", a, n, fn(a, n));printf("s = %d\n", SumA(a, n));return 0;
}/* 你的代码将被嵌在这里 */int fn(int a, int n)
{int sum = 0,i;for (i = 0; i < n; i++){sum += a * pow(10, i);}return sum;
}int SumA(int a, int n)
{int sum = 0,i;for (i = 1; i <= n; i++){sum += fn(a, i);}return sum;
}
10、函数验证哥德巴赫猜想 (20分)
本题要求实现一个判断素数的简单函数,并利用该函数验证哥德巴赫猜想:任何一个不小于6的偶数均可表示为两个奇素数之和。素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。
函数接口定义:
intprime( int p );voidGoldbach( int n );
其中函数prime当用户传入参数p为素数时返回1,否则返回0;函数Goldbach按照格式“n=p+q”输出n的素数分解,其中p≤q均为素数。又因为这样的分解不唯一(例如24可以分解为5+19,还可以分解为7+17),要求必须输出所有解中p最小的解。
裁判测试程序样例:
#include <stdio.h>
#include <math.h>
intprime( int p );voidGoldbach( int n );
intmain(){
int m, n, i, cnt;
scanf(“%d %d”, &m, &n);
if ( prime(m) != 0 ) printf(“%d is a prime number\n”, m);
if ( m <6 ) m = 6;
if ( m%2 ) m++;
cnt = 0;
for( i=m; i<=n; i+=2 ) {
Goldbach(i);
cnt++;
if ( cnt%5 ) printf(“, “);
elseprintf(”\n”);
}
return0;
}
/* 你的代码将被嵌在这里 */
输入样例:
89 100
输出样例:
89 is a prime number
90=7+83 , 92=3+89 , 94=5+89 , 96=7+89 , 98=19+79 , 100=3+97
代码展示:
#include <stdio.h>
#include <math.h>int prime(int p);
void Goldbach(int n);int main()
{int m, n, i, cnt;scanf("%d %d", &m, &n);if (prime(m) != 0)printf("%d is a prime number\n", m);if (m < 6)m = 6;if (m % 2)m++;cnt = 0;for (i = m; i <= n; i += 2){Goldbach(i);cnt++;if (cnt % 5)printf(", ");elseprintf("\n");}printf("\n");return 0;
}int prime(int num)
{int i;for (i = 2; i < num; i++){if (num % i == 0)return 0;}return 1;
}void Goldbach(int n)
{int i;for (i = 2; i < n / 2; i++){if(prime(i)){if(prime(n - i)){printf("%d = %d + %d", n, i, n - i);break;}}}
}
三、经验分享
1、对于本校生
本课程为64学时的课程,其中包括32学时的课堂教学和32学时的实验课程,并且本教程为2023年后半学期的经验分享(即最新课程),课堂教学环节为学习,老师一般会教新课和复习,实验课程则为实践,老师会布置练习题,题目一般与本课程题目相同或类似,但还是建议大家自行完成练习题,在参考我的代码找错。
一般一周会有两节课,第一节是课堂教学,第二节为实验课程,共有16周,课后练习一般只持续至14周,最后两周的实验课程会设置成自行练习。前14周的实验课程包括:自行完成作业、测试题以及期中考试,一般内容与期末考试有关,大家可以自己归纳,我也会在最后发布上海海事大学C语言题库(基本为原题),期末考试为机考,所以大家一定要提前熟悉环境。
老师一般会将本周的其中两道题作为课后作业,其要求为:完成题目并且在作业后写100字左右的学习心得,题目只需将自己的程序抄在本子上即可,对于小结,大家可以写学习的体会(例如:在本周遇到什么错误等等),也可以是学习总结(例如:当作每周的学习归纳写)。
我会在每周附上我自己的作业照片,以供大家参考
期末考试内容主要是C语言的基础,例如:数据类型、条件语句(if 与 switch)、循环语句(while、for、do-while以及goto等)、数组(一维数组与多维数组)。而其他篇章考题比例极少,一般每章最少会有一道题,大家要自行把握,不要做无意义的复习。
期末考试的体型包括填空、选择、判断、程序改错(2题)、程序补写(2题)和程序写作题(1题)。
2、对于非本校的同学
本课程的题目主要是基础知识内容,对于进阶指针、结构体和文件的知识较少,并且指针和结构体是较难的内容,所以希望大家可以自己专门去学习这些内容,一般学校也不会着重考察这部分内容,本人后续也会更新C语言的入门教程,敬请期待。
本文上方资源绑定的文件夹内包括本周的作业参考以及题目的word文件
如果是手机用户或者无法看到此绑定文件,可以进入我的主页自行寻找
总结
C语言的学习是循序渐进的,只有不断积累才能提高,而只学习概念不去动手实践是无法学好C语言的,学好一门程序语言最重要的便是多动手实践,不断地实现新的功能,其所带来的正反馈会让大家逐渐爱上编程,喜欢编程。在学习并完成本课程后,大家基本也就入门了C语言,未来可期,也请大家继续努力。
感谢大家的观看,如果对本系列文章感兴趣的朋友也请多多点赞分享,收藏关注不迷路,如有疑问可以在文章下方评论或者直接私聊我,我会在第一时间回复大家,如果出现题目或程序出错,我会第一时间更改,大家的支持也是我第一动力,谢谢大家。
这篇关于上海海事大学C语言程序设计上机实验代码参考【第十一周实验】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!