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


    一、PTA实验作业

    题目1:计算职工工资

    1. 本题PTA提交列表

    2. 设计思路

      定义结构体变量 struct salary
                     {char name[999];
                     float base;float flo;float spent;} 
      定义人数N,i,并输入N;
      定义实发工资float sum[N]; 
      定义结构体变量 struct salary s[N];
      for(i=0;i<N;i++)
      输入s[i].base,s[i].flo,s[i].spent;
      for(i=0;i<N;i++)
      计算sum[i]= s[i].base+s[i].flo-s[i].spent;
      for (i=0;i<N;i++)
      输出s[i].name,sum[i] ; 
    

    3.代码截图

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

    一开始在定义基本工资和浮动工资的时候用了int型定义,导致结果出错,后面在输出总工资的时候忘记保留两位有效数字。

    题目2: 时间换算

    1. 本题PTA提交列表

    2. 设计思路

       定义结构体变量 struct time{
    	              int hour;int minute;int second;};
       定义结构体变量struct time t;
       定义加入时间  int n;
       输入t.hour,t.minute,t.second ;
       if(t.second+n>=60){//六十进一  
       t.second=t.second+n-60;t.minute+=1;
       if(t.minute>=60){//六十进一 
       t.minute=t.minute-60; t.hour+=1;
       if(t.hour>=24){//24小时为00时
       	t.hour=00;}}
       	输出t.hour,t.minute,t.second;} 
       else 输出t.hour,t.minute,t.second+n//没有进一的情况 
    

    3.代码截图

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

    忘了没有进一的情况,后面提交提示我,我没有考虑没有进一的情况。

    题目3:通讯录的录入与显示

    1. 本题PTA提交列表

    2. 设计思路

       定义结构体变量struct infor{
    	             char name[10];
    	             int year;
    	             int month;
    	             int day;
    	             char sex;
    	             char stand[99];
    	             char mobile[99];};
       定义N,i;输入人数N;
       定义结构体变量struct infor s[N];
       for(i=0;i<N;i++)   输入信息	;
       定义查询数量K,并输入k;定义q;
       for(i=0;i<K;i++)	  {
       输入q;	 
       if(q<0||q>=N) printf("Not Found
    ");
       else 输出s[q].name,s[q].stand,s[q].mobile,s[q].sex,s[q].year,s[q].month,s[q].day
    

    3.代码截图

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

    一开始在输出字符串%s%s中间没加空格,导致答案出错,后面发现输出日期时不能用%s,用%s一直过不了,后面用%d来定义年月日,然后就解决了问题。

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

    三、阅读代码

    1.运用指针来转置二维数组

    #include <stdio.h>  main()  
    {  
        int t,a[4][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6},{1,5,6,0}};  
        int (*p)[4],i,j,x;  
        p=a;  
        for (p;p<a+4;p++)  
        {  
            x=p-a;  //相当于i  
            for (j=x+1;j<4;j++)  
            {  
                t=*(*p+j);  //相当于t=a[i][j]  
                *(*p+j)=*(*(a+j)+x); //相当于a[i][j]=a[j][i]  
                *(*(a+j)+x)=t;    
            }  
        }  
            for (i=0;i<4;i++)  
            {  
                for (j=0;j<4;j++)  
                    printf("%d",a[i][j]);  
                printf("
    ");  
            }  
    }  
    

    这一题通过指针来对二维数组进行转置,他先将指针指向
    二维数组的地址,然后通过例如二维数组的方法来转置,
    也就形成了与二维数组一样的转置,指针的便捷在于可以
    优化代码,同时也可以比较容易找出错在哪里。

    2.实现学生信息输入,输出,查询

    #include<stdio.h>  
    #define NUM 3  
    //日期结构体  
    typedef struct{  
        int year;  
        int month;  
        int day;  
    }DATE;  
    //学生信息结构体  
    typedef struct{  
        int num;  
        char name[20];  
        DATE birthday;  
        char department[50];  
        char major[50];  
    }STUDENT;  
    //输入信息函数  
    void inputStudent(STUDENT[]);  
    //输出信息函数  
    void outputStudent(STUDENT[]);  
    //查询信息函数  
    void searchStudent(STUDENT[],DATE);  
    void main(){  
        STUDENT s[NUM];  
        DATE date;  
        inputStudent(s);  
        outputStudent(s);  
        printf("
     Enter a date(month,day) 
    ");  
        scanf("%d%d",&date.month,&date.day);  
        searchStudent(s,date);  
    }  
    void inputStudent(STUDENT s[]){  
        int i;  
        for(i=0;i<NUM;i++){  
            printf("
     Enter a student infomation 
    ");  
            s[i].num = i+1;  
            scanf("%s",&s[i].name);  
            scanf("%d%d%d",&s[i].birthday.year,&s[i].birthday.month,&s[i].birthday.day);  
            scanf("%s",&s[i].department);  
            scanf("%s",&s[i].major);  
        }  
    }  
    void outputStudent(STUDENT s[]){  
        int i;  
        printf("
     printf all student infomation");  
        for(i=0;i<NUM;i++){  
            printf("
    %4d%10s%8d%3d%3d%8s%8s",s[i].num,s[i].name,s[i].birthday.year,s[i].birthday.month,s[i].birthday.day,s[i].department,s[i].major);  
        }  
    }  
    void searchStudent(STUDENT s[], DATE date){  
        int i;  
        printf("
     searched in all student infomation");  
        for(i=0;i<NUM;i++){  
            if(s[i].birthday.month>date.month){  
                printf("
    %4d%10s%8d%3d%3d",s[i].num,s[i].name,s[i].birthday.year,s[i].birthday.month,s[i].birthday.day);  
                continue;  
            }  
            if(s[i].birthday.month==date.month && s[i].birthday.day>date.day){  
                printf("
    %4d%10s%8d%3d%3d",s[i].num,s[i].name,s[i].birthday.year,s[i].birthday.month,s[i].birthday.day);  
            }  
        }  
        printf("
    ");  
    }  
    

    本题运用结构体来输入查询学生的信息,结构体可以一次定义多个变量,
    本题调用了多个函数,如果每个函数都来定义新的变量的话,不利于储存
    和运用,这使得了有多级函数时使结构分明清晰,使主函数的语言较为
    直观,知道他的目的是什么,他是先void inputStudent(STUDENT s[])
    来输入学生信息,然后用void searchStudent(STUDENT s[], DATE date)
    函数来查询某个学生的信息,然后再用void outputStudent(STUDENT s[])
    函数输出学生信息,这是代码的可读性变得更高。

    四、本周学习总结

    1.总结本周学习内容。

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

    • 结构体:关键词:struct
      概念:结构体时一种构造数据类型
      用途:把不同类型的数据组合成一个整体
      内存:各成员所占内存空间的累加

    • 共用体:关键词:union
      构造数据类型,也叫联合体。
      用途: 使几个不同类型的数据共占一段内存(相互覆盖)

    • 枚举体:关键词:enum
      用途:列举所有选项
      举例:day = {Sunday,Monday,Tuesday,Wednesday,Thusday,Friday,Saturday};
      结尾有分号,如果个枚举常量没有赋值,则默认值为其下标(参考一维数组),比如此时Tuesday = 2

    递归函数原理

    递归就是子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法。
    (1)边界条件:确定递归到何时终止,也称为递归出口。
    (2)递归模式:大问题是如何分解为小问题的,也称为递归体。
    递归函数只有具备了这两个要素,才能在有限次计算后得出结果。
    一个递归函数的调用过程类似于多个函数的嵌套的调用,只不过调用函数和被调用函数是同一个函数。

    2.罗列本周一些错题。

  • 相关阅读:
    js利用原型对象实现继承--Es5实现的面向对象方式
    js的构造函数原型链
    回调函数
    箭头函数
    关于js的易错知识
    信息论--(1)
    计算机为什么需要反码,补码?
    windows+anaconda下载安装libelimg,学习图像处理
    spring boot + thymeleaf 3 国际化
    spring boot hello and docker
  • 原文地址:https://www.cnblogs.com/gongshunde/p/8065801.html
Copyright © 2020-2023  润新知