STD高级语言程序设计第八天(满分答案,附赠本人程序的解析及坑点标识)

这篇博客包含四道编程题目,分别是时间换算,计算两个平面向量的和向量,复数的加、减、乘、除运算,以及在学习小组中匹配成绩最高和最低异性学生的方法。程序通过读取输入,进行相应计算并输出结果,符合题目所给的格式要求。
摘要由CSDN通过智能技术生成

7-1 时间换算 (10 分)

本题要求编写程序,以hh:mm:ss的格式输出某给定时间再过n秒后的时间值(超过23:59:59就从0点开始计时)。

输入格式:

输入在第一行中以hh:mm:ss的格式给出起始时间,第二行给出整秒数n(<60)。

输出格式:

输出在一行中给出hh:mm:ss格式的结果时间。

输入样例:

11:59:40
30

结尾无空行

输出样例:

12:00:10

结尾无空行

#include<stdio.h>
int main()
{
    //存储并接收当前时间
    int a,b,c;
    scanf("%d:%d:%d",&a,&b,&c);
    
    //存储并接收秒数
    int d;
    scanf("%d",&d);
    
    //将当前时间加上给定的秒数得到换算后的秒数
    c+=d;
    
    //如果当前时间的秒数大于等于60,分钟加一,并将秒数减60
    //得到下一分钟的秒数
    if(c>=60)
    {
        b++;
        c-=60;
    }
    
    //如果当前时间的分钟大于等于60,小时加一,并将分钟减60
    //得到下一小时的分钟
    if(b>=60)
    {
        a++;
        b-=60;
    }
    
    //如果当前时间是24时,转换为0时
    if(a==24)
        a=0;
    
    //打印,占据两个字符宽度,不够的字符位补0
    printf("%02d:%02d:%02d\n",a,b,c);
    
    return 0;
}

 7-2 平面向量加法 (10 分)

本题要求编写程序,计算两个二维平面向量的和向量。

输入格式:

输入在一行中按照“x1​ y1​ x2​ y2​”的格式给出两个二维平面向量v1​=(x1​,y1​)和v2​=(x2​,y2​)的分量。

输出格式:

在一行中按照(x, y)的格式输出和向量,坐标输出小数点后一位(注意不能输出−0.0)。

输入样例:

3.5 -2.7 -13.9 8.7

结尾无空行

输出样例:

(-10.4, 6.0)

结尾无空行

#include<stdio.h>
#include<math.h>
int main()
{
    //接收并存储两个平面向量的坐标值
    double x1,x2,y1,y2;
    scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
    
    //存储两个向量相加后的坐标值
    double x,y;
    x=x1+x2;
    y=y1+y2;
    
    //如果x,y的绝对值小于0.05,在格式化输出时x,y为-0.0
    //所以,如果x,y的绝对值小于0.05,对x,y重新赋值0.0
    if(fabs(x)<0.05)
        x=0.0;
    if(fabs(y)<0.05)
        y=0.0;
    
    //打印,小数点后一位
    printf("(%.1f, %.1f)",x,y);
    
    return 0;
}

 7-3 复数四则运算 (15 分)

本题要求编写程序,计算2个复数的和、差、积、商。

输入格式:

输入在一行中按照a1 b1 a2 b2的格式给出2个复数C1=a1+b1i和C2=a2+b2i的实部和虚部。题目保证C2不为0。

输出格式:

分别在4行中按照(a1+b1i) 运算符 (a2+b2i) = 结果的格式顺序输出2个复数的和、差、积、商,数字精确到小数点后1位。如果结果的实部或者虚部为0,则不输出。如果结果为0,则输出0.0。

输入样例1:

2 3.08 -2.04 5.06

结尾无空行

输出样例1:

(2.0+3.1i) + (-2.0+5.1i) = 8.1i
(2.0+3.1i) - (-2.0+5.1i) = 4.0-2.0i
(2.0+3.1i) * (-2.0+5.1i) = -19.7+3.8i
(2.0+3.1i) / (-2.0+5.1i) = 0.4-0.6i

结尾无空行

输入样例2:

1 1 -1 -1.01

输出样例2:

