20201130-C语言-结构体

结构体

  • 先定义类型

    • 可以嵌套定义
    • 成员可以是数组
    • 成员可以是结构
    • 成员可以是结构数组
  • 再定义变量

    • 可以定义类型时声明变量
    • 可以以类型匿名方式在定义类型时声时变量
  • 再定义结构体变量数组

  • 再定义指针指向变量

  • 将结构体变量,数组,指针作用为函数的参数

    • 结构作为函数的参数
      • 有利于数据的封装
      • 有利于接口的标准化

结构体用法

  • 不能将一个结构体变量作为一个整体输入输出,只能对结构体变量中的各个成员分别进行输入和输出。
  • 成员运算符号:打点
    • 对结构变量
    • 对于多层嵌套定义的结构,可以逐级打点,逐级访问到成员
  • 成员指向符号:打剪头
    • 对结构指针
☆  结构体变量名 . 成员名
☆  (*p).成员名
☆   p  -> 成员名

实例,定义一个学生结构

// 定义STU类型
typedef struct student
       {
    
    
         int num;
         char   name[20];
         char  sex;
         int age;
         float  score;
         char  addr[30];
        } STU;
// 声明STU类型的变量
STU stu1,stu2;

具体题目实例

p783

#include<stdio.h>

#define SNUM 4 /* student number */
#define CNUM 3 /* course number */

/* User Code Begin(考生可在本行后添加代码,例如结构体的定义、函数原型声明等,行数不限) */
/*
程序的功能是:
某班有4个学生,三门课,通过main函数读入学生的学号(5位数字)、姓(最长7个字符)和三门课的成绩,
然后通过调用用户自定义函数DispScore实现这些信息的输出,调用用户自定义函数FindNoPass实现找出有两门以上不及格的学生、输出其学号和不及格课程的成绩。
要求用结构体编程。
编程可用素材:
printf("\nStudent Info and Score:\n");
printf("%6s %8s"…);
printf("%5d"…);
printf("\nTwo Course No Pass Students:\n")。

Please input student num name and score:
Student 1: 00001 zhang 55 67 77
Student 2: 00032 li    64 44 55
Student 3: 30013 zhou  78 90 88
Student 4: 20706 peng  45 55 36

Student Info and Score:
 00001    zhang   55   67   77
 00032       li   64   44   55
 30013     zhou   78   90   88
 20706     peng   45   55   36

Two Course No Pass Students:
 00032       li   44   55
 20706     peng   45   55   36
*/
struct student
{
    
    
    char num[6];    // 学号(5位数字)
    char name[8];   // 姓(最长7个字符)
    int score[3];   // 三门课
};

void DispScore(struct student *stu);
void FindNoPass(struct student *stu);

/* User Code End(考生添加代码结束) */

int main(void)
{
    
    
	int i, j;
	struct student stu[SNUM];

	printf("Please input student num name and score:\n");
	for (i=0; i<SNUM; i++)
	{
    
     
		printf("Student %d: ", i+1);
		scanf("%s %s", stu[i].num, stu[i].name);
		for (j=0; j<CNUM; j++)
		{
    
    
			scanf("%d", &stu[i].score[j]);
		}
	}
	
	DispScore(stu);
	FindNoPass(stu);

	return 0;
}

/* User Code Begin(考生在此后完成自定义函数的设计,行数不限) */
void DispScore(struct student *stu)
{
    
    
    int i, j;
    // 信息的输出
    printf("\nStudent Info and Score:\n");
    for (i = 0; i < SNUM; i++)
    {
    
    
        printf("%6s %8s", (stu + i)->num, (stu + i)->name);
        for ( j = 0; j < CNUM; j++)
        {
    
    
            printf("%5d", (stu + i)->score[j]);
        }
        printf("\n");
    }
}
void FindNoPass(struct student *stu)
{
    
    
    // 找出有两门以上不及格的学生、输出其学号和不及格课程的成绩
    int i, j;
    int flag[SNUM] = {
    
    0};
    int cnt;
    printf("\nTwo Course No Pass Students:\n");
    // 先统计60以下的门数
    for (i = 0; i < SNUM; i++)
    {
    
    
        cnt = 0;
        for ( j = 0; j < CNUM; j++)
        {
    
    
            if((stu + i)->score[j] < 60)
            {
    
    
                cnt++;
            }
        }
        if (cnt >=2)
        {
    
    
            flag[i] = 1;
        }        
    }
    // 再输出
    for (i = 0; i < SNUM; i++)
    {
    
    
        if (flag[i])
        {
    
    
            printf("%6s %8s", (stu + i)->num, (stu + i)->name);
            for ( j = 0; j < CNUM; j++)         // 循环负责遍历分数
            {
    
    
                if ((stu + i)->score[j] < 60)  // 只输出60以下的分数
                {
    
    
                    printf("%5d", (stu + i)->score[j]);
                }
            }
            printf("\n");
        }
    }        
}

p790

#include <stdio.h>

