仿真实验室第一次培训题解

本文围绕C++编程,详细讲解了基础操作(如数组和日期计算)、算法设计(如硬币兑换方法和螺旋矩阵构建)以及数据结构和排序的运用。
摘要由CSDN通过智能技术生成

目录

2-9

7-1

7-2

7-3 

7-4

7-5

7-6

7-7

选择题答案

1-5:A D D C C

6-10:B D D D A

11-15: C A A C B

16-10: C C D C C

2-9

题目:

若有下面的语句:

vector<int> v;
for (int i = 0; i < 4; i++)
    v.push_back(i + 1);
cout << v.size() << endl;

则执行后程序的输出结果是:A.1   B.2   C.3   D.4

解析:

v.size()即v的大小,通过for循环依次向v中存入了1,2,3,4,因而v的大小为4.

7-1

题目:

本题要求编写程序,输出整数152的个位数字、十位数字和百位数字的值。

输入格式:
本题无输入。

输出格式:
按照以下格式输出:

152 = 个位数字 + 十位数字*10 + 百位数字*100

代码实现:

#include <stdio.h>
int main()
{
    int x = 152;
    int a,b,c;//a为个位数字,b为十位数字,c为百位数字
    a = x%10;
    b = x/10%10;
    c = x/100;
    printf("152 = %d + %d*10 + %d*100",a,b,c);
    return 0;
}

注意:严格按照所要求的格式输出。

7-2

题目:

本题要求编写程序计算某年某月某日是该年中的第几天。

输入格式:
输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。

输出格式:
在一行输出日期是该年中的第几天。

代码实现:

#include <stdio.h>
// 判断闰年
int isLeapYear(int year)
{
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

// 计算某年某月某日是该年中的第几天
int dayOfYear(int year, int month, int day)
{
    int daysOfMonth[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    if (isLeapYear(year)) daysOfMonth[2] = 29;
    int i, days = 0;
    for (i = 1; i < month; i++)
    {
        days += daysOfMonth[i];
    }
    days += day;
    return days;
}

int main()
{
    int year, month, day;
    scanf("%d/%d/%d", &year, &month, &day);
    printf("%d\n", dayOfYear(year, month, day));
    return 0;
}

核心思想:用一维数组存储每个月的天数,再根据该年是否是闰年来判断是否修改daysOfMonth[2]的值。

7-3 

题目:

将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?

输入格式:
输入在一行中给出待换的零钱数额x∈(8,100)。

输出格式:
要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。

代码实现:

#include <stdio.h>
int main()
{
    int x, i ,j, k, count;
    count = 0;
    scanf("%d", &x);
    for (i = x / 5; i > 0; i--)
    for (j = x / 2; j > 0; j--)
    for (k = x; k > 0; k--)
    if (i * 5 + j * 2 + k == x)
    {
        printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n", i, j, k, i+j+k);
        count++;
    }
    printf("count = %d\n", count);
    return 0;
}

注意:根据输出样例,决定5分、2分、1分硬币的个数从大到小遍历。

7-4

题目:

本题要求编写程序,根据下式求π的近似值,直到最后一项小于给定精度eps。

2π​=1+31!​+3×52!​+3×5×73!​+⋯+3×5×⋯×(2×i+1)i!​+⋯

输入格式:

输入在一行中给出精度eps,可以使用以下语句来读输入:

scanf("%le", &eps);

输出格式:

在一行内,按照以下格式输出π的近似值(保留小数点后5位):

PI = 近似值

代码实现:

#include<stdio.h>
int main()
{
    double i=1;
    double eps,sum=0,re=1;
    scanf("%le", &eps);
    while(re>=eps)
    {
        sum = sum + re;
        re = re * i/(2*i+1);
        i = i + 1;
    }
    sum = sum + re;
    printf("PI = %.5f",2*sum);
    return 0;
}

注意:题目要求直到最后一项小于给定精度eps,所以当re<eps时,跳出循环,我们仍需要把此时的re加到sum上,才满足题目要求。

7-5

题目:

本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的元素。

输入格式:
输入在第一行中给出一个正整数n(1≤n≤10)。第二行输入n个整数,用空格分开。

输出格式:
在一行中输出这n个整数的处理结果,相邻数字中间用一个空格分开,行末不得有多余空格。

解法一:

在原数组中进行操作即原地工作:

http://t.csdnimg.cn/pCAN5

解法二:

由于本题对内存限制要求不高,所以可以另外动态开辟b数组存储a数组逆序之后的结果。

算法描述:

一、动态开辟a,b数组。

二、每次输入元素a[i],根据倒序关系存入b数组中即b[n-i-1]=a[i]。

三、将数组b正序输出,注意结尾无空格的格式问题(将最后一个数单独输出)。

四、将动态开辟的a,b数组释放掉。

代码实现:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int n;
    scanf("%d",&n);
    int *a=(int*)malloc(n*sizeof(int));
    int *b=(int*)malloc(n*sizeof(int));
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        b[n-i-1]=a[i];
    }
    for(int i=0;i<n-1;i++)
        printf("%d ",b[i]);
    printf("%d",b[n-1]);
    free(a);
    free(b);
    return 0;
}

