超星高级语言程序设计实验作业
实验07 结构体与文件
注:以下内容仅供交流,代码都是本人自己写的,还请同学们先自己编写再进行交流。
快期末了😅有点忙,就先不写注释了
1.复数运算
题目描述:复数可以写成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 num{
float x;
float y;
}a[2];
void add(struct num*p1,struct num*p2) {
printf("%.2f", p1->x + p2->x);
if ((p1->y + p2->y) == 0)
printf(" ");
else if((p1->y + p2->y )>0)
printf("+%.2fi ", p1->y + p2->y);
else printf("%.2fi ", p1->y + p2->y);
}
void J(struct num* p1, struct num* p2) {
printf("%.2f", p1->x - p2->x);
if ((p1->y - p2->y) == 0)
printf(" ");
else if ((p1->y -p2->y) > 0)
printf("+%.2fi ", p1->y - p2->y);
else printf("%.2fi ", p1->y - p2->y);
}
void C(struct num* p1, struct num* p2) {
printf("%.2f", p1->x * p2->x - p1->y * p2->y);
if ((p1->x * p2->y + p1->y * p2->x) == 0);
else if ((p1->x * p2->y + p1->y * p2->x) > 0)
printf("+%.2fi", (p1->x *p2->y + p1->y * p2->x));
else printf("%.2fi", (p1->x * p2->y + p1->y * p2->x));
}
int main() {
scanf_s("%f%f%f%f",&a[0].x,&a[0].y,&a[1].x,&a[1].y);
add(&a[0], &a[1]);
J(&a[0], &a[1]);
C(&a[0], &a[1]);
return 0;
}
2.构造一个表示教师的结构体(包含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
#include <stdio.h>
struct num{
char name[21];
int sex;
int age;
}x[10];
void W(int n) {
scanf_s("%s", &x[n].name,sizeof(x[n].name));
scanf_s("%d", &x[n].sex);
scanf_s("%d", &x[n].age);
}
void R(int n) {
printf("%s ", x[n].name);
if (x[n].sex) printf("Male ");
else printf("Female ");
printf("%d ", x[n].age);
}
int main() {
int n,i;
scanf_s("%d",&n);
for (i = 0; i < n; i++) {
W(i);
}
R(n / 2);
return 0;
}
实验08 结构化程序设计
1.正整数分解
题目描述:正整数n,按第一项递减的顺序依次输出其和等于n的所有不增的正整数和式。
输入:一个正整数n(0<n≤15)。
输出:每行输出如样例所示,和等于n的不增正整数和式,数字和运算符间无符号,最后一行结尾有一个回车换行符。
样例:
输入:
4
输出:
4=3+1
4=2+2
4=2+1+1
4=1+1+1+1
#include<stdio.h>
int a[15], keep;
void dfs(int m, int c, int n) {
if (!m) {
printf("%d=", n);
for (int i = 0; i < keep-1; i++){
printf("%d+", a[i]);
}
printf("%d\n", a[keep-1]);
return;
}
for (int i = c; i>0; i--){
a[keep++] = i;
if (m-i >= 0) dfs(m - i,i, n);
keep--;
}
return;
}
int main() {
int n;
scanf_s("%d", &n);
dfs(n, n - 1, n);
return 0;
}
这个题属实离谱…
2.N皇后问题
题目描述:
八皇后问题由高斯(C. F. Gauss)最早在1850年提出并研究,但并未完全解决。N皇后问题指在一个N×N的棋盘上放置N个皇后,使任意两个皇后都不能互相攻击。按国际象棋规则,两个皇后,若在同一行上,或在同一列上, 或在同一条斜线上, 则她们可以互相攻击。下图即满足八皇后条件的一种棋局。
编写程序给出满足条件的棋局数目。
输入:一个正整数N(0<N≤13)输出:棋局数目
样例1:
输入:
2
输出:
0
样例2:
输入:
8
输出:
92
#include<stdio.h>
int a[14],N,m,out;
bool check(int n);
void change(void);
void extend(void);
int main() {
scanf_s("%d", &N);
a[0] = 0; a[1] = 1; m = 1;
while (m > 0) {
if (check(m)) {
if (m == N) {
out++; change();
}
else {
extend();
}
}
else {
change();
}
}
printf("%d", out);
return 0;
}
void change(void) {
while (a[m]==N)m--;
a[m]++;
}
void extend(void) {
m++;
a[m] = 1;
}
bool check(int n) {
int i;
for (i = 1; i <n; i++) {
if(a[n]==a[i]) return false;
if(a[n]-n==a[i]-i) return false;
if(a[n]+n==a[i]+i)return false;
}
return true;
}
3.
第三题属实难😱我就不放了 (我的也是抄别人的)
老师发了一个视频讲解,大家自己看吧😁
4.Debruijn问题
题目描述:
如图所示由2^3 个二进制数字0和1组成一个环。使 2^3 个 3 位的二进制数正好在环中各出现一次。图中目前所示顺序是:0、1、2、5、3、7、6、4。设计生成这样环的程序,环由 2^n 个二进制数字组成,恰好包含 2^n 个互不相同的n位二进制数。
输入:n(n<=4)
输出:按照字典序输出符合的答案(当出现多组本质不同的解时,仅输出字典序中最小的那个序列);每行数字间以一个西文空格间隔,行末有一个换行符。
样例1:
输入:
3
输出:
0 0 0 1 0 1 1 1
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int N, A[17], B[17];
bool judge(int i, int n);
void put(int r, int n);
void out(void);
int main() {
int n;
scanf_s("%d", &n);
N = pow((double)2, n);
for (int i = 0; i <= 16; i++) {
A[i] = -1;
}
put(N, n);
return 0;
}
void put(int r, int n) {
int i;
for (i = 1; i <= N; i++) {
A[N - r + 1]++;
if (A[N - r + 1] > 1) {
A[N - r + 1] = -1;
return;
}
if (judge(N - r + 1, n)) {
if (r > 1) put(r - 1, n);
else out();
}
}
}
void out(void) {
int i;
for ( i = 1; i < N; i++){
printf("%d ", A[i]);
}
printf("%d\n", A[N]);
exit(0);
}
bool judge(int i, int n) {
int x;
if (i < n) return true;
i = i - n+1;
if (i == 1) {
B[i] = 0;
for (int j = i; j < i + n; j++) {
B[i] = B[i] * 2 + A[j];
}
return true;
}
else if (i < N - n+1) {
B[i] = 0;
for (int j = i; j < i + n; j++) {
B[i] = B[i] * 2 + A[j];
if (j <= N);
else j = j % N;
}
for (int j = i - 1; j > 0; j--) {
if (B[i] == B[j])return false;
}
return true;
}
else if (i == N - n+1) {
for ( ; i <= N; i++){
x = 0;
B[i] = 0;
for (int j = i;x<n; j++) {
if (j <= N);
else j = j % N;
B[i] = B[i] * 2 + A[j];
x++;
}
for (int j = i - 1; j > 0; j--) {
if (B[i] == B[j]) return false;
}
}
return true;
}
}