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


    一、PTA实验作业

    题目1:6-4 结构体数组按总分排序

    1. 本题PTA提交列表

    2. 设计思路

    void calc 函数部分(计算每位同学成绩总和) 
         i=0;
    	 for  i to  n-1 
    	   总成绩=三科成绩总和
    	end;
    void sort 函数部分 (通过比较每位同学成绩总和,对同学进行排序)	
    	   定义 i,j;
    	    定义结构变量 temp 
    	    for i=1 to n
    		   for j=0  to n-i 
    		   利用冒泡排序将同学的总分的从大到小排序
    	end;
    

    3.代码截图

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

    计算总和时直接用sum=sum+score[i],发现运行后总和数并没有相加,是要用结构指针间接访问结构变量,后来改为p+i)->sum=(p+i)->score[0]+(p+i)->score[1]+(p+i)->score[2]可以计算成绩总和;开始时是用选择排序法,但发现发现过于复杂,后来换用冒泡排序,简单

    题目2:7-5 有理数比较

    1. 本题PTA提交列表

    2. 设计思路

       定义结构变量;
          int flag;
    	  char ch;
    	  输入这两个有理数number1,number2 
    	  flag=number1.fenzi*number2.fenmu-number2.fenzi*number1.fenmu
    	  判断flag的大小,从而确定ch的值
    	   如若flag>0
    	     ch='>';
    		若flag<0
    		 ch='<'
    		否则
    		  ch='='	  
        输出两个有理数比较后的结果		  
    	end	  
    

    3.代码截图

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

    开始时直接用两有理数相减,但发现分子,分母都是整型范围内整数,相除后不会保留小数;后来定义结构变量,分别定义分子,分母和分号;
    再根据两有理数分子,分母的关系,判断ch的值就可以了

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

    1. 本题PTA提交列表

    2. 设计思路

    定义结构变量
         定义结构变量表 
    	输入n
    	for i=0  to  n-1 
    	  输入姓名 生日 性别 固话 手机  
    	输入k
    	for  i=0  to  k-1 
    	     输入查找编号num[i]
    	判断num[i]是否在0~10之间,若在,则输出相应的人员信息
    	若不在,则输出Not Found	 
    

    3.代码截图

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

    这题部分正确的原因是输出错误,与原题要求的输出符号错了,其他没什么

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

    三、阅读代码

    报数游戏
    #include <stdio.h>
         struct ele{
             int no;
           struct ele *link;
      }
    main()
    {
                int n,m,i;
               struct ele *h,*u,*p;
               clrscr();
                 printf("Please input n&m:
    ");
                   scanf("%d%d",&n,&m);/*输入n和m*/
                h=u=(struct ele *)malloc(sizeof(struct ele));/*形成首表元*/
                  h->no=1;
                for(i=2;i<=n;i++)/*形成其余的n-1个表元*/
        {
                   u->link=(struct ele *)malloc(sizeof(struct ele));
                   u=u->link;
                   u->no=i;/*第i个表元置编号i*/
       }
                   u->link=h;/*末表元后继首表元,形成环*/
                   puts("
    The numbers of who will quit the cycle in turn are:");
            while(n)
         {
              for(i=1;i<m;i++)/*掠过m-1个表元*/
                 u=u->link;
                    p=u->link;/*p指向第m个表元*/
                     u->link=p->link;/*第m个表元从环中脱钩*/
                           printf("%4d",p->no);
                          free(p);/*释放第m个表元占用的空间*/
                          n--;
       }
                         printf("
    
     Press any key to quit...
    ");
                         getch();
            }
    ```
    >这是上周pta作业的报数游戏的题,当时做的时候感觉没什么思路,在网上找到这种做法;本代码使用结构体来做,并且定义了结构体指针,对其进行编号,用while循环语句,实现对其相应编号的人退出围成的环,直到第m个元素从环中脱离后,输出,并释放第m个表元占用的空间,避免空间浪费
    
    #####用“结构”统计学生成绩
    

    include <stdio.h>

    define N 200

    define SCORES 5

    define NUMLEN 10

    struct std_type{
    char no[NUMLEN];/学号/
    char name;/名字符串指针/
    int scores[SCORES];/
    五门功课的成绩/
    };
    struct std_type students[N];
    int order[N];
    int total[N]; /
    [函数]输入一个学生信息函数/
    int readastu(struct std_type spt)
    {
    int len,j;
    char buf[120];/
    输入字符串的缓冲区
    / printf(" Number : ");/输入学号/
    if(scanf("%s",buf)1)
    strncpy(spt->no,buf,NUMLEN-1);
    else
    return 0;/Ctrl+Z结束输入/
    printf("Name : ");/输入姓名/
    if(scanf("%s",buf)
    1)
    {
    len=strlen(buf);
    spt->name=(char )malloc(len+1);/申请存贮姓名的空间/
    strcpy(spt->name,buf);
    }
    else return 0;/
    Ctrl+Z结束输入/
    printf("Scores : ");/
    输入成绩/
    for(j=0;j<SCORES;j++)
    if(scanf("%d",spt->scores+j)!=1)
    break;
    if(j==0)/
    一个成绩也未输入/
    {
    free(spt->name);/
    释放存贮姓名的空间/
    return 0;
    }
    for(;j<SCORES;j++)/
    少数未输入的成绩用0分代之/
    spt->scores[j]=0;
    return 1;
    } /
    [函数]输出一个学生信息的函数/
    int writeastu(struct std_type spt)
    {
    int i; printf("Number : %s ",spt->no);/
    输出学号
    /
    printf("Name : %s ",spt->name);/输出姓名/
    printf("Scores : ");/输出成绩/
    for(i=0;i<SCORES;i++)
    printf("%4d",spt->scores[i]);
    printf(" ");
    } main()
    {
    int n,i,j,t; clrscr();
    for(n=0;readastu(students+n);n++);
    /采用冒泡法对学生信息数组排序/
    for(i=0;i<n;i++)
    {
    order[i]=i;/预置第i个输入的学生/
    for(t=0,j=0;j<SCORES;j++)/求第i个学生的总分/
    t+=students[i].scores[j];
    total[i]=t;
    }
    /冒泡排序/
    for(i=0;i<n-1;i++)/共扫视n-1遍/
    for(j=0;j<n-1-i;j++)
    if(total[order[j]]<total[order[j+1]])
    {/交换名次/
    t=order[j];
    order[j]=order[j+1];
    order[j+1]=t;
    }
    for(j=0;j<n;j++)/输出/
    writeastu(students+order[j]);
    printf(" Press any key to quit... ");
    getch();
    }
    ```

    本代码的功能是统计学生成绩,并按成绩对其排名;优势:本题代码调用多成函数实现对学生信息的输入和输出,并且程序中在输入前,有向系统申请存放空间,若输入成绩个数为0,则在将其空间释放,避免造成空间浪费,将其未输入的少数成绩记为0,这样就避免了输出错误;最后学生名次采用冒泡排序,结构简单;代码的注释很到位,值得我学习

    四、本周学习结

    1.总结本周学习内容。

    结构体 共同体 枚举体

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

    #######一.结构体的声明与定义变量的方法一共有三种:

    1.常规定义:

    struct AA
    {
    int a;
    int b;
    }; //注意大括号后面有分号
    变量定义:struct 机构体名 结构体变量名表
    如: struct AA aa,bb;(前面的struct不能掉)
    成员调用:aa.a; aa.b;

    2.尾部定义。

    struct CC
    {
    int a;
    int b;
    }aa,bb;
    此时aa,bb就是已经定义好的CC类型的变量了,这种情况在声明时struct前就一定不能加typedef,如果加上了,aa,bb就成了和CC一样的结构体类型了,而不是变量了。

    3.无名结构体

    struct CC
    {
    int a;
    int b;
    }vip1,vip2;
    此种情况除了vip1,vip2,不能再在其他地方定义新的变量,即定义了几个就只能用几个。

    不能在结构体内部直接给成员赋值:

    #include<stdio.h>  
    //直接带变量名Huqinwei  
    struct stuff{  
    //      char job[20] = "Programmer";  
    //      char job[];  
    //      int age = 27;  
    //      float height = 185;  
    }Huqinwei; 
    1
    2
    3
    4
    5
    6
    7
    8
    https://yq.aliyun.com/articles/10417
    1
    

    共用体:

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

    关键词:union
    特点:

    1共用体变量任何时候只有一个变量存在。
    2,共用体变量定义分配内存,长度=最长成员所在字节数
    3,定义共用体变量的方式和结构体一样有三种:常规,尾部,无名。
    4,当给一个成员重复赋值时或对多个成员赋值时,只承认最后一次的赋值。

    枚举体

    关键词:enum

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

    #######递归函数的原理

    递归(recursion)就是子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法。

    递归通常用来解决结构自相似的问题。所谓结构自相似,是指构成原问题的子问题与原问题在结构上相似,可以用类似的方法解决。具体地,整个问题的解决,可以分为两部分:第一部分是一些特殊情况,有直接的解法;第二部分与原问题相似,但比原问题的规模小。实际上,递归是把一个不能或不好解决的大问题转化为一个或几个小问题,再把这些小问题进一步分解成更小的问题,直至每个小问题都可以直接解决。因此,递归有两个基本要素:
    
    (1)边界条件:确定递归到何时终止,也称为递归出口。
    
    (2)递归模式:大问题是如何分解为小问题的,也称为递归体。递归函数只有具备了这两个要素,才能在有限次计算后得出结果
    

    在递归函数中,调用函数和被调用函数是同一个函数,需要注意的是递归函数的调用层次,如果把调用递归函数的主函数称为第0层,进入函数后,首次递归调用自身称为第1层调用;从第i层递归调用自身称为第i+1层。反之,退出第i+1层调用应该返回第i层。

    #######递归函数的内部执行过程

    一个递归函数的调用过程类似于多个函数的嵌套的调用,只不过调用函数和被调用函数是同一个函数。为了保证递归函数的正确执行,系统需设立一个工作栈。具体地说,递归调用的内部执行过程如下:
    
    (1)运动开始时,首先为递归调用建立一个工作栈,其结构包括值参、局部变量和返回地址;
    
    (2)每次执行递归调用之前,把递归函数的值参和局部变量的当前值以及调用后的返回地址压栈;
    
    (3)每次递归调用结束后,将栈顶元素出栈,使相应的值参和局部变量恢复为调用前的值,然后转向返回地址指定的位置继续执行。 
    
    2.罗列本周一些错题


    1.输出应是s.score,应加上结构变量名 2.定义结构体指针,struct student *; 3.分数加一,应加上变量名,p->score[i]或p.score[i] 4.返回的是学生的所有相关信息,不止是成绩


    1.定义结构体变量 struct worker s[10] 2.name[20]是地址,不用加&,其他的需加& 即&s[i].num, s[i].name ,&s[i].jbpay,&s[i]zwpay 3,max=i 4.min=i

    fun()函数定义了一个数及数组,但D选项中fun(int n ,int a)不可以这么写,这样a是一个整型数,并不是一个数组

  • 相关阅读:
    C语言利用按位与、按位或转换大小写字母
    综合布线知识点总结
    C语言 计算阶乘
    C语言位运算符详解
    docker-compose的flask自动部署
    redis集群的布置
    fatal: unable to auto-detect email address (got 'CC@LAPTOP-UPQ1N1VQ.(none)')
    使用ImagesPipeline时候报错为:ModuleNotFoundError: No module named 'scrapy.contrib'
    多任务
    json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (ch
  • 原文地址:https://www.cnblogs.com/2223ch/p/8095156.html
Copyright © 2020-2023  润新知