[大学计算] 期末自测 答案

BMI指数

体质量指数BMI(Body Mass Index),简称体质指数,是国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。
设体重为w(单位:公斤),身高为h(单位:米),BMI指数计算方法是:bmi=w/(h2),其中2表示平方。BMI判断体型胖瘦的标准是:bmi < 18.5,属于偏瘦;18.5 <= bmi < 24,属于正常; 24 <= bmi <28,属于偏胖;bmi >= 28,属于肥胖。请上述公式,完成如下的体质指数判断函数功能:int bmiIndex(double weight, double height);其中,weight和height分别表示某人的体重和身高,该函数返回体型胖瘦的判断结果(为整数值,1、2、3、4分别表示偏瘦、正常、偏胖、肥胖)。

#include <iostream>
#include <iomanip>

using namespace std;

int bmiIndex(double weight, double height)
{
/**********Program**********/
    double bmi = weight / (height * height);
    if (bmi < 18.5)
    {
        return 1;
    }
    if (bmi < 24)
    {
        return 2;
    }
    if (bmi < 28)
    {
        return 3;
    }
    return 4;
 
 
/**********  End  **********/
}


int main()
{
    double w,h;
    cin >> w >> h;

    cout << bmiIndex(w,h) << endl;
    
    return 0;
}

中奖

某彩票号码共有八位,中奖规则如下:
一等奖:投注号码与当期开奖号码八位数字全部相同(顺序也相同,下同),即中奖;
二等奖:投注号码与当期开奖号码中的前五位数字完全相同,且第八位也相同,即中奖;
三等奖:投注号码与当期开奖号码中的前五位号码完全相同,即中奖;
注意中奖等级以高奖优先,不叠加中奖。
请根据中奖规则,完成函数int lottery(int theNum, int luckyNum)功能,
判断投注号码的得奖等级,中奖则返回对应的得奖等级,未中奖则返回-1。
其中,参数theNum是投注号码,参数luckyNum是当期开奖号码。

例如:投注号码为12345678,当期开奖号码为12345768,由于两者
前五位号码均为12345,第八位均为8,其他号码不完全一致,中二等奖,结果返回2。

#include <iostream>
using namespace std;

int lottery(int theNum, int luckyNum)
{
/**********Program**********/
    int num[10] = {0};
    for (int i = 8; i >= 1; i --)
    {
        num[i] = theNum % 10;
        theNum /= 10;
    }
    int lnum[10] = {0};
    for (int i = 8; i >= 1; i --)
    {
        lnum[i] = luckyNum % 10;
        luckyNum /= 10;
    }
    bool judge = 1;
    for (int i = 1; i <= 8; i ++)
    {
        if (num[i] != lnum[i])
        {
            judge = 0;
        }
    }
    if (judge == 1)
    {
        return 1;
    }
    judge = 1;
    for (int i = 1; i <= 5; i ++)
    {
        if (num[i] != lnum[i])
        {
            judge = 0;
        }
    }
    if (num[8] != lnum[8])
    {
        judge = 0;
    }
    if (judge == 1)
    {
        return 2;
    }
    judge = 1;
    for (int i = 1; i <= 5; i ++)
    {
        if (num[i] != lnum[i])
        {
            judge = 0;
        }
    }
    if (judge == 1)
    {
        return 3;
    }
    return -1;

/**********  End  **********/ 
}


int main()
{
    int num, lucky;
    cin >> num;
    cin >> lucky;

    cout << lottery(num, lucky) << endl;
    
    return 0;
}

亏数

亏数(又称缺数)是一种特殊的自然数,指的是该数的所有
真因数(除去其自身)之和比这个数要小。然后,亏数的亏度
又定义为该数减去其真因数之和的结果。例如,15的真因数
包括1、3、5,1+3+5=9<15,所以15是亏数,其亏度为15-9=6。
请根据上述定义,完成如下函数功能:
int deficientNumber(int num);
该函数首先判断参数num是否为亏数,如果是则返回其亏度,
如果不是,则返回0。

#include <iostream>

using namespace std;

int deficientNumber(int num)
{
/**********Program**********/
    int cnt = 0;
    for (int i = 1; i <= num / 2; i ++)
    {
        if (num % i == 0)
        {
            cnt += i;
        }
    }
    if (cnt < num)
    {
        return num - cnt;
    }
    return 0;


/**********  End  **********/
}

int main()
{
    int n;
    cin >> n;
    
    cout << deficientNumber(n) << endl;

    return 0;
}

去除0

