结构应用举例

我们先来对前面几节进行一个粗略的概述,首先我们学习了结构的相关概念,如我们为什么要引入结构这一类型,它有什么优势呢?它的特点是什么呢?如何定义结构类型和结构变量,并且提及到typedef的定义数据类型。有了结构变量后,我们要对结构变量进行初始化。而且我们知道结构中的结构成员可以是任何数据类型,结构本身也是一种数据类型,那也就是说结构中还可以有结构,即可以将一个结构作为另外一个结构的成员。还要知道如何访问结构成员。

结构可以作为结构数组(数组元素为结构类型),结构数组是如何定义的?如何访问结构数组?以及如何对结构数组进行初始化?接着探讨了结构数组和指针的关系即结构指针(结构指针的定义,和初始化),其实就是数组和指针关系的引申。

结构与函数的关系是一大重要问题。如结构变量作为函数的参数问题,由于单向传递性的问题,我们引入结构指针作为函数参数来解决此类问题。此外结构还能作为函数的返回值。

下面来看一个例子。解决问题:实现学生信息表的录入,排序,和输出

//结构数组作为函数参数
#include<stdio.h>
#define N 100

typedef struct student
{
   char ID[16];
   char name[16];
   double score;
}STUDENT;

void inputdata(STUDENT s[], int n);//输入n个学生信息
void outputdata(STUDENT s[], int n);//输出n个学生信息
void sort(STUDENT s[], int n);//按成绩降序排列

int main()
{
   STUDENT s[N];
   int n;

   printf("请输入学生人数:");
   scanf("%d", &n);
   
   printf("请输入%d个学生的学号,姓名和成绩:\n", n);
   inputdata(s,n);
   
   sort(s,n);

   printf("输出排序为:\n");
   outputdata(s,n);

   return 0;
}

void inputdata(STUDENT s[], int n)
{
   for(i=0; i<n; i++)
   {
     scanf("%s%s%lf", s[i].ID, s[i].name, s[i].score);
   }
}
void sort(STUDENT s[], int n)
{
   int i,j;
   STUDENT temp;
   for(i=0; i<n-1; i++)
     for(j=i+1; j<n; j++)
     {
          if(s[j].score>s[i].score)
          {
             temp = s[j].score;
             s[j].score = s[i].score;
             s[i].score = temp;
           }
     }
}
void outputdata(STUDENT s[], int n)
{
   printf("%-16s%-16s%8s\n", "学号", "姓名", "成绩");
   
   for(int i = 0; i<n; i++)
   {
     printf("%-16s%-16s%6.1f\n", s[i].ID, s[i].name, s[i].score);//-表示右补空格
    }
}
              

请输入学生人数:4
请输入4个学生的学号,姓名和成绩:
202001 张三 85
202002 李四 90
202003 赵五 95
202004 王五 100
输出排序结果:
学号              姓名              成绩
202001           张三              85
202002           李四              90
202003           赵五              95
202004           王五              100

通过上例可以看出,结构数组作为函数参数和结构指针作为函数参数的实质相同,在函数间传递的是数组的首地址,数组本身没有被复制,减少了参数传递的代价。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值