C语言博客作业--结构体

一、PTA实验作业

题目1:6-3 结构体数组中查找指定编号人员

1. 本题PTA提交列表(要提交列表,不是结果)

2. 设计思路(伪代码或流程图)

 传入结构体数组str 和要查找的人员num
      struct student *pos;
      for  pos=std to std+7
          if(strcmp(pos->num,num)==0)
         退出循环
         end for
          返回  *pos

3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)

4.本题调试过程碰到问题及PTA提交列表情况说明。

  • 运行输出非常奇怪,都输不出数字。
  • 解决办法:我本来以为是我的结构体不熟悉指针指向错了,所以就把->改成 . 但是还是不对。我本来是判断他们地址相同,后来以为是这里错了,就改成用值来判断,结果连运行都过不去。最后是去请教了同学才知道这个题目确实就和我一开始写的那样,但是在判断时要用库函数,所以后来我就用了库函数strcmp来判断两个字符串是否相等,后来就正确了。

题目2:7-1 计算职工工资

1. 本题PTA提交列表(要提交列表,不是结果)

2. 设计思路(伪代码或流程图)

  struct worker{
	char name[10];
	float jiben, fudong,zhichu,shifa;
};//该结构体表示职工姓名、基本工资、浮动工资、支出和实发工资
    struct worker workers[1000]; 循环变量i,员工个数number
     输入员工个数
      for  i=0  to number
      输入职工姓名、基本工资、浮动工资、支出
      计算实发工资=基本工资+浮动工资-支出
      end for
       for  i=0  to number
       输出 姓名 实发工资
      end for

3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)

4.本题调试过程碰到问题及PTA提交列表情况说明。

  • 1.一直编译错误,可是又找不出来错在哪里,devc上错误语句提示在输入员工信息那一句,可是我反复检查也没发现有语法错误。
  • 解决办法:实在是找不到错在了哪里,所以我后来就再回去看了一遍课本,看看他们的程序都是怎么编写的。最后我发现每个程序都是在主函数之前有定义一个结构体,然后主函数中又再定义了一个结构体,所以我就回去在我的程序中再定义一个结构体,之后果然就可以运行了。
  • 2.可以运行之后,运行出来的答案不对,无法计算出正确结果,一直输出0.00
  • 解决办法:反复检查后发现数据类型定义不对,我将员工的工资都定义成了int
  • 3.输出和pta一模一样,就是不正确
  • 解决办法:一开始以为是格式不对,所以就让输出数据对齐,可是也不对,最后检查了好久才知道我定义的是float型数据,可是输入输出都是用%lf,后来改回%f就正确了,也不用控制格式。

题目3:7-2 时间换算

1. 本题PTA提交列表(要提交列表,不是结果)

2. 设计思路(伪代码或流程图)

struct time{
	int hour,minute,second;
};
   struct time times;要输入的秒数number;
   输入number
   如果number+times.second>60{
           秒-60; 分+1
           分>60 ;   分-60;小时+1;
          小时==24   小时-24}
     else  秒+number

3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)

4.本题调试过程碰到问题及PTA提交列表情况说明。

  • 这题刚开始没想到那么多,就是调出来示例就提交了pta,结果基本都是错的。
  • 解决办法:这个题目其实也不难,但是就有点麻烦,有很多种情况需要考虑进去,我一开始是将小时分钟和秒一起输出,后来发现这样有问题,因为有可能计算后的时、分、秒得到个位数,这样就要加0,所以我又分情况讨论什么时候要加0,发现这样也很麻烦,最后才想到可以通过控制格式来自动补0,,,,,所以在输出时输出%0d就可以了。

二、截图本周题目集的PTA最后排名。

三、阅读代码

时间换算本题要求编写程序,以hh:mm:ss的格式输出某给定时间再过n秒后的时间值(超过23:59:59就从0点开始计时)。

  • 这是本次pta的题目,我自己的做法是看到了题目要求里要输入的n必须小于60,所以用输入的n与秒相加如果和大于60再讨论进位,小时那边依次类推,这样的做法虽然在pta上可以通过但是很不严谨。这个做法运用了循环,就是将输入的n分成n次与秒相加,大于六十就进位,然后在进入下一语句再次讨论进位。这样的做法严谨多了,而且简单,据考虑是不是需要进位就行了,不像我的程序还要单独考虑许多临界条件,很值得我学习借鉴。