/* User Code Begin(考生可在本行后添加代码,例如结构体的定义、函数原型声明等,行数不限) */
/*
从键盘上读入5个学生的姓名(char(10))、学号(char(10))和成绩(int),要求成绩必须在0~100之间,否则重新读入该学生信息。
最后输出不及格学生的学号、名字和分数。要求用指针完成函数中结构体数组参数的传递以及各个数组元素的访问,访问结构体成员时使用->形式,
自定义函数头和函数体中不得出现数组下标形式的表示法。
编程可用素材:
printf("input name number score:\n");
printf("student %d: "…);
printf("           error score! input again!\n");
printf("%s/%s,%d   "…);
*/
struct stu
{
    
    
    char name[10];          // 姓名(char(10))
    char num[10];           // 学号(char(10))
    int score;              // 成绩(int)
};
void input(struct stu *stu, int n);     // 输入信息
void output(struct stu *stu, int n);    // 输出

/* User Code End(考生添加代码结束) */

int main(void)
{
    
      
	struct stu stud[5];	 
	
	input(stud, 5);   
	printf("\nfailed the exam: ");  
	output(stud, 5);
	
	return 0; 
}

/* User Code Begin(考生在此后完成自定义函数的设计,行数不限) */
/*
input name number score:
student 1: aa 11 77
student 2: bb 02 55
student 3: cc 13 33
student 4: ee 36 110
           error score! input again!
student 4: ee 36 10
student 5: dd 25 88
*/
void input(struct stu *stu, int n)
{
    
    
    int i;

    printf("input name number score:\n");    
    for ( i = 0; i < n; i++)
    {
    
    
        printf("student %d: ", i + 1);
        scanf("%s %s %d", (stu + i)->name, (stu + i)->num, &(stu + i)->score);
        while ((stu + i)->score < 0 || (stu + i)->score > 100)  // 只不要符合要求,就重新输入,直到符合要求
        {
    
    
            printf("           error score! input again!\n");
            printf("student %d: ", i + 1);
            scanf("%s %s %d", (stu + i)->name, (stu + i)->num, &(stu + i)->score);
        }        
    }
}
void output(struct stu *stu, int n)
{
    
    
    int i;
    for ( i = 0; i < n; i++)
    {
    
    
        if((stu + i)->score < 60)   // 只输出不及格的
        {
    
    
            printf("%s/%s,%d   ", (stu + i)->num, (stu + i)->name, (stu + i)->score);
        }
    }
}

p765

#include <stdio.h>
#include <stdlib.h>

/* User Code Begin(考生可在本行后添加代码,行数不限) */
/*
有五个学生,每个学生的数据包括学号、姓名(最长19字节)、三门课的成绩,从键盘输入五个学生的数据,
计算每个学生的平均成绩并按平均成绩由高到低排序,并将排序结果显示。
要求用结构体编程,变量数据类型的选择应适当,在保证满足设计要求精度的情况下,养成不浪费内存空间和计算时间的好习惯。
编程可用素材:
printf("Please input info of students:No Name Math English Computer\n");
*/
typedef struct
{
    
    
    int num;            // 学号
    char name[20];      // 姓名(最长19字节)
    int math;           // 三门课之一 数学
    int english;        // 三门课之一 英语
    int computer;       // 三门课之一 计算机
    float average;      // 平均分
} STUDENT;

void inputStudent(STUDENT *stu, int n);                 // 输入功能
void sortStudent(STUDENT *stu, int n);                  // 排序功能
void swapStudent(STUDENT *stu1, STUDENT *stu2);         // 交换功能
/* User Code End(考生添加代码结束) */

int main(void)
{
    
    
	STUDENT myclass[5], *pStu = myclass;
	int i;
	const int N = 5;

	/* User Code Begin(考生可在本行后添加代码,行数不限) */
    inputStudent(myclass, N);
    sortStudent(myclass, N);
    /* User Code End(考生添加代码结束) */
	
	printf("\nResult of sort:\n");
	printf("Num   Name                 Math     English  Computer Average\n");
	for (i=0; i<N; i++)
	{
    
    
		printf("%-5d %-20s %-8d %-8d %-8d %-.2f\n", (pStu+i)->num, (pStu+i)->name,
			(pStu+i)->math, (pStu+i)->english, (pStu+i)->computer, (pStu+i)->average);
	}

	return 0;
}

/* User Code Begin(考生在此后根据设计需要完成程序的其它部分,行数不限) */
/* 
    输入学生结构的信息
 */
void inputStudent(STUDENT *stu, int n)
{
    
    
    int i;

    printf("Please input info of students:No Name Math English Computer\n");
	for (i=0; i<n; i++)
	{
    
    
        printf("%d:", i + 1);
        scanf("%d %s %d %d %d", &stu[i].num, stu[i].name, &stu[i].math, &stu[i].english, &stu[i].computer);
        stu[i].average = ((float)stu[i].math + (float)stu[i].english + (float)stu[i].computer) / 3;
    }    
}
/* 
    1. 使用冒泡排序算法
    2. 实现对n个元素的STUDENT数组的排序
 */
void sortStudent(STUDENT *stu, int n)
{
    
    
    int i, j;
	for (i=0; i<n-1; i++)
	{
    
    
        for ( j = 0; j < n-1-i; j++)
        {
    
    
            if(stu[j].average < stu[j+1].average)
            {
    
    
                swapStudent(&stu[j], &stu[j + 1]);
            }
        }   
    }    
}
/* 
    实现两个STUDENT结构的交换
 */
void swapStudent(STUDENT *stu1,STUDENT *stu2)
{
    
    
    STUDENT stuTmp;
    stuTmp = *stu1;
    *stu1 = *stu2;
    *stu2 = stuTmp;
}

猜你喜欢

转载自blog.csdn.net/matrixbbs/article/details/111262430
今日推荐