上海海事大学C语言程序设计上机实验代码参考【第十一周实验】

本文主要是介绍上海海事大学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=1​3​​+5​3​​+3​3​​。
函数接口定义:
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语言的基础,例如:数据类型、条件语句(ifswitch)、循环语句(whilefordo-while以及goto等)、数组(一维数组与多维数组)。而其他篇章考题比例极少,一般每章最少会有一道题,大家要自行把握,不要做无意义的复习。

期末考试的体型包括填空、选择、判断、程序改错(2题)、程序补写(2题)和程序写作题(1题)。

2、对于非本校的同学

本课程的题目主要是基础知识内容,对于进阶指针、结构体和文件的知识较少,并且指针和结构体是较难的内容,所以希望大家可以自己专门去学习这些内容,一般学校也不会着重考察这部分内容,本人后续也会更新C语言的入门教程,敬请期待。


本文上方资源绑定的文件夹内包括本周的作业参考以及题目的word文件

如果是手机用户或者无法看到此绑定文件,可以进入我的主页自行寻找

总结

C语言的学习是循序渐进的,只有不断积累才能提高,而只学习概念不去动手实践是无法学好C语言的,学好一门程序语言最重要的便是多动手实践,不断地实现新的功能,其所带来的正反馈会让大家逐渐爱上编程,喜欢编程。在学习并完成本课程后,大家基本也就入门了C语言,未来可期,也请大家继续努力。

感谢大家的观看,如果对本系列文章感兴趣的朋友也请多多点赞分享,收藏关注不迷路,如有疑问可以在文章下方评论或者直接私聊我,我会在第一时间回复大家,如果出现题目或程序出错,我会第一时间更改,大家的支持也是我第一动力,谢谢大家。

这篇关于上海海事大学C语言程序设计上机实验代码参考【第十一周实验】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/760195

相关文章

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引