目录
(一)、选择结构
1、习题2-2 阶梯电价 (15 分)
为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。
输入格式:
输入在一行中给出某用户的月用电量(单位:千瓦时)。
输出格式:
在一行中输出该用户应支付的电费(元),结果保留两位小数,格式如:“cost = 应付电费值”;若用电量小于0,则输出"Invalid Value!"。
#include<stdio.h>//完完全全self
int main()
{
int power;
double cost;
scanf("%d",&power);
if(power<=0)
{
printf("Invalid Value!");
}else if(power>0&&power<=50){
cost=0.53*power;
printf("cost = %.2lf",cost);
}else{
cost=(power-50)*0.58+50*0.53;
printf("cost = %.2lf",cost);
}
return 0;
}
2.个人所得税
计算个人所得税
假设个人所得税为:税率×(工资−1600)。请编写程序计算应缴的所得税,其中税率定义为:
当工资不超过1600时,税率为0;
当工资在区间(1600, 2500]时,税率为5%;
当工资在区间(2500, 3500]时,税率为10%;
当工资在区间(3500, 4500]时,税率为15%;
当工资超过4500时,税率为20%。
输入格式:
输入在一行中给出非负工资。
输出格式:
在一行输出个人所得税,精确到小数点后2位。
输入样例1:
1600
输出样例1:
0.00
输入样例2:
1601
输出样例2:
0.05
输入样例3:
3000
输出样例3:
140.00
输入样例4:
4000
输出样例4:
360.00
输入样例5:
5000
输出样例5:
680.00
#include <stdio.h>
void taxes()
{
int a;
float c;
scanf("%d",&a);
if(a>4500)
c=(a-1600)*0.20;
else if(a>3500)
c=(a-1600)*0.15;
else if(a>2500)
c=(a-1600)*0.10;
else if(a>1600)
c=(a-1600)*0.05;
else
c=0.00;
printf("%.2f\n",c);
}
int main()
{
taxes();
return 0;
}
3.超市打折促销
二、单重循环
1、练习2-13 求N分之一序列前N项和 (15 分)
本题要求编写程序,计算序列 1 + 1/2 + 1/3 + ... 的前N项之和。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后6位。题目保证计算结果不超过双精度范围。
输入样例:
6
结尾无空行
输出样例:
sum = 2.450000
结尾无空行
答案:
#include<stdio.h>
int main()
{
int n,i;
scanf("%d",&n);
double sum=0;
for(i=1;i<=n;i++)
{
sum=sum+1.0/i;
}
printf("sum = %.6lf",sum);
return 0;
}
2、练习2-14 求奇数分之一序列前N项和 (15 分)
本题要求编写程序,计算序列 1 + 1/3 + 1/5 + ... 的前N项之和。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后6位。题目保证计算结果不超过双精度范围。
输入样例:
23
结尾无空行
输出样例:
sum = 2.549541
结尾无空行
答案
#include <stdio.h>
int main ()
{
int i, m, N;
double sum;
scanf("%d", &N);
sum=0;
i=1;
m=1;
for(i=1; i<=N; i++)
{
sum=sum+1.0/m;
m=m+2;
}
printf("sum = %lf", sum);
return 0;
}
3、练习2-15 求简单交错序列前N项和 (15 分)
本题要求编写程序,计算序列 1 - 1/4 + 1/7 - 1/10 + ... 的前N项之和。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后三位。题目保证计算结果不超过双精度范围。
输入样例:
10
结尾无空行
输出样例:
sum = 0.819
结尾无空行
答案
#include <stdio.h>//因为有符号有正负号之间的转化,所以需要flag进行转化
int main()
{
double sum=0;
int n,i;
scanf("%d",&n);
int flag=1;//如果奇数项为正,偶数项为负。
for(i=1; i<=n; i++)
{
sum=sum+flag*1.0/(3*i-2);
flag=-flag;
}
printf("sum = %.3lf",sum);
return 0;
}
4、7-1 求e的近似值 (10 分)
自然常数 e 可以用级数 1+1/1!+1/2!+⋯+1/n!+⋯ 来近似计算。本题要求对给定的非负整数 n,求该级数的前 n+1 项和。
输入格式:
输入第一行中给出非负整数 n(≤1000)。
输出格式:
在一行中输出部分和的值,保留小数点后八位。
输入样例:
10
结尾无空行
输出样例:
2.71828180
答案
#include <stdio.h>
int main()
{
int j, i;
double n, item, sum;
sum = 1;
scanf("%lf", &n);
for(i=1; i<=n; i++)
{
item = 1;
for(j=1; j<=i; j++)
{
item = item*j;
}
item = 1.0/item;
sum = sum+item;
}
printf("%.8lf", sum);
return 0;
}
5、实验6-1 近似求PI (15 分)
本题要求编写程序,根据下式求π的近似值,直到最后一项小于给定精度eps。
2π=1+31!+3×52!+3×5×73!+⋯+3×5×⋯×(2×i+1)i!+⋯
输入格式:
输入在一行中给出精度eps,可以使用以下语句来读输入:
scanf("%le", &eps);
输出格式:
在一行内,按照以下格式输出π的近似值(保留小数点后5位):
PI = 近似值
输入样例:
1E-5
结尾无空行
输出样例:
PI = 3.14158
答案:
#define N 999999//分母
double chen(int i)
{
double result=1.0;
int j=1;
while(j<=i)
{
result=result*(2*j+1);
j++;
}
return result;
}
double fac(int m)//分子阶乘
{
double s=1.0;
for(int i=1;i<=m;i++)
{
s=1.0*s*i;
}
return s;
}
int main(void)//
{
double eps;
double s=0;double d;
scanf("%le",&eps);
for(int i=0;i<=N;i++)
{
d=1.0*fac(i)/chen(i);
s=s+d;
if(d<eps)break;
}
printf("PI = %.5lf",2.0*s);
return 0;
}
三、数组
1.一维数组找最大值和最小值
#include<stdio.h>
int main()
{
int c[10];
int i,max,min;
for(i=0;i<10;i++)
scanf("%d",&c[i];
max=c[0];
min=c[0];
for(i=1;i<10;i++)
{
if(max<c[i])
max=c[i];
if(min>c[i])
min=c[i];
}
printf("最大值=%d",max);
printf("最小值=%d",min);
return 0;
}
2、实验7-1-7 查找整数 (10 分)(重要)
本题要求从输入的N个整数中查找给定的X。如果找到,输出X的位置(从0开始数);如果没有找到,输出“Not Found”。
输入格式:
输入在第一行中给出两个正整数N(≤20)和X,第二行给出N个整数。数字均不超过长整型,其间以空格分隔。
输出格式:
在一行中输出X的位置,或者“Not Found”。
输入样例1:
5 7
3 5 7 1 9
结尾无空行
输出样例1:
2
结尾无空行
输入样例2:
5 7
3 5 8 1 9
输出样例2:
Not Found
答案:
#include<stdio.h>
#define N 20//思路:遍历数组,设置标志位index记录需要查找的元素的下标。
int main()
{
int i, n, x, index;
int a[N];
scanf("%d", &n);
scanf("%d", &x);
for (i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
for (i = 0; i < n; i++)
{
if (a[i] == x)
{
index = i;
printf("%d", index);
break;
}
}
if (i == n)
{
printf("Not Found\n");
}
return 0;
}
3、实验7-1-3 求最大值及其下标 (20 分)(重要)
本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。
输入格式:
输入在第一行中给出一个正整数n(1<n≤10)。第二行输入n个整数,用空格分开。
输出格式:
在一行中输出最大值及最大值的最小下标,中间用一个空格分开。
输入样例:
6
2 8 10 1 9 10
结尾无空行
输出样例:
10 2
答案:
#include<stdio.h>
#define maxn 10
int main()
{
int a[maxn];
int n,max_index=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
if(a[max_index]<a[i]) max_index=i;
}
printf("%d %d",a[max_index],max_index);
return 0;
}
四、二维数组矩阵
1.一维数组查找
本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。
输入格式:
输入在第一行中给出一个正整数n(1<n≤10)。第二行输入n个整数,用空格分开。
输出格式:
在一行中输出最大值及最大值的最小下标,中间用一个空格分开。
输入样例:
6
2 8 10 1 9 10
输出样例:
10 2
#include<stdio.h>
#define maxn 10
int main()
{
int a[maxn];
int n,max_index=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
if(a[max_index]<a[i]) max_index=i;
}
printf("%d %d",a[max_index],max_index);
return 0;
}
2、实验7-2-2 矩阵运算 (20 分)
给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。
输入格式:
输入第一行给出正整数n(1<n≤10);随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。
输入样例:
4
2 3 4 1
5 6 1 1
7 1 8 1
1 1 1 1
结尾无空行
输出样例:
35
结尾无空行
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a[10][10],i,j,sum=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
if(!(i+j==n-1||i==n-1||j==n-1)) //我觉得只需要i+j==n-1这一个条件就够了,奈何~运行出来是错误的,故加上了后面的两个条件,才正确。
sum=sum+a[i][j];
}
}
printf("%d",sum);
return 0;
}
3、求二维数组和奇数之和与偶数之和
1、指针
#include <stdio.h>
#include <stdlib.h>
#define N 5
#define M 6
void fun(int (*a)[6],int n,int m,int *odd,int *even);//函数声明。其中odd返回奇数的和,even返回偶数。
int main()
{
int a[N][M]={{1,2,3,4,5,6},{7,8,9,10,11,12},{13,14,15,16,17,18},{19,20,21,22,23,24},{25,26,27,28,29,30}};
int (*p)[M]=a;
int qishu,oushu;
fun(p,5,6,&qishu,&oushu);
printf("qishu_sum=:%d\noushu_sum=:%d",qishu,oushu);
return 0;
}
void fun(int (*a)[6],int n,int m,int *odd,int *even)
{
*odd=0;
*even=0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (*(*(a + i) + j)%2==0)
{
*odd=*odd+*(*(a + i) + j);
}
else if (*(*(a + i) + j)%2==1)
{
*even=*even+*(*(a + i) + j);
}
}
}
return *odd,*even;
}
2、
#include <stdio.h>
int oddarray_sum(int *a,int m,int n)
{
int sum=0;
for(m=0;m<3;m++)
{
for(n=0;n<3;n++)
{
if(m%2==1)
{
sum=sum+*(a+m*3+n);//3为总列数,这是二维数组的访问形式
}
}
}
return sum;
}
//题目所给的意思就是求456的和
int main()
{
int a[3][3];
int i,j;
int sum;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
scanf("%d",&a[i][j]);
}
}
sum=oddarray_sum(&a[0][0],3,3);
printf("%d",sum);
return 0;
}
4、重要实验7-2-1 求矩阵各行元素之和 (15 分)
本题要求编写程序,求一个给定的m×n矩阵各行元素之和。
输入格式:
输入第一行给出两个正整数m和n(1≤m,n≤6)。随后m行,每行给出n个整数,其间
以空格分隔。
输出格式:
每行输出对应矩阵行元素之和。
输入样例:
3 2
6 3
1 -8
3 12
结尾无空行
输出样例:
9
-7
15
答案:
#include <stdio.h>//思路:使用二维数组a[][] 存储数组元素,使用一维数组b[]记录各行元素之和。
int main()
{
int i, j, m, n;
int a[6][6];
int b[6] = {0};
scanf("%d%d",&m,&n);
for (i = 0; i<m; i++)
{
for (j = 0; j<n; j++)
{
scanf("%d", &a[i][j]);
b[i] += a[i][j];
}
}
for (i = 0; i<m; i++)
{
printf("%d\n",b[i]);
}
return 0;
}
五、字符串原题(重要)
1、实验7-3-1 字符串逆序 (15 分)
输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。
输入格式:
输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。
输出格式:
在一行中输出逆序后的字符串。
输入样例:
Hello World!
结尾无空行
输出样例:
!dlroW olleH
答案:
#include<stdio.h>
#include<string.h>//调用getchar()
#define N 80
int main()
{
int i, cnt = 0;
char c;
char string[N] = {0};
c = getchar();
for (i = 0; c != '\n'; i++)
{
string[i] = c;
cnt++;
c = getchar();
}
for (i = 0; i < cnt/2; i++)
{
char temp;
temp = string[i];
string[i] = string[cnt - i - 1];
string[cnt - i - 1] = temp;
}
for (i = 0; i < cnt; i++)
{
printf("%c", string[i]);
}
printf("\n");
return 0;
}
2、子母字符串
3、实验8-2-2 找最长的字符串 (15 分)
本题要求编写程序,针对输入的N个字符串,输出其中最长的字符串。
输入格式:
输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。
输出格式:
在一行中用以下格式输出最长的字符串:
The longest is: 最长的字符串
如果字符串的长度相同,则输出先输入的字符串。
输入样例:
5
li
wang
zhang
jin
xiang
结尾无空行
输出样例:
The longest is: zhang
答案:
#include<stdio.h>
#include<string.h>
#define maxn 80
int main()
{
char s[maxn],longest[maxn];
int n;
scanf("%d",&n);
scanf("%s",s);
strcpy(longest,s);
for(int i=1;i<n;i++){
scanf("%s",s);
if(strlen(longest)<strlen(s)){
strcpy(longest,s);
}
}
printf("The longest is: %s",longest);
return 0;
}
六、常见相似问题
1、孪生素数
寻找[m,n]区间内所有的孪生素数并输出。孪生素数是指差为2的两个素数,例如,3和5,5和7。
① 编写函数int prime(int n),判断素数。
② 编写main函数,接收键盘输入的m和n的值,寻找[m,n]区间内所有的孪生素数并输出,并将孪生素数的对数输出,若区间内没有孪生素数,则输出无孪生素数信息。
输入
#include <stdio.h>
int prime(int m)
{
int i;
if(m==0)
return 0;
if(m==1)
return 1;
for(i=2;i<=m;i++)
if (m%i==0)
break;
if(i<m)
return 0;
else
return 1;
}
int main(void)
{
int q;
int t=0,i,n,m;
scanf("%d%d",&n,&m);
for(i=n;i<=m-2;i++)
{
if(prime(i)&&prime(i+2))
{
printf("(%d,%d)\n",i,i+2);
t++;
}
}
if(t==0)
printf("该区间内无孪生素数\n");
else
printf("t=%d",t);
return 0;
}
2、7-8 冒泡法排序 (20 分)
将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方法对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。
本题要求对任意给定的K(<N),输出扫描完第K遍后的中间结果数列。
输入格式:
输入在第1行中给出N和K(1≤K<N≤100),在第2行中给出N个待排序的整数,数字间以空格分隔。
输出格式:
在一行中输出冒泡排序法扫描完第K遍后的中间结果数列,数字间以空格分隔,但末尾不得有多余空格。
输入样例:
6 2
2 3 5 1 6 4
结尾无空行
输出样例:
2 1 3 4 5 6
答案;
#include <stdio.h>
#define SIZE 100
void bubble_sort(int arr[], int len, int n);
int main(void)
{
// 读入
int size, n;
scanf("%d %d", &size, &n);
int a[SIZE];
int i;
for (i=0; i<size; i++){
scanf("%d", &a[i]);
}
bubble_sort(a, size, n);
for (i=0; i<size; i++){
printf("%d%c", a[i], i==size-1?'\n':' '); // 最后一个数后面没有空格
}
return 0;
}
// 冒泡函数,n控制遍历次数
void bubble_sort(int arr[], int len, int n)
{
int i, j;
int temp;
for (i=len; i>len-n; i--){ // 不减n就可以完成排序了
for (j=0; j<i-1; j++){
if (arr[j] > arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
3、7-3 找出三位水仙花数
本题要求编写程序,输出给定正整数M和N区间内的所有三位水仙花数。三位水仙花数,即其个位、十位、百位数字的立方和等于该数本身。
输入格式:
输入在一行中给出两个正整数M和N(100≤M≤N≤999)。
输出格式:
顺序输出M和N区间内所有三位水仙花数,每一行输出一个数。若该区间内没有三位水仙花数,则无输出。
如果M或者N不符合题目的要求,则输出Invalid Value.
。
输入样例1:
100 400
结尾无空行
输出样例1:
153
370
371
结尾无空行
输入样例2:
500 600
结尾无空行
输出样例2:
结尾无空行
输入样例3:
990 101
输出样例3:
Invalid Value.
答案:
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
int main()
{
int m,n;
int i,a,b,c;
scanf("%d %d",&m,&n);
i=m;
if(n>=m&&m>=100&&n<=999)
{
for(i=m;i<=n;i++)
{
a=i/100;
b=i/10%10;
c=i%10;
if(i==pow(c,3)+pow(b,3)+pow(a,3))
{
printf("%d\n",i);
}
}
}
else
{printf("Invalid Value.");}
return 0;
}
4、完整数
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。如果一个数恰好等于它的因子之和,则称该数为“完全数”。
寻找完美的数
题目描述:所谓完美的数是这个数除了它自身之外,所有因子的和等于该数。
例如: 28,其因子包括:1,2,4,7,14,28,除了28之外,1+2+4+7+14 = 28
再例如:6,其因子包括:1,2,3,6 除了6之外,1+2+3 = 6
寻找 1~10000之间的完美的数。
法一、
#include<stdio.h>
int fun_perfect(int number)
{
int i,sum=0;
for(i=1;i<number;i++)
{
if(number%i==0){
sum+=i;
}
if(sum>number)
return 0;
}
return sum==number;
}
int main()
{
int i;
for(i=2;i<10000;i++)
{
if(fun_perfect(i))
printf("%d\n",i);
}
return 0;
}
法2、
#include<stdio.h>
#include<math.h>
int fun_perfect(int number)
{
int i,sum=1;
for(i=2;i*i<number;i++)
{
if(number%i==0)
{
sum+=i;
if(i*i!=number)
{
sum+=number/i;
}
}
}
return sum==number;
}
int main()
{
int i;
for(i=2;i<100000;i++)
{
if(fun_perfect(i))
printf("%d\n",i);
}
return 0;
}
法3、大数学家欧拉曾推算出完全数的获得公式:如果p是质数,且2p-1也是质数,那么(2p-1)X2^(p-1)便是一个完全数。
例如p=2,是一个质数,2p-1=3也是质数,(2p-1)X2^(p-1)=3X2=6,是完全数。
例如p=3,是一个质数,2p-1=7也是质数,(2p-1)X2^(p-1)=7X4=28,是完全数。
例如p=5,是一个质数,2p-1=31也是质数,(2p-1)X2^(p-1)=31X16=496是完全数。
但是2p-1什么条件下才是质数呢?事实上,当2p-1是质数的时候,称其为梅森素数。到2013年2月6日为止,人类只发现了48个梅森素数,较小的有3、7、31、127等。
程序代码如下:
#include<stdio.h>
#include<math.h>
int main()
{
int arr[5]={2,3,5,7,11};
for(int i=0;i<5;i++)
{
int num=pow(2,arr[i]-1)*(pow(2,arr[i])-1);
if(num<100000){
printf("%d\n",num);
}
}
return 0;
}
七、结构体
1、7-1 时间换算
本题要求编写程序,以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>
struct time
{
int hour;
int minute;
int second;
};
int main()
{
struct time time1;
time1.hour=0;
time1.minute=0;
time1.second=0;
int n;
scanf("%d:%d:%d %d",&time1.hour,&time1.minute,&time1.second,&n);
time1.second+=n;//a*=b+c 等价于 a=a*(b+c) ||time1.second+=n;等价于time1.second=time1.second+n;
if(time1.second>=60)
{
time1.minute++;
time1.second=time1.second-60;
}
if(time1.minute>=60)
{
time1.minute=time1.minute-60;
time1.hour++;
}
if(time1.hour>=24)
{
time1.hour=time1.hour-24;
}
printf("%02d:%02d:%02d",time1.hour,time1.minute,time1.second);//注意因为若出现了60-59=1,则输出将会为12:0:10
//%d:为普通的输出。
//%2d:按宽度为2输出,右对齐方式输出。若不够两位,左边补空格 ru 1 2 3
//%02d:同样宽度为2,右对齐方式。位数不够,左边补0。 ru010203
//%.2d:从执行效果来看,与%02d一样。 ru010203
return 0;
}
2、实验9-3 计算平均成绩 (15 分)
给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和成绩([0,100]区间内的整数),要求计算他们的平均成绩,并顺序输出平均线以下的学生名单。
输入格式:
输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩”,中间以空格分隔。
输出格式:
首先在一行中输出平均成绩,保留2位小数。然后按照输入顺序,每行输出一位平均线以下的学生的姓名和学号,间隔一个空格。
输入样例:
5
00001 zhang 70
00002 wang 80
00003 qian 90
10001 li 100
21987 chen 60
结尾无空行
输出样例:
80.00
zhang 00001
chen 21987
答案
#include<stdio.h>
#include<string.h>
//思路:构造学生结构体,结构体成员有学号(id),姓名(name),成绩(score),然后定义结构体数组,
// 用于存储每个学生的信息,然后通过引用结构体成员的成绩对结构体中的每一个数组元素进行操作。
struct student //构造学生结构体,即构造struct student这种数据类型
{
char id[6]; //学号,由于题目要求五个数字组成的字符串所以需要申请足够的内存空间
char name[11]; //姓名
float score; //成绩
};
int main()
{
struct student stu[10]; //定义结构体数组,用于存储每一个学生的学号、姓名、成绩
int i, N;
float sum = 0, average;
scanf("%d\n", &N);
for (i = 0; i < N; i++) //循环读入学生信息
{
scanf("%s%s%f", &stu[i].id, &stu[i].name, &stu[i].score);
sum += stu[i].score;
}
average = sum / N;
printf("%.2f\n", average);
for (i = 0; i<N; i++) //对学生成绩进行处理
{
if (stu[i].score < average)
{
printf("%s %s\n", stu[i].name, stu[i].id);
}
}
return 0;
}
3、7-4 复数四则运算
本题要求编写程序,计算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
答案
void print(double a,double b)
{
if(fabs(a)>=0.05)
{
printf("%.1lf",a);
if(fabs(b)<0.05)
{
printf("\n");
}
}
if(fabs(b)>=0.05)
{
if(b>0.0&&fabs(a)>=0.05)
{
printf("+");
}
printf("%.1lfi\n",b);
}
if(fabs(a)<0.05&&fabs(b)<0.05)
{
printf("0.0\n");
}
}
void prin(double a1,double b1,double a2,double b2,char ch)
{
printf("(%.1lf",a1);
if(b1>=0)
{
printf("+");
}
printf("%.1lfi)",b1);
printf(" %c ",ch);
printf("(%.1lf",a2);
if(b2>=0)
{
printf("+");
}
printf("%.1lfi) = ",b2);
}
int main()
{
double a1,b1,a2,b2;
scanf("%lf %lf %lf %lf",&a1,&b1,&a2,&b2);
double real,vir;
prin(a1,b1,a2,b2,'+');
real = a1 + a2;
vir = b1 + b2;
print(real,vir);
prin(a1,b1,a2,b2,'-');
real = a1 - a2;
vir = b1 - b2;
print(real,vir);
prin(a1,b1,a2,b2,'*');
real = a1*a2 - b1*b2;
vir = b1*a2 + a1*b2;
print(real,vir);
prin(a1,b1,a2,b2,'/');
real = (a1*a2 + b1*b2)/(a2*a2 + b2*b2);
vir = (b1*a2 - a1*b2)/(a2*a2 + b2*b2);
print(real,vir);
return 0;
}