C语言博客作业--结构体
一、PTA实验作业
题目1:6-3 结构体数组中查找指定编号人员
1. 本题PTA提交列表
2. 设计思路
定义结构体变量q,循环变量i
for i=0 to i<N-1
判断要查询的编号是否存在
如果存在,赋值给q,结束循环
end for
返回结构体变量q
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
刚开始不太理解返回空串要怎么弄,写了return NULL,后来发现这样是错误的。不用考虑这个,直接ruturn p就可以了
题目2:7-1 计算职工工资
1. 本题PTA提交列表
2. 设计思路
职员信息结构定义
定义整型变量i用于循环,n代表有几位职员
输入n的值
定义结构体数组salarys[n]
for i=0 to i<n
录入职员信息,并计算出实发工资是多少
end for
for i=0 to i<n
输出每位职员的实发工资
end for
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
基本工资、浮动工资和支出都定义成整型的,只有实发工资是浮点型的,题目看的不够认真
题目3:7-6 通讯录的录入与显示
1. 本题PTA提交列表
2. 设计思路
通讯录信息结构定义
定义整型变量i、j用于循环,n表示有几个通讯录好友,k表示要查询的次数,num表示要查询的编号
输入n的值
定义结构体数组list[n]
for i=0 to i<n
录入通讯录好友信息
end for
输入k的值
for i=0 to i<k
输入num的值
如果num大于等于0并且小于n
for j=0 to j<n
如果要查询的编号存在,输出该条记录
end for
否则输出Not Found
end for
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
最初将生日也定义成字符型的,但是只有部分正确,询问同学后改成整型的就可以了,但是还是有点不懂为什么字符型的不可以
电话号码和手机号码定义的时候,数组长度不够大
二、截图本周题目集的PTA最后排名。
三、阅读代码
#include <stdio.h>
int fibonaci(int i)
{
if(i == 0)
{
return 0;
}
if(i == 1)
{
return 1;
}
return fibonaci(i-1) + fibonaci(i-2);
}
int main()
{
int i;
for (i = 0; i < 10; i++)
{
printf("%d\t\n", fibonaci(i));
}
return 0;
}
这里用的是递归这种方法,代码很简洁,但是如果要计算的数比较大的话,调用的次数就很多。有优点也有缺点。
#include <stdio.h>
int main()
{
int N,a[50],i;
char b[50][100];
int j;
scanf("%d",&N);
for(i=0; i<N; i++)
{
scanf("%d",&a[i]);
scanf("%s",&b[i]);
}
for(i=0; i<N; i++)
{
for(j=N-1; j>=0; j--)
{
if(a[i]!=a[j]&&a[i]<=1&&a[j]<=1)
{
a[i]=2;///等于2是因为男生是1,女生是0.等于2再搭配上面的条件就可以把已经比较了的排除
a[j]=2;
printf("%s %s\n",b[i],b[j]);
break;
}
}
}
return 0;
}
这题是考试时候的题目,考试的时候,对于如何实现配对的很懵逼,匹配后怎么排除它们也不知道要如何实现,后来上网查了之后,发现跟上次报数的题目有点类似,都是给它再重新赋值,这类题目自己平时接触的不够多,考试的时候脑子没转过弯来。
四、本周学习总结
1.总结本周学习内容。
结构体:
结构体可以处理不同类型的数据。结构体每一位成员都用来表示一种具体事务的属性。结构体总空间大小,等于各成员总长度
struct 结构名 {
类型名 结构成员名1;
类型名 结构成员名2;
···
类型名 结构成员名n;
};
共用体:
共用体是一种多变量共享存储空间的构造类型,它允许几种不同的变量共用同一存储空间。共用体成员可以表示多种属性(同一存储空间可以存储不同类型的数据)。共用体空间等于最大成员占据的空间。共用体常用来节省内存。
union 共用体名
{ 成员表列
}变量表列;
union uarea
{
char c_data;
short s_data;
long l_data;
}
枚举:
若一个变量只有几种可能的值,可以定义为枚举类型。将变量的值一一列举出来,变量的值只限于列举出来的值的范围内
enum weekday{sun,mon,tue,wed,thu,fri,sat};
enum weekday,week_end;
同时定义类型和变量
enum weekday{sun,mon,tue,wed,thu,fri,sat}
workday,week_end;
枚举元素为常量,sun、mon...sat的值依次为0、1...7
递归函数原理
递归就是子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法。
递归通常用来解决结构自相似的问题。所谓结构自相似,是指构成原问题的子问题与原问题在结构上相似,可以用类似的方法解决。具体地,整个问题的解决,可以分为两部分:第一部分是一些特殊情况,有直接的解法;第二部分与原问题相似,但比原问题的规模小。实际上,递归是把一个不能或不好解决的大问题转化为一个或几个小问题,再把这些小问题进一步分解成更小的问题,直至每个小问题都可以直接解决。因此,递归有两个基本要素:
(1)边界条件:确定递归到何时终止,也称为递归出口。
(2)递归模式:大问题是如何分解为小问题的,也称为递归体。递归函数只有具备了这两个要素,才能在有限次计算后得出结果
在递归函数中,调用函数和被调用函数是同一个函数,需要注意的是递归函数的调用层次,如果把调用递归函数的主函数称为第0层,进入函数后,首次递归调用自身称为第1层调用;从第i层递归调用自身称为第i+1层。反之,退出第i+1层调用应该返回第i层。
2.罗列本周一些错题。
线性表用顺序实现。请填空写一个求线性表L 中所有奇数之和的算法。
例如:
L=(1,2,3,4,5) 其和为 9(本题结构体定义很不错。)
#include <stdio.h>
#define N 10
typedef struct sqlist
{
int data[N];
int last;
}LIST;
int Total(List list)
{
return sum;
}
void Show(LIST list)
{
int i;
for(i=0;i<=list.last;i++)
printf("%3d", list.data[i]);
printf("\n");
}
int main()
{
LIST list;
int i,sum;
for(i=0;i<=5;i++)
list.data[i]=i;
list.last=5;
Show(list);
sum=Total(list);
printf("sum=%3d\n",sum);
return 0;
}
参考答案
int sum=0;
for(int i=0;i<=list.last;i++)
if(list.data[i]%2)
sum+=list.data[i];
我的作答
int sum=0,i;
for(i=0;i<5;i++)
if(list.data[i]%2!=0)
sum=sum+list.data[i];
sum=sum+list.last;
做题的时候没充分理解list.last表示的到底是什么,导致理解有偏差
程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。
函数fun的功能是将形参a所指结构体变量s中的数据进行修改,并把a中地址作为函数值返回主函数,在主函数中输出修改后的数据。
例如:a所指变量s中的学号、姓名、和三门课的成绩依次是:
10001、" ZhangSan "、95、80、88,
修改后输出t中的数据应为:10002、"LiSi "、96、81、89。
注意:按照顺序填代码,不要带编号1,2,3,4。空格或回车隔开。
#include <stdio.h>
#include <string.h>
struct student {
long sno;
char name[10];
float score[3];
};
______2__________ Modif(struct student *p)
{
int i;
p->sno = 10002;
strcpy(p->name, "LiSi");
for (i=0; i<3; i++)
______3_______++;
return _____4________;
}
void main()
{
struct student s={10001,"ZhangSan", 95, 80, 88}, *t;
int i;
printf("\n\nThe original data :\n");
printf("\nNo: %ld Name: %s\nScores: ",s.sno, s.name);
for (i=0; i<3; i++)
printf("%6.2f ", ___1____);
printf("\n");
t = Modif(&s);
printf("\nThe data after modified :\n");
printf("\nNo: %ld Name: %s\nScores: ",t->sno, t->name);
for (i=0; i<3; i++)
printf("%6.2f ", t->score[i]);
return 0;
}
参考答案
s.score[i]
struct student *
p->score[i]
p
我的作答
s.score[i]
struct student
p->score[i]
p
第二空没填对体现了自己对函数的形参理解还不够