2021计算导论第九次练习题目

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);
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值