C语言第十次博客作业--结构体

时间:2022-05-11 21:32:57

一、PTA实验作业

题目1:按等级统计学生成绩

1. 本题PTA提交列表

C语言第十次博客作业--结构体

2. 设计思路

 定义循环变量i,count统计不及格人数
 for i=0 to n
 如果 (p+i)>score大于等于85
 (p+i)->grade 等于A
 
 如果 (p+i)>score大于等于70
 (p+i)->grade 等于B
 
 如果  (p+i)>score大于等于60
 (p+i)->grade 等于C
 
  否则
 (p+i)->grade 等于D
    count++
    返回count

3.代码截图

C语言第十次博客作业--结构体

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

不会用(p+i)->score和(p+i)->grade,导致编译错误,分等级的时候就是单纯的set_grade=A这样,后来参考了别人的代码才改正过来

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

1. 本题PTA提交列表

C语言第十次博客作业--结构体

2. 设计思路

 struct worker{
    char name[10];
    double jbgz;
    double fdgz;
    double zc;
    double sfgz;
};该结构体表示职工的名字,基本工资,浮动工资,支出和实发工资
定义循环变量i,N为职工人数
输入N
定义结构数组worker workers[N]
for  i=0 to N
输入workers[i].name,&workers[i].jbgz,&workers[i].fdgz,&workers[i].zc 
for i=0 to N
计算实发工资workers[i].sfg
 输出职工名字workers[i].name和实发工资workers[i].sfg

3.代码截图

C语言第十次博客作业--结构体

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

多种错误是因为我没有定义结构数组struct worker workers[N],也没有计算实发工资,而是直接在输出里面计算实发工资,编译结果是0.00

题目3:7-2 时间换算

1. 本题PTA提交列表

C语言第十次博客作业--结构体

2. 设计思路

 定义变量 h为小时,m为分钟,s为秒,n为第二行增加的秒数
 输入h,m,s 
 输入n
 换算s 换算m 换算h
 s对60取余 m对60 取余 h对24取余
 输出h,m,s

3.代码截图

C语言第十次博客作业--结构体

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

C语言第十次博客作业--结构体

如上图所示,输出的分钟格式没有正确,后把%d改为%2d也没有正确,最后改为%02d就正确了

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

C语言第十次博客作业--结构体

三、阅读代码

1.查找书籍

给定n本书的名称和定价,查找并输出其中定价最高和最低的书的名称和定价

#include<stdio.h>
#include<stdlib.h>
typedef struct {
    char bName[30];
    double price;
}bInfo;

int main() 
{
    int i, n;
    int max, min;
    bInfo *data;
    scanf("%d", &n);
    getchar();
    data = (bInfo*)malloc(sizeof(bInfo) * n);
    for (i = 0; i < n; i++) {
        gets(data[i].bName);
        scanf("%lf", &data[i].price);
        getchar();
    }
    max = min = 0;
    for (i = 0; i < n; i++) {
        if (data[max].price < data[i].price) {
            max = i;
        }
        if (data[min].price > data[i].price) {
            min = i;
        }
    }
    printf("\n%.2f, %s\n", data[max].price, data[max].bName);
    printf("%.2f, %s\n", data[min].price, data[min].bName);
    system("pause");
    return 0;
}

C语言第十次博客作业--结构体

2.通讯录的录入与显示

C语言第十次博客作业--结构体

四、本周学习总结

1.总结本周学习内容

指针字符串 
字符串的复制,连接,比较及计算字符串长度的函数,在系统头文件string.h中定义

 字符串复制函数 char *strcpy(char *s1,char *s2) 

字符串连接函数 strcat(s1,s2) 

字符串比较函数 strcmp(s1,s2)

 字符串长度函数 strlen(s1) 
 结构 
结构的定义:
 struct 结构名{ 
          类型名 结构成员名
 };
 或 
struct 结构名{
        类型名 结构成员名
 }结构变量名表;

 结构变量成员的引用:结构变量名.结构成员名 例如 s1.num

 对嵌套成员的引用:struct nest_student nest_s1; nest_s1.addr.zip;

 结构变量的整体赋值:以下语句等效(只有相同结构类型的变量之间才可以直接赋值)

 s1=s2;s2.num=s1.num;strcpy(s2.name,s1.name); 
结构数组操作
 结构数组的定义:struct student students[50]; 

在定义结构素组时可以同时对其进行初始化,格式与二维数组的初始化类似:

 struct student students[50]={101,'zhang',76,86,78},{102,'wang',83,92,84}}; 

对于结构数组students,既可以引用数组的元素,如:students[i],也可以引用结构数组元素的成员,如:students[i].num 
 结构指针 即:指向结构类型变量的指针 例如,编写以下语句: struct students s1={101,'zhang',78.87.97},*p; p=&s1;

 用*p访问结构成员:(*p).num=101;

 用指向运算符->访问指针指向的结构成员:p->num=101;

 当p指向结构变量s1 时,s1.num=101;(*p).num=101;p->num=101;效果一样
 递归 

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

递归是把一个不能或不好解决的大问题转化为一个或几个小问题,再把这些小问题进一步分解成更小的问题,直至每个小问题都可以直接解决

递归方法的两个要点:

 递归出口,即递归的结束条件,到何时不再递归调用下去

 递归式子,递归的表达式,如fact(n)=n*fact(n-1)
 结构体:结构体是构造型数据类型,可以处理不同类型的数据,每一位成员都用来表示一种具体事务的属性,结构体总空间大小,等于各成员总长度 

共用体:共用体是一种多变量共享存储空间的构造类型,共用体成员可以表示多种属性,共用体空间等于最大成员占据的空间,共用体不能赋初值

 枚举:枚举类型是一种基本类型,是指变量的值可以全部列出,定义一个枚举变量后,变量的值确定在定义之中,枚举元素是常量,只能在定义阶段赋值

2.罗列本周一些错题

5、简答题

分值15.0

得分: 5.0 

    程序改错题:

    输入一个正整数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;

}

参考答案


#include<stdio.h>
int main()
{  
    struct 
    {  
         char name[10];

         float jbg;

         float fdg;

         float zc;

     }emp[10];  //1
    int i,n;
    printf("n=");
    scanf("%d",&n);
    getchar();  //2
    for(i=0;i<n;i++)
        {
          scanf("%s%f%f%f",emp[i].name,&emp[i].jbg,&emp[i].fdg,&emp[i].zc);   //3
          getchar();} //4
    for(i=0;i<n;i++)
         printf("%5s实发工资:%7.2f\n", emp[i].name,emp[i]. jbg+emp[i]. fdg-emp[i].zc);//5
    return 0;

}

我的作答

double jbg/fdg/zc   // float jbg/fdg/zc

scanf("%s%lf%lf%lf",emp[i].name,&emp[i].jbg,&emp[i].fdg,&emp[i].zc) //

printf("%s实发工资:%.2f\n",emp[i].name,emp[i].zc)
3、填空题

分值20.0

得分: 0.0 

程序通过定义学生结构体变量,存储了学生的学号、姓名和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

我的作答

int
*p
score
s.score
2、简答题

分值20.0

得分: 0.0 

线性表用顺序实现。请填空写一个求线性表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];

C语言第十次博客作业--结构体

C语言第十次博客作业--结构体