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\n");
   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("\n");  
        }  
}  

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

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("\n Enter a date(month,day) \n");  
    scanf("%d%d",&date.month,&date.day);  
    searchStudent(s,date);  
}  
void inputStudent(STUDENT s[]){  
    int i;  
    for(i=0;i<NUM;i++){  
        printf("\n Enter a student infomation \n");  
        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("\n printf all student infomation");  
    for(i=0;i<NUM;i++){  
        printf("\n%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("\n searched in all student infomation");  
    for(i=0;i<NUM;i++){  
        if(s[i].birthday.month>date.month){  
            printf("\n%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("\n%4d%10s%8d%3d%3d",s[i].num,s[i].name,s[i].birthday.year,s[i].birthday.month,s[i].birthday.day);  
        }  
    }  
    printf("\n");  
}  

本题运用结构体来输入查询学生的信息,结构体可以一次定义多个变量,
本题调用了多个函数,如果每个函数都来定义新的变量的话,不利于储存
和运用,这使得了有多级函数时使结构分明清晰,使主函数的语言较为
直观,知道他的目的是什么,他是先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.罗列本周一些错题。

posted on 2017-12-24 15:49  ifcan  阅读(328)  评论(1编辑  收藏  举报

导航