(1.0+1.0i) + (-1.0-1.0i) = 0.0
(1.0+1.0i) - (-1.0-1.0i) = 2.0+2.0i
(1.0+1.0i) * (-1.0-1.0i) = -2.0i
(1.0+1.0i) / (-1.0-1.0i) = -1.0
#include<stdio.h>
#include<complex.h>
#define fd 0.05 
int main()
{
    //接收并存储两个复数的实部和虚部
    double a,b,c,d;
    scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
    
    //定义两个复数
    complex double fs1=a+b*I,fs2=c+d*I;
    
    //存储两个复数四则运算后的复数
    complex double s[4];
    s[0]=fs1+fs2;
    s[1]=fs1-fs2;
    s[2]=fs1*fs2;
    s[3]=fs1/fs2;
    
    //存储四则符号
    char e[4]={'+','-','*','/'};
    
    //利用循环输出两个复数进行四则运算的四个式子
    for(int i=0;i<4;i++)
    {
        //判断第一个复数虚部的值,从而控制第一个复数输出加减号的正确性
        if(b>=0)
            printf("(%.1f+%.1fi)",a,b);
        
        //第二个测试点,b那里要加上负号
        else
            printf("(%.1f-%.1fi)",a,-b);
        
        //输出两个复数进行的四则运算符号
        printf(" %c ",e[i]);
        
        //同理,判断第二个复数虚部的值,控制符号输出
        if(d>=0)
            printf("(%.1f+%.1fi)",c,d);
        else
            printf("(%.1f-%.1fi)",c,-d);
        
        //打印等号
        printf(" = ");
        
        //注:输出这里的判断条件不一样,因为最后要格式化输出,不能用实部或虚部与0作比较
        //如果与0作比较,且实部或虚部为-0.04,格式化输出会四舍五入,输出的是-0.0,与题意不符
        //所以要将实部或者虚部同0.05或-0.05相比较,
        //以0.06为例,大于0.05,最后格式化输出为0.1
        //程序开始定义符号常量fd为0.05
        
        //判断,如果实部大于等于0.05或者小于等于-0.05,则输出一位小数的实部
        if((creal(s[i])>=fd||creal(s[i])<=-fd))
        {
            printf("%.1f",creal(s[i]));
            
            //判断,如果虚部大于等于0.05,打印加号
            if(cimag(s[i])>=fd)
                printf("+");
            
            //如果虚部小于0.05或者大于-0.05,最后格式化会为0,按照题意不输出,直接打印换行
            else if(cimag(s[i])<fd&&cimag(s[i])>-fd)
                printf("\n");
        }
        
        //如果虚部大于等于0.05,打印虚部和i,换行
        if(cimag(s[i])>=fd)
            printf("%.1fi\n",cimag(s[i]));
        
        //如果虚部小于等于-0.05,打印负号,虚部,i和换行
        else if(cimag(s[i])<=-fd)
            printf("-%.1fi\n",-cimag(s[i]));
        
        //如果实部虚部都小于0.05,大于-0.05,按照题意输出0,换行
        if(creal(s[i])<fd&&cimag(s[i])<fd&&creal(s[i])>-fd&&cimag(s[i])>-fd)
            printf("0.0\n");
    }
    
    return 0;
}

 7-4 一帮一 (15 分)

“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。

输入格式:

输入第一行给出正偶数N(≤50),即全班学生的人数。此后N行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,并且没有并列名次。

输出格式:

每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。

输入样例:

8
0 Amy
1 Tom
1 Bill
0 Cindy
0 Maya
1 John
1 Jack
0 Linda

结尾无空行

输出样例:

Amy Jack
Tom Linda
Bill Maya
Cindy John

结尾无空行

#include<stdio.h>
int main()
{
    //存储并接收同学人数
    int a;
    scanf("%d",&a);
    
    //存储同学性别
    int b[50];
    
    //存储同学姓名
    char c[50][10];
    
    //接收同学性别和姓名,其中数组b和数组c角标相互对应
    for(int i=0;i<a;i++)
        scanf("%d %s",&b[i],c[i]);
    
    //大循环从上面查找
    for(int i=0;i<a/2;i++)
        
        //小循环从下面查找
        for(int j=a-1;j>=a/2;j--)
            
            //如果一男一女,则性别相加之和为1
            if(b[i]+b[j]==1)
            {
                //符合条件打印
                printf("%s %s\n",c[i],c[j]);
                
                //改性别,将输出过的性别变为2
                //则输出一次后,永远不会输出第二次
                b[j]=2;
                
                //找到符合条件的终止小循环,大循环执行下一次
                break;
            }
    
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力敲代码啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值