7-6

题目:

螺旋方阵
所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。

输入格式:
输入在一行中给出一个正整数N(<10)。

输出格式:
输出N×N的螺旋方阵。每行N个数字,每个数字占3位。

算法描述:

经过观察及思考发现,可以将一圈的遍历划分为四个方向的遍历,我们可以进行n/2趟循环即进行n/2圈遍历。当n为偶数时,进行n/2趟循环即可构造成完整的螺旋矩阵。当n为奇数时,螺旋矩阵最中间的值并未对其进行赋值,我们需要进行a[n/2][n/2]=n*n的操作。本题最重要的是要搞清楚一圈中上边一行、右边一竖、下边一行、左边一竖的遍历操作。

#include<stdio.h>
int main()
{
    int n,count=1;
    scanf("%d",&n);
    int a[n][n];
    for(int i=0;i<n/2;i++)
    {
        for(int j=i;j<n-i-1;j++)//遍历上边一行
        {
            a[i][j]=count;
            count++;
        }
        for(int j=i;j<n-i-1;j++)//遍历右边一竖
        {
            a[j][n-i-1]=count;
            count++;
        }
        for(int j=n-i-1;j>i;j--)//遍历下边一行
        {
            a[n-i-1][j]=count;
            count++;
        }
        for(int j=n-i-1;j>i;j--)//遍历左边一竖
        {
            a[j][i]=count;
            count++;
        }
    }
    if(n%2!=0)
        a[n/2][n/2]=n*n;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
            printf("%3d",a[i][j]);
        printf("\n");
    }
    return 0;
}

注意:输出格式要求每个数字占3位。

7-7

本题目要求读入n个整数(输入数字个数根据输入时随机确定,以输入一个非数字的值作为输入结束标志),利用STL比较数据大小并排序(由小到大升序),然后输出排序后的数据。

输入格式:
输入在一行中依次输入整数值,每个数字之间用空格分隔,输入数字个数根据输入时随机确定,以输入一个非数字的值作为输入结束标志。

输出格式:
先输出一段提示“从标准设备读入数据,直到输入是非整型数据为止”,在输入一组数字后,输出排序后的数字,在一行中由小到大依次输出所有值,数字之间用空格分隔。

代码实现:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    vector<int>v;
    int num;
    while(scanf("%d",&num))
    {
        v.push_back(num);
    }
    sort(v.begin(),v.end());
    printf("从标准设备读入数据,直到输入是非整型数据为止\n");
    for(int i=0;i<v.size();i++)
        printf(" %d",v[i]);
    return 0;
}

注意:1、本题主要考查C++的STL容器中sort()函数的使用。

           2、严格按照所要求的格式输出。

  • 13
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值