将s所指字符串的正序和反序进行连接,形成一个新串放在t所指的数组中

  • 这一题因为使用了strcpy和strlen函数使得整个题目简单了不少,我最想学习的是题目中逆序输出的方法。我之前做逆序输出都是定义一个新数组来存放原数组的所有内容然后再用循环将新数组逆序输出。这个题目并不像我那种做法,确实用到了另一个数组但是逆序输出时t[d + i] = s[d-i-1];就解决了逆序输出和构造新数组输出两个问题,简单多了,之后会学着使用这种办法来写的。

四、本周学习总结

1.总结本周学习内容。

1.结构体、共用体、枚举这种构造数据类型特点。

1.结构体和数组一样都是构造型数据类型,和数组不同的是,结构体可以处理不同类型的数据。结构体里还可以有结构体类型、共用体的类型的数据。

2.共用体是一种多变量共享存储空间的构造类型,它允许几种不同的变量共用同一存储空间。共用体和结构体的区别:

  • 1.结构体每一位成员都用来表示一种具体事务的属性,共用体成员可以表示多种属性(同一存储空间可以存储不同类型的数据)。
  • 2.结构体总空间大小,等于各成员总长度,共用体空间等于最大成员占据的空间。
  • 3.共用体不能赋初值

枚举类型是指变量的值可以全部列出,定义一个枚举变量后,变量的值确定在定义之中。它和结构体、共用体的区别在于,枚举元素是常量,只能在定义阶段赋值。

2.递归函数原理

  • 递归的原理,其实就是一个栈(stack), 比如求5的阶乘,要知道5的阶乘,就要知道4的阶乘,4又要是到3的,以此类推,所以递归式就先把5的阶乘表示入栈, 在把4的入栈,直到最后一个,之后呢在从1开始出栈, 看起来很麻烦,确实很麻烦,他的好处就是写起代码来,十分的快,而且代码简洁,其他就没什么好处了,运行效率出奇的慢.

本周学习了递归函数,递归在计算一些比较直观的数学方程式的时候比较好用,因为很接近人类思维方式,可以简单的写出程序语句,在某些题目方面也比较实用就像汉诺塔问题,用递归很好解决,用其他方法到不好做,但是汉诺塔那个程序到底是怎么运行的还是弄不太明白,我个人感觉递归在运算的时候有点难改正,因为要先一级级调用函数在一级级返回。

2.罗列本周一些错题。

课堂派结构体程序改错题

  • 输入一个正整数n(3<=n<=10),再输入n个雇员的信息(如下表所示),输出每人的姓名和实发工资(基本工资+浮动工资-支出)。
#include<stdio.h>
int main()
{  
    struct emp
    {  
         char name[10];
         float jbg;
         float fdg;
         float zc;

     };
    int i,n;
    printf(“n=”);
    scanf(“%d”,&n);
    for(i=0;i<n;i++)
         scanf(“%s%d%d%d”,emp[i].name,emp[i].&jbg,emp[i].&fdg,emp[i],&zc);
    for(i=0;i<n;i++)
         printf(“%5s实发工资:%d\n”, emp[i].name,emp[i].zc);
    return 0;
}
  • 当时老师已经上过结构体的课了,但是我对结构体的许多知识都还是一知半解,感觉懂了一点,但当写起题目来就发现自己还有太多东西不会。
  • 第一个改正的地方是结构体没有定义变量名,所以应该在结构体的最后加上定义emp[10]。第二个改正的地方是在scanf后面加上getchar来吸收输入的回车符。第三个改正的地方是结构体变量定义的是单精度浮点型,输入却用了%d,所以应该改成%f。第四点改正的是在输入结构体变量后加上getchar来吸收输入的回车符。第五点改正是程序中没有计算实发工资得语句输出实发工资的单位也错了,所以最后的printf语句应该改为printf("%5s实发工资:%7.2f\n", emp[i].name,emp[i]. jbg+emp[i]. fdg-emp[i].zc);
posted @ 2017-12-24 21:58  晗光凡影  阅读(983)  评论(0编辑  收藏  举报