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