7-1 实验7_1_平均成绩 (100 分)
已知某个学生n门课的成绩,求平均成绩。
输入格式:
共两行,第一行为一个整数n,代表课程数,n不会超过100。第二行为n个用空格分隔的整数,代表该学生的n门课成绩,每门成绩的取值范围是0-100。要求这n个成绩必须使用数组存储。
输出格式:
只有一行,为该同学的平均成绩,保留两位小数。为了提高精度,求出的平均成绩建议使用double类型存储。
输入样例:
5
80 75 67 90 97
输出样例:
81.80
#include<stdio.h>
int main()
{
int n,i;
double ave,sum,now;
scanf("%d",&n);
double scores[n];
for(i=0;i<=n-1;i++)
{
scanf("%lf",&now);
scores[i]=now;
sum+=now;
}
ave=sum/n;
printf("%.2lf",ave);
}
7-2 实验7_2_数组查找 (100 point(s))
有n个互不相同的整数,存储在数组中。在这n个整数中查找m个整数,如果存在,则打印出与之相邻的整数;否则就显示无此数。
输入格式:
共4行,第一行为一个整数n(0<n<=1000),第二行为用空格分隔的n个整数。第三行为一个整数 m(0<m<=100),代表查询次数。第四行为用空格分隔的m个整数。测试用例保证所有整数可以用int存储。
输出格式:
共m行,依次对应输入m次查询结果,每次的查询结果中可能有一个数、两个数或没有数。若没有数则输出“NULL”。具体见样例。
输入样例:
5
89 7890 22 56 87
6
89 7890 22 56 87 999
输出样例:
7890
89 22
7890 56
22 87
56
NULL
#include<stdio.h>
int main()
{
int n,m,i,p,k,lookup,prim;
scanf("%d",&n);
if(n==1)
printf("NULL\n");
else
{
int known[n];
for(i=0;i<n;i++)
{
scanf("%d",&known[i]);
}
scanf("%d",&m);
for(p=0;p<m;p++)
{
scanf("%d",&lookup);
for(k=0;k<n;k++)
{
prim=0;
if(known[k]==lookup)
{
prim=1;
if(k==0)
{
printf("%d\n",known[1]);
break;
}
else if(k==n-1)
{
printf("%d\n",known[n-2]);
break;
}
else
printf("%d %d\n",known[k-1],known[k+1]);
break;
}
}
if(prim!=1)
printf("NULL\n");
}
}
}
//20220116改进:取消了break们,实现了单入单出,优化了prim旗标的逻辑
#include<stdio.h>
int main(){
int n,m,i,p,k,lookup,prim=0;
scanf("%d",&n);
if(n==1)
printf("NULL\n");
else{
int known[n];
for(i=0;i<n;i++){
scanf("%d",&known[i]);
}
scanf("%d",&m);
for(p=0;p<m;p++){
scanf("%d",&lookup);
prim=0;
for(k=0;k<n&&prim==0;k++){
if(known[k]==lookup){
prim=1;
if(k==0){
printf("%d\n",known[1]);
//break;
}
else if(k==n-1){
printf("%d\n",known[n-2]);
//break;
}
else
printf("%d %d\n",known[k-1],known[k+1]);
//break;
}
}
if(prim!=1)
printf("NULL\n");
}
}
}
7-3 实验7_3_奇数偶数 (100 point(s))
已知一个长度为n的整数数组,在保证原顺序的前提下,将该数组中所有的偶数放到所有的奇数之前,存到一个新数组中,并将新数组输出。
输入格式:
共2行,第一行为一个整数n(0<n<=200),代表输入整数个数,第二行为n个用空格分隔的整数,需保存在待处理数组中。测试用例保证所有整数可以用int存储。
输出格式:
只有一行,为新数组中的元素,数与数之间用一个空格分隔,第n个数后是换行符。
输入样例:
10
3 9 4 5 8 7 10 2 6 1
输出样例:
4 8 10 2 6 3 9 5 7 1
#include<stdio.h>
int main()
{
int i,n,now,j;
scanf("%d",&n);
int A[n],B[n];
for(i=0;i<n;i++)
{
scanf("%d",&now);
A[i]=now;
if(now%2==0)
{
B[j]=now;
j++;
}
}
for(i=0;i<n;i++)
{
if(A[i]%2!=0)
{
B[j]=A[i];
j++;
}
}
for(i=0;i<n-1;i++)
{
printf("%d ",B[i]);
}
printf("%d",B[n-1]);
}
7-4 实验7_4_向量的内积 (100 point(s))
请写程序计算并输出向量的内积。
输入格式:
共两行,第一行一个整数n,1<=n<=10,第二行2Xn个整数(以空格分隔),即两个长度为n的一维数组(向量)。
输出格式:
只有一个整数,为计算结果。测试用例保证所有整数(包括计算过程中的)可以用int存储。
输入样例:
3
1 2 3 4 5 6
输出样例:
32
#include<stdio.h>
int main()
{
int n,i,result;
scanf("%d",&n);
int veca[n],vecb[n];
for(i=0;i<n;i++)
{
scanf("%d",&veca[i]);
}
for(i=0;i<n;i++)
{
scanf("%d",&vecb[i]);
}
for(i=0;i<n;i++)
{
result+=veca[i]*vecb[i];
}
printf("%d",result);
}
7-5 实验7_5_发工资 (100 point(s))
每到月底,公司就要给员工发工资。每个员工的工资都是由(100,50,20,10,5,2,1) 7种面值的钞票组成的。为了发工资的简便,公司会尽量给员工发较大面值的钞票,例如某个员工的工资为1260,那么公司会给员工12张100元的、1张50元的、1张10的钞票。你的任务是,告诉你某员工的工资,你来计算如何给员工发工资。
输入格式:
为一个正整数n(可以用int存储),代表某位员工的工资。
输出格式:
为给该员工发的钞票面值与数量。具体格式见样例。
输入样例:
2352
输出样例:
100:23
50:1
2:1
#include<stdio.h>
int main()
{
int wages,i,num;
scanf("%d",&wages);
int note[7]={100,50,20,10,5,2,1};
for(i=0;i<7;i++)
{
num=wages/note[i];
if(num!=0)
{
printf("%d:%d\n",note[i],num);
}
wages=wages-note[i]*num;
}
}
7-6 实验7_6_数组交换 (100 point(s))
设有整数数组A和B,它们长度均为n。A数组中的元素为任意整数,不超过int型数据范围。B数组中元素的值互不相同,且取值介于0至n-1之间。现要求按数组B的内容调整A中数据的次序,比如当B[0]=9时,则要求将A[0]的内容与A[9]互换。
输入格式:
首先输入一个整数n(0<n<=10),代表数组A、B元素的个数。然后输入n个整数代表数组A中的元素。最后输入 n个整数代表数组B中的元素,注意B中元素的要求。测试用例保证所有整数可以用int存储。
输出格式:
调整后A数组的内容,数与数之间用空格分开,注意第n个数后没有空格而是换行符。
输入样例:
10
5 10 3 9 4 12 8 7 11 2
1 3 6 9 2 7 0 8 5 4
输出样例:
3 9 4 2 5 12 10 11 7 8
#include<stdio.h>
int main()
{
int n,i,num,temp;
scanf("%d",&n);
int A[n],B[n];
for(i=0;i<n;i++)
{
scanf("%d",&A[i]);
}
for(i=0;i<n;i++)
{
scanf("%d",&num);
temp=A[num];
A[num]=A[i];
A[i]=temp;
}
for(i=0;i<n-1;i++)
{
printf("%d ",A[i]);
}
printf("%d",A[n-1]);
//打印数组的时候,一定一定不要加取地址符,否则会错的
}
7-7 实验7_7_连续子序列 (100 point(s))
已知两个由正整数组成的无序序列A、B,每个序列的元素个数未知,但至少有一个元素。你的任务是判断序列B是否是序列A的连续子序列。假设B是“1 9 2 4 18”,A是“33 64 1 9 2 4 18 7”,B是A的连续子序列;假设B是“1 9 2 4 18”,A是“33 1 9 64 2 4 18 7”,B不是A的连续子序列。
输入格式:
依次输入两个乱序的正整数序列A、B,序列中元素个数未知,但每个序列至少有一个元素,并以输入“-1”结束(-1不算序列中元素),每个序列占一行。两个数列的长度均不超过1000。
输入保证合法,且所有整数均可用int存储。
输出格式:
如果序列B是序列A的连续子序列,则输出“ListB is the sub sequence of ListA.”,否则输出“ListB is not the sub sequence of ListA.”。
输入样例:
5 4 3 2 1 -1
3 2 1 -1
输出样例:
ListB is the sub sequence of ListA.
#include<stdio.h>
int main()
{
int i,j,flag,k,p,now,A[1000],B[1000];
scanf("%d",&now);
for(i=0;now!=-1;i++)
{
A[i]=now;
scanf("%d",&now);
}
scanf("%d",&now);
for(j=0;now!=-1;j++)
{
B[j]=now;
scanf("%d",&now);
}
if(j<=i)
{
for(k=0;flag==0&&k<=i-j;k++)
{
if(A[k]==B[0])
{
flag=1;
}
if(flag==1)
{
for(p=1;flag!=0&&p<j;p++)
{
if(B[p]!=A[k+p])
{
flag=0;
}
}
if(flag==1)
{
printf("ListB is the sub sequence of ListA.");
}
}
}
if(flag==0)
{
printf("ListB is not the sub sequence of ListA.");
}
}
else
{
printf("ListB is not the sub sequence of ListA.");
}
}
//要点1:设计算法逻辑很关键
//要点2:每个参数的范围多一少一、等号大于等于号都要想清楚……
//20220116优化的逻辑:只有全部符合的情况才给旗标prim赋值1,其余情况都不改变旗标初始值0,实现了只有符合才输出
#include<stdio.h>
int main(){
int q,t,a[1000],b[1000],i=0,k=0,prim=0;
//先读入两个数组,这样做把最后的-1也算进数组元素了,因为不吃掉-1无法读取下一个数组
while (scanf("%d",&a[i]),a[i]!=-1)
++i;
while (scanf("%d",&b[k]),b[k]!=-1)
++k;
for ( t = 0; t < i && prim!=1; ++t) {
if (a[t]==b[0]){
for ( q = 1; q < k && prim==0; ++q) {
if(b[q] != a[t+q]){
prim=2;
}
}
if (q==k)
prim=1;
}
}
if (prim==1)
printf("ListB is the sub sequence of ListA.");
else
printf("ListB is not the sub sequence of ListA.");
}
7-8 实验7_8_最长平台 (100 point(s))
给定一个长度为n的整数数组,数组中连续的相等元素构成的子序列称为平台。试设计算法,求出数组中最长平台的长度。
输入格式:
共2行,第一行为一个整数n(0<n<=1000),代表输入整数个数,第二行为n个用空格分隔的整数。测试用例保证所有整数可以用int存储。
输出格式:
只有一行,为一个整数,代表输入数组的最长平台长度。
输入样例:
15
1 1 2 2 4 5 7 7 7 7 7 7 3 3 9
输出样例:
6
#include<stdio.h>
int main()
{
int n,len=1,max=1,i,j;
scanf("%d",&n);
int A[n];
for(i=0;i<n;i++)
{
scanf("%d",&A[i]);
}
while(j<n-1)
{
if(A[j]==A[j+1])
{
len++;
}
else
{
if(max<len)
{
max=len;
}
len=1;
}
j++;
}
if(max<len)
{
max=len;
len=1;
}
printf("%d",max);
}
//20220116更符合常理,更清晰明了的算法
#include<stdio.h>
int main()
{
int n,max=1,t;
scanf("%d",&n);
int a[n];
for (int i = 0; i < n; ++i) {
scanf("%d",&a[i]);
}
for (int j = 0; j < n; ++j) {
if (a[j]==a[j+1]){
for ( t = 1; t < n-j; ++t) {
if (a[j+t]!=a[j+t+1])
break;
}
max=(max>=t+1?max:t+1);
j+=t;
}
}
printf("%d",max);
}
/20220130
#include <stdio.h>
int main(){
int n,A[1000],num=1,max=1,i,j;
scanf("%d",&n);
for ( i = 0; i < n; ++i) {
scanf("%d",&A[i]);
}
for ( j = 0; j < n; ++j) {
while (A[j]==A[j+1] && j<=n-2){
num++;
j++;
}
max= max>num?max:num;
num=1;
}
printf("%d",max);
}