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
第二空没填对体现了自己对函数的形参理解还不够

posted @ 2017-12-24 22:52  hoppp  阅读(1006)  评论(3编辑  收藏  举报