结构
一、PTA实验作业(5分)
题目1:计算两个复数之积
1. 本题PTA提交列表(要提交列表,不是结果)
2. 设计思路(伪代码或流程图)
struct complex{
int real;
int imag;
};//该结构体表示复数的实部和虚部
struct complex multiply(struct complex x, struct complex y){
定义变量product用于存放一个结构体变量以便返回
product.real=x.realy.real-x.imagy.imag;//计算实数
product.imag=x.realy.imag+x.imagy.real;//计算虚数
返回product至主函数;
}
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
1.该题中的product要自己定义,不能直接利用主函数中的变量,因为没有传过来
2.实数的运算应该还要减去虚数乘以虚数的数字部分
题目2: 有理数比较
1. 本题PTA提交列表(要提交列表,不是结果)
2. 设计思路(伪代码或流程图)
struct number{
float kid,mother;
}a1,a2;//该结构体表示一个分数的kid(分子)和mother(分母)
输入a1的分子和分母
输出a1(分子/分母)
定义单浮点变量one,two
one=a1.kid/a1.mother;
two=a2.kid/a2.mother;
如果one和two大小相等 输出=;
如果one大于two 输出>;
如果one小于two 输出<;
输出a2(分子/分母)
}
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
1.大于和小于弄反了
2.分子分母要定义浮点型,同时one、two忘了用浮点
题目3: 计算职工工资
1. 本题PTA提交列表(要提交列表,不是结果)
2. 设计思路(伪代码或流程图)
struct worker{
char name[10];
float basic,floats,payment;
float realmoney;
};//该结构体用于存放基本工资,浮动工资,支出工资和实际工资以及员工名字
定义计算实际工资的函数 calc(struct worker *p,int n);
int main(){
定义n存放员工人数;
输入n;
struct worker worker_s[n];
i定义i=0用于循环
for i=0 to i=n-1
scanf("%s",worker_s[i].name);
scanf("%f",&worker_s[i].basic);
scanf("%f",&worker_s[i].floats);
scanf("%f",&worker_s[i].payment);
end for
调用函数calc(worker_s,n);
for i=0 to i=n-1
printf("%s ",worker_s[i].name);
printf("%.2f\n",worker_s[i].realmoney);
end for
}
函数:float calc(struct worker *p,int n){
定义i用于循环
for i=0 to i=n-1
(*(p+i)).realmoney=(*(p+i)).basic+(*(p+i)).floats-(*(p+i)).payment;
end for
}
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
1.指针*(p+i)外面还需要一个括号,多次漏掉
2.工资要保留小数,忘记了
二、截图本周题目集的PTA最后排名。
三、阅读代码
题目1:N个人围成一圈,然后给一个数字M,每次数到M的自杀,问最后自杀的人是谁
#include<iostream>
using namespace std;
int main()
{
int N;//人的总个数
int M;//间隔多少个人
cin>>N;
cin>>M;
bool *p=new bool[N+1];//[1……N]为true表示此人还活着
for (int i=1; i <= N; i++)
*(p+i)=true;
int count=0;//统计自杀的人数
for (int i=1, j=0; ;i++)//i用来表示循环,j用来计算是不是第N个人
{
if (*(p+i))//此人还活着
{
j++;
if (j == M)
{
*(p+i)=false;
j=0;
count++;//统计自杀的人
}
if (count == N)
{
cout<<"最后自杀的人是:"<<i<<endl;
break;
}
}
if(i == N)
i=0;
}
delete []p;
return 0;
}
点评:这是目前还不理解的约瑟夫环模型,先让所有人都是ture,然后从i=0开始数,数到M后这个人挂了,令j++,count,接下去数,知道count=N,即死去的人等于总人数时,跳出,找到最后一个人
题目2:有黑白棋子各有N个(分别用*和O代替),按下图方式排列
***...***OOO...OOO
N个黑棋 N个白棋
允许将相邻两个棋子互换位置,最后使队形成黑白交替排列,试编程实现该操作。
#include<stdio.h>
#define MAX 20
char state[MAX*2+1];
void Move(int start, int end)
{
while( end > start )
{
int tmp = state[end];
state[end] = state[end-1];
state[end-1] = tmp;
puts(state);
--end;
}
}
int Solve(int n)
{
int i;
puts(state);
for(i=1;i<n;++i)
Move(i*2-1,n+i-1);
}
int main(void)
{
int i,n;
scanf("%d",&n);
for(i=0;i<n;++i)
state[i] = '*';
for(i=n;i<n*2;++i)
state[i] = '0';
state[i] = '/0';
Solve(n);
}
运行结果
点评:本题利用两个函数,一个MOVE:把第end位置的棋子交换到第start位置,其他棋子依次向后移动一个位置,一个Solve:用于调用MOVE的一个函数,实现了黑白颠倒的功能,如果将这些代码全部放在主函数中就会很乱,很难写,而放在函数中则十分清晰。
四、本周学习总结(1分)
1.总结本周学习内容。
1.1 什么是结构体
结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合
1.2定义一个结构的一般形式为:
struct 结构名
{
成员表列
};
使用时可以在上面分号前面加变量,也可以在函数内在定义
1.3注意事项
要加分号
1.4结构体和枚举区别
枚举类型默认为是int类型,并默认为从0,1,2,3...递增排序,也可为属性赋值,也可改变枚举类型的int类型
1.5结构体和联合
结构体来存放一组不同类型的数据,联合是共用一个共用体
1.6递归函数原理
递归就是函数直接调用自己或通过一系列调用语句间接调用自己
2.罗列本周一些错题
错误点:getchar没写出来。
答案:
错误点:数据有不同类型没答出来