本文主要是介绍上海海事大学C语言程序设计上机实验代码参考【第十二周实验】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
C语言学习系列课程之练习专项(第十二周)
本周主要考察数组的使用,这是一个非常重要的概念
文章目录
- C语言学习系列课程之练习专项(第十二周)
- 一、本系列教程的使用方法
- 二、习题部分
- 1、求10个数平均值(10分)
- 2、求超过平均值的个数(15分)
- 3、求最大值及其下标 (15分)
- 4、交换最小值和最大值 (15分)
- 5、输出学生成绩 (15分)
- 6、数组中的数逆序存放 (10分)
- 7、查找整数 (10分)
- 8、输出数组元素 (15分)
- 9、数字加密 (20分)
- 10、查验身份证 (25分)
- 三、经验分享
- 1、对于本校生
- 2、对于非本校的同学
- 总结
注意:建议大家先自己做一遍,如果实在解决不了在对照答案找问题
一、本系列教程的使用方法
对于上海海事大学的同学,C语言程序设计课程中的实验课程环节的作业基本与本课程的题目相同或类似,可以先自行查找题目,本校使用的编译软件为 Visual C++ 6.0 ,建议有条件的同学使用较新的编译软件,大家可以自行选择比较顺手的编译软件。
对于刚入门的同学,我推荐使用 VS 2022 ,并附上入门教程:教程链接
对于非本校的同学,可以通过本教程自行练习,在吃透本课程后,我相信期末考试取得高分也不是很大的问题,如果只是自学,也可以参考我校的学习进度,自行调整学习计划。
VC 6.0 是1998年所诞生的软件,目前早已停止更新,并且只支持32位的电脑,现如今大家所使用的电脑一般都是64位,大部分人会无法正常使用,并且报错也不智能,所以对于初学者没必要浪费太多的时间在不必要的麻烦上
二、习题部分
1、求10个数平均值(10分)
本题要求编写程序, 求给定的10个数中的平均值(下标从0开始)。
输入格式:
在一行输入10个整数,用空格分开。
输出格式:
在一行中输出平均值,保留2位小数。
输入样例:
7 2 8 5 10 1 9 3 6 4
输出样例:
5.50
代码展示:
注意数组变量的数据类型,以及在定义变量的时候数组的下标不能使用其他变量
#include <stdio.h>
int main()
{int integer[10];int i=0,x=0;for(;i <= 9;i++){scanf("%d",&integer[i]);x+=integer[i];}printf("%.2f\n",x/10.0);return 0;
}
2、求超过平均值的个数(15分)
本题要求编写程序,求给定的n个数中超过(含相等)平均值的个数(下标从0开始)。
输入格式:
输入在第一行中给出一个正整数n(1<n≤10)。第二行输入n个整数,用空格分开。
输出格式:
在一行中输出平均值,保留2位小数,超过平均值的数的个数,用一个空格分开
输入样例:
5
2 4 1 6 7
输出样例:
4.00 3
代码展示:
但在代码块中( { } )数组的下标是可以正常使用变量的
#include <stdio.h>
int main()
{int integer[10];int i=0,x=0,k=0,i1;scanf("%d",&i1);for(;i < i1;i++){scanf("%d",&integer[i]);x+=integer[i];}printf("%.2f ",(float)x/i1);for(i=1;i <= 10;i++){if(integer[i] <= x/i1)continue;else if(integer[i] > x/i1)k++;}printf("%d\n",k);return 0;
}
3、求最大值及其下标 (15分)
本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。
输入格式:
输入在第一行中给出一个正整数n(1<n≤10)。第二行输入n个整数,用空格分开。
输出格式:
在一行中输出最大值及最大值的最小下标,中间用一个空格分开。(以第一次出现为准)
输入样例:
6
2 8 10 1 9 10
输出样例:
10 2
代码展示:
注意预处理指令不是C语句
函数的定义可以放在前面,也可以放在后面,区别是如果在main函数(一般C语言的程序的入口是main函数)之后定义,那么前面就必须在定义一次,并且添加分号
#include <stdio.h>
#define NUM_MAX 16void ArrInput(int *arr, int num);int main()
{int arrNum[NUM_MAX], num,i;int maxVal = 0, maxNum;float ave;scanf("%d", &num);ArrInput(arrNum, num);for(i = 0; i < num; i++){if(arrNum[i] > maxVal){maxVal = arrNum[i];maxNum = i;}}printf("%d %d", maxVal, maxNum);printf("\n");return 0;
}void ArrInput(int *arr, int num)
{int i;for (i = 0; i < num; i++)scanf("%d", &arr[i]);
}
4、交换最小值和最大值 (15分)
本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。
题目保证最大和最小值都是唯一的。
输入格式:
输入在第一行中给出一个正整数n(1<n≤10),第二行给出n个整数,数字间以空格分隔。
输出格式:
在一行中顺序输出交换后的序列,每个整数后跟一个空格。
输入样例:
5
8 2 5 1 4
输出样例:
1 2 5 4 8
代码展示:
#include <stdio.h>
int main()
{int i;int x, integer[10];int max, min;int exmax, exmin;int m=0, n=0;scanf("%d", &x);scanf("%d", &integer[0]);max = integer[0];min = max;for (i = 1; i < x; i++){scanf("%d", &integer[i]);if (integer[i] > max){max = integer[i];m = i;}if (integer[i] < min){min = integer[i];n = i;}}exmax = integer[i - 1];integer[i - 1] = integer[m];integer[m] = exmax;exmin = integer[0];integer[0] = integer[n];integer[n] = exmin;for (i = 0; i < x; i++)printf("%d ", integer[i]);printf("\n");return 0;
}
5、输出学生成绩 (15分)
本题要求编写程序,根据输入学生的成绩,统计并输出学生的平均成绩、最高成绩和最低成绩。
输入格式:
输入第一行首先给出一个正整数n(1<n≤10),表示学生的个数。第一行给出n个学生的成绩,数字间以空格分隔。
输出格式:
按照以下格式输出:平均分保留2位小数。
average = 平均成绩max = 最高成绩min = 最低成绩
结果均保留两位小数。
输入样例:
3
85 90 95
输出样例:
average = 90.00max = 95min = 85
代码展示:
#include <stdio.h>
int main()
{int i;int x, integer[10];int max, min;int sum;float average;scanf("%d", &x);scanf("%d", &integer[0]);max = integer[0];min = max;sum=min;for (i = 1; i < x; i++){scanf("%d", &integer[i]);if (integer[i] > max){max = integer[i];}if (integer[i] < min){min = integer[i];}sum+=integer[i];}average=(float)sum/x;printf("average = %.2f max = %d min = %d\n",average,max,min); return 0;
}
6、数组中的数逆序存放 (10分)
本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的元素。
输入格式:
输入在第一行中给出一个正整数n(1≤n≤10)。第二行输入n个整数,用空格分开。
输出格式:
在一行中输出这n个整数的处理结果,相邻数字中间用一个空格分开,行末不得有多余空格。
输入样例:
4
10 8 1 2
输出样例:
2 1 8 10
代码展示:
#include <stdio.h>#define NUM_MAX 16void ArrInput(int *arr, int num);
void ArrReverse(int *arr, int num);
void ArrPrint(int *arr, int num);
void ArrCopy(int *arr, int *arr1);int main()
{int arrNum[NUM_MAX], num;scanf("%d", &num);ArrInput(arrNum, num);ArrReverse(arrNum, num);ArrPrint(arrNum, num);printf("\n");return 0;
}void ArrInput(int *arr, int num)
{int i;for (i = 0; i < num; i++)scanf("%d", &arr[i]);
}void ArrPrint(int *arr, int num)
{int i;for (i = 0; i < num; i++)printf("%d ", arr[i]);
}void ArrReverse(int *arr, int num)
{int A[NUM_MAX];int i;ArrCopy(arr, A);for (i = 0; i < num; i++){arr[i] = A[num - 1 - i];}
}void ArrCopy(int *arr, int *arr1)
{int n = NUM_MAX;int i;for (i = 0; i < n; i++){arr1[i] = arr[i];}
}
7、查找整数 (10分)
本题要求编写程序,从输入的n个整数中查找给定的X。如果找到,输出X的位置(从0开始数);如果没有找到,输出“Not Found”。
输入格式:
输入在第一行中给出两个正整数n(1≤n≤20)和X,第二行给出n个整数。数字均不超过长整型,其间以空格分隔。
输出格式:
在一行中输出X的位置,或者“Not Found”。
输入样例1:
5 7
3 5 7 1 9
输出样例1:
2
输入样例2:
5 7
3 5819
输出样例2:
Not Found
代码展示:
#include <stdio.h>
int main()
{int x,integer[20];int i,k,m,l;l=1;scanf("%d",&k);scanf("%d",&x);for(i = 0;i < k;i++){scanf("%d",&integer[i]);if(x == integer[i]){m=i;l++;}}if(l == 1)printf("%d",l);else if(l == 2)printf("%d\n",m);return 0;
}
8、输出数组元素 (15分)
本题要求编写程序,对顺序读入的n个整数,顺次计算后项减前项之差,并按每行三个元素的格式输出结果。
输入格式:
输入的第一行给出正整数n(1<n≤10)。随后一行给出n个整数,其间以空格分隔。
输出格式:
顺次计算后项减前项之差,并按每行三个元素的格式输出结果。数字间空一格,行末不得有多余空格。
输入样例:
10
5 1 7 14 6 36 4 28 50 100
输出样例:
-4 6 7
-8 30 -32
24 22 50
代码展示:
#include <stdio.h>
int main()
{int integer [10];int subtraction[9];int x,i,k;scanf("%d",&x);for(i=0;i < x;i++)scanf("%d",&integer[i]);for(k = 1,i = 1;k <= 3,i < x;k++,i++){printf("%d ",integer[i]-integer[i-1]);if(k == 3){k=0;printf("\n");}}return 0;
}
9、数字加密 (20分)
本题要求编写程序,输入一个四位数,将其加密后输出。方法是将该数每一位上的数字加9,然后除以10取余,做为该位上的新数字,最后将千位和十位上的数字互换,百位和个位上的数字互换,组成加密后的新四位数。例如输入1257,经过加9取余后得到新数字0146,再经过两次换位后得到4601。
输入格式:
输入在一行中给出一个四位的整数x,即要求被加密的数。
输出格式:
在一行中按照格式“The encrypted number is V”输出加密后得到的新数V。
输入样例:
1257
输出样例:
The encrypted number is 4601
代码展示:
#include <stdio.h>
int main()
{int integer[4];int x,i;int result;scanf("%d",&x);integer[0]=x%10;//个位数for(i = 1;i < 4;i++){x/=10;integer[i]=x%10;}for(i = 0;i < 4;i++){integer[i]+=9;integer[i]%=10;}integer[3]=integer[3]^integer[1];integer[1]=integer[3]^integer[1];integer[3]=integer[3]^integer[1];integer[2]=integer[2]^integer[0];integer[0]=integer[2]^integer[0];integer[2]=integer[2]^integer[0];result=integer[0] + integer[1] * 10 + integer[2] * 100 + integer[3] * 1000;printf("The encrypted number is %d\n",result);return 0;
}
10、查验身份证 (25分)
一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:
首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:
Z:012345678910
M:10 X 98765432
现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。
输入格式:
输入在第一行中给出一个正整数n(1<n≤100)是输入的身份证号码的个数,随后n行,每行给出1个18位身份证号码。
输出格式:
按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed。
输入样例1:
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X
输出样例1:
12010X198901011234
110108196711301866
37070419881216001X
输入样例2:
2
320124198808240056
110108196711301862
输出样例2:
All passed
按理来说 long long 是可以做到存放18位数据的,但是还是不建议用,对于身份证这类有明确划分功能的长数据,还是使用数组存放更加安全可靠
代码展示:
#include <stdio.h>
int main(){int N;int i=0;int sax[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};char num[]={'1','0','X','9','8','7','6','5','4','3','2'};char ID[19];int d,sum,count=0;scanf("%d",&N);for(i=0;i<N;i++){scanf("%s",ID);sum=0;for(d=0;d<17 && ID[d]>='0' && ID[d]<='9';d++){sum=sum+(ID[d]-'0')*sax[d];}if(d==17 && ID[17]==num[sum%11]){count++;}else{puts(ID);//等价printf("%s\n",ID);}}if(count==N){printf("All passed\n");}return 0;
}
三、经验分享
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语言程序设计上机实验代码参考【第十二周实验】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!