请同学们先看提示,自行思考实践后无果再看通过代码。学习不要欺骗自己!!!
欢迎校友+q3023225096进行讨论交流
1. 提示:struct和int一样也可以用来定义函数,只不过返回结构体类型
题目编号 :Exp07-Basic01
题目名称:复数运算
题目描述:复数可以写成A+Bi的常规形式,其中A是实部,B是虚部,i是虚数单位,满足i^2=-1。
编写程序,分别计算两个复数的和、差、积。
输入:在一行中依次给出两个复数的实部和虚部,数字间以一个西文空格分隔。
输出:一行中按照A+Bi的格式输出两虚数的和、差、积,实部和虚部均保留2位小数;
如果B是负数,则应该写成A-|B|i的形式;如果B是零则不输出虚部;结果间以4个西文空格间隔。
样例1:
输入: 2.3 3.5 5.2 0.4
输出: 7.50+3.90i -2.90+3.10i 10.56+19.12i
样例2:
输入: 3.3 4.5 3.3 -4.5
输出: 6.60 0.00+9.00i 31.14
这道题很好,覆盖了结构体的最基本的用法,建议细品,做出来你结构体基本就通了
#include<stdio.h>
struct complex //结构体定义
{
float real;
float imag;
};
struct complex add(struct complex c1, struct complex c2); //结构体类函数声明
struct complex subtract(struct complex c1, struct complex c2); //函数定义在主函数后面
struct complex multiply(struct complex c1, struct complex c2);
void complexprint(struct complex c);
int main() //主函数
{
float r1, i1, r2, i2;
scanf("%f%f%f%f", &r1, &i1, &r2, &i2);
struct complex c1 = { r1,i1 }, c2 = { r2,i2 }; //结构体声明
complexprint(add(c1, c2)); printf(" ");
complexprint(subtract(c1, c2)); printf(" "); //间隔打四个空格控制格式
complexprint(multiply(c1, c2));
}
void complexprint(struct complex c) //输出功能函数定义
{ //三种情况分开输出
if (c.imag > 0) printf("%.2f+%.2fi", c.real, c.imag);
else if (c.imag < 0) printf("%.2f%.2fi", c.real, c.imag);
else printf("%.2f", c.real);
}
struct complex add(struct complex c1, struct complex c2) //加法功能函数定义
{
struct complex result; //result作为形参,否则超星报错,尽管本地通过
result.real = c1.real + c2.real; //比如在主函数中声明或全局声明
result.imag = c1.imag + c2.imag; //这导致result数据不断被覆盖
return result;
}
struct complex subtract(struct complex c1, struct complex c2) //减法功能函数定义
{
struct complex result;
result.real = c1.real - c2.real;
result.imag = c1.imag - c2.imag;
return result;
}
struct complex multiply(struct complex c1, struct complex c2) //乘法功能函数定义
{
struct complex result;
result.real = c1.real * c2.real- c1.imag * c2.imag;
result.imag = c1.real * c2.imag + c2.real * c1.imag;
return result;
}
2. 提示:关键在于如何处理输入的数据
【计2016级期末试题】构造一个表示教师的结构体(包含3个字段:姓名、性别、年龄),编写函数,读入n个教师的信息,存入一个结构体数组中(如下图所示)。最后输出第n/2个教师的信息。
例如:一个教师的信息为zhangsan、false、50,另一个教师的信息为lisi、false、37。
输入:依次输入一个正整数n及n个教师的姓名、性别、年龄。(说明:n不大于10;姓名长度不超过20个英文字符;性别输入0/1表示女/男)。
输出:数组下标为n/2的教师信息。(说明:n/2直接截取整数,不进行四舍五入;性别输出Female/Male表示女/男;每个数据后均有1个空格)。
样例1:
输入:1 zhangsan 0 50
输出:zhangsan Female 50
样例2:
输入:4 zhangsan 0 50 lisi 1 28 wangwu 0 30 zhaoliu 1 34
输出:wangwu Female 30
样例3:
输入:5 zhangsan 0 50 lisi 1 28 wumei 0 30 zhaoliu 1 34 wangermazi 1 18
输出:wumei Female 30
我承认我这道题卡bug了,直接把目标数据之外的全都舍弃(滑稽)。原题考链表,改编后简化了,有时间的话可以当做链表入门题
#include<stdio.h>
struct teacher
{
char name[21];
int gender;
int age;
}c; //同时进行结构体的定义和声明
void output(struct teacher c);
int main()
{
int n = getchar() - '0';
for (int i = 0; i < n / 2 + 1; i++) //投机取巧
scanf(" %s %d %d", &c.name, &c.gender, &c.age);
output(c);
return 0;
}
void output(struct teacher c)
{
printf("%s ", c.name);
if (c.gender == 0) printf("Female ");
else printf("Male ");
printf("%d", c.age);
}