函数digitTrim(int n)作用是删除参数n中的数字0,并返回删除
后的结果,例如digitTrim(1018)的结果是118,注意n是一个正整数。
请尝试用递归调用完成该函数的功能。

#include <iostream>
using namespace std;

int digitTrim(int n)
{
/**********Program**********/
    if (n / 10 == 0)
    {
        return n;
    }
    if (n % 10 != 0)
    {
        return digitTrim(n / 10) * 10 + n % 10;
    }
    else
    {
        return digitTrim(n / 10);
    }
 
/**********  End  **********/
}

int main()
{
    int n;
    cin >> n;

    cout << digitTrim(n) << endl;
    
    return 0;
}

单位向量

单位向量是指模为1的向量,任一非零向量除以它的模可以
求得对应的单位向量,向量模等于各个元素平方和的平方根。
例如,向量(1, -1, 2, 1, -3)的模为1+1+4+1+9=16的平方根,
即等于4,所以该向量的单位向量是(0.25, -0.25, 0.5, 0.25, -0.75)。
编写函数void unitVector(double a[], double b[]),
其中a中存储了包含5个元素的非零向量,计算得到对应的单位向量,
存放到数组b中。
提示:求平方根的函数是sqrt。

#include <iostream>
#include <cmath>
using namespace std;

void unitVector(double a[], double b[]) 
{
/**********Program**********/
    double tot = 0;
    for (int i = 0; i < 5; i ++)
    {
        tot += a[i] * a[i];
    }
    tot = sqrt(tot);
    for (int i = 0; i < 5; i ++)
    {
        b[i] = a[i] / tot;
    }
 
 
/**********  End  **********/
}


int main()
{
    double a[5];
    double b[5];
    for(int i = 0; i < 5; i++)
    {
        cin >> a[i];
    }

    unitVector(a, b);

    for (int i = 0; i < 5; i++)
        cout << b[i] << "\t";
    cout << endl;

    return 0;
}

提取字符

函数extract(char str[], int s, int e, int n, char res[])
从字符串str中抽取字符形成字符串存入res中。抽取规则为:
在str中从序号s到e(不包括e)的子串中每n个字符取1个字符。
例如,str为”abcdefghijklmnopqrstuvwxyz”
则extract(str,2,18,2,res)被抽取的子串为”cdefghijklmnopqr”,
每2个字符取1个字符,抽取到的字符串为”cegikmoq”,
请按上述规则,完成函数extract的编写。

#include <iostream>
using namespace std;

void extract(char str[], int s, int e, int n, char res[])
{
 /**********Program**********/
    int cnt = 0;
    for (int i = s; i < e; i += n)
    {
        res[cnt++] = str[i];
    }
    res[cnt] = '\0';

 /**********  End  **********/
}
int main()
{
    int n;
    char s[100];
    char e[100];

    for (int j = 0; j < 50; j++)
    {
        cin >> n;
        s[j] = n % 26 + 'a';
    }
    s[50] = 0;

    extract(s, 2, 40, 3, e);

    cout << e << endl;
    
    return 0;
}

行程编码

数据压缩对高效传输和存储大量数据具有重要意义。
行程编码是一种简单有效的压缩算法,它可将连续的重复字符
压缩成“重复次数+字符”的形式,从而减少存储开销。
行程编码解压缩则对应的逆向过程。
例如,“4A2B1C1D2E”压缩后为“AAAABBCDEE”,
“3a1B2C1e2F”压缩后为“aaaBCCeFF”。
函数run_length_decoding的功能是按行程编码算法进行解压缩,
参数src是压缩的字符串,解压后的结果保存在参数dst中
(仅包含字母,长度不超过1000)。请完成函数run_length_decoding。
说明:简化起见,测试用例保证每种字符连续重复次数在1到9之间。

提示:可能用到的字符串函数说明如下,
strlen(char *str):返回字符串str的长度;
strcpy(char *dest, char *src):把字符串src复制到dest;
strcat(char *dest, char *src):把字符串src连接到dest后面;
int atoi(const char *str):将字符串str转换成对应的整数。
sprintf(char *str, const char *format, …):发送格式化输出到str所指向的字符串。

#include <iostream>
#include <cstring>
using namespace std;

void run_length_decoding(char* src, char* dst)
{
/**********Program**********/
    int index = 0;
    for (int i = 0; src[i] != '\0'; i += 2)
    {
        for (int j = 0; j < src[i] - '0'; j ++)
        {
            dst[index++] = src[i + 1];
        }
    }
    dst[index] = '\0';
 
/**********  End  **********/
}

int main()
{
    char s[1000], t[1000];
    cin >> s;

    run_length_decoding(s, t);

    cout <<  t << endl;
    
    return 0;
}

统计平均分

某班共有若干名学生,学生信息用如下的stuinfo结构表示,
其中,男学生则gender取值为’m’,女学生则gender取值为’f’。
2022年春季学期4门课程的成绩依次保存在score1~score4中。
请编写函数double statistics(stuinfo stus[], int n)
分别统计男生4门课程总分的平均分,以及女生4门课程总分的平均分,
其中stus数组存储了班上所有学生的信息,n为班上学生的总人数。
函数最后返回男生总分平均分减去女生总分平均分的结果(浮点数)。

#include <iostream>
#include<string>
using namespace std;

struct stuinfo {
    int  id;  // 学号
    string name; // 姓名
    char gender; // 性别
    int  score1; // 课程1成绩
    int  score2; // 课程2成绩
    int  score3; // 课程3成绩
    int  score4; // 课程4成绩
};

double statistics(stuinfo stus[], int n)
{
    /**********Program**********/
    double m = 0, f = 0;
    int cntm = 0, cntf = 0;
    for (int i = 0; i < n; i ++)
    {
        if (stus[i].gender == 'm')
        {
            m += stus[i].score1;
            m += stus[i].score2;
            m += stus[i].score3;
            m += stus[i].score4;
            cntm ++;
        }
        else
        {
            f += stus[i].score1;
            f += stus[i].score2;
            f += stus[i].score3;
            f += stus[i].score4;
            cntf ++;
        }
    }
    return m / cntm - f / cntf;



    /**********  End  **********/
}

int main()
{
    int n;
    stuinfo ptr[11] = {
        {104, "Zhang San", 'f', 94, 97, 91, 94},
        {105, "Li Si", 'm', 90, 86, 90, 75},
        {106, "Wang Wu", 'm', 94, 88, 91, 86},
        {107, "Zhzo Liu", 'f', 92, 95, 81, 87},
        {108, "Qian, Jiu", 'f', 99, 90, 82, 91},
        {109, "Ding Yi", 'm', 98, 86, 80, 94},
        {110, "Zhou Er", 'f', 90, 90, 91, 93},
        {111, "Chen Ba", 'm', 92, 83, 92, 77},
        {112, "Zhu Qi", 'f', 90, 85, 88, 81},
        {113, "Wu Shi", 'm', 91, 82, 89, 86},
        {114, "Du Du", 'm', 93, 84, 82, 87} 
    };

    cin >> n;

    cout << statistics(ptr, n) << endl;

    return 0;
}

偶节点

下面有结构node的定义,指针head中存放着node节点组成
的单链表的首节点地址,函数even(head)获取head指向链表
中的序号(注意不是node结构的data字段,且序号从0开始编号)
为偶数的节点,并将这些节点按原有序组成新链表返回。
要求新链表中的节点采用动态内存分配的方式构建,
从而不破坏原链表。如:head指向的链表为:1->2->3->4->5->6,
则even(head)得到的链表为:1->3->5。请完成函数even的编写。

#include <iostream>
using namespace std;

struct node { //链表节点定义
    int data;
    node* next;
};

node* even(node* h)
{
    /**********Program**********/
    node * head = NULL;
    node * ptr = h;
    // head->data = ptr->data;
    // head->next = NULL;
    // ptr = ptr->next;
    bool judge = 0;
    while (ptr != NULL)
    {
        if (judge == 0)
        {
            node * tmp = new node;
            tmp->data = ptr->data;
            tmp->next = NULL;

            if (head == NULL)
            {
                head = tmp;
            }
            else
            {
                node * tmpptr = head;
                node * tmppre = NULL;
                while (tmpptr != NULL)
                {
                    tmppre = tmpptr;
                    tmpptr = tmpptr->next;
                }
                tmppre->next = tmp;
            }
        }
        judge = !judge;
        ptr = ptr->next;
    }
    return head;
    /**********  End  **********/
}

int main()
{
    node* head = NULL, * t;
    int n, j;
    cin >> n;
    n = n % 47;

    head = new node;
    head->data = n;
    t = head;
    for (j = 0; j < 20; j++)
    {
        cin >> n;
        n = n % 47;
        t->next = new node;
        t = t->next;
        t->data = n;
    }
    t->next = NULL;

    t = even(head);

    while (t)
    {
        cout << t->data << "->";
        t = t->next;
    }
    cout << endl;

    return 0;
}
posted @ 2024-05-16 01:36  RuntimeError-J  阅读(151)  评论(0)    收藏  举报