首页 > 代码库 > 20170505

20170505

结构体变量可以作为函数的形参和返回值使用(不要这么做,因为结构体变量中可能包含非常多的东西,在调用过程中很花时间)
使用结构体变量作为形参或返回值会浪费时间和空间,所以应该使用结构体指针作为形参和返回值
例子:
  1 #include <stdio.h>
  2
  3 typedef struct screen {
  4     int x;
  5     int y;
  6 } screen;
  7
  8 screen *midpt(const screen *s_a1, const screen *s_a2, screen *s_a3) {
  9     s_a3->x = (s_a1->x + s_a2->x) / 2;
 10     s_a3->y = (s_a1->y + s_a2->y) / 2;
 11     return s_a3;
 12 }
 13 int main() {
 14     screen a1 = {}, a2 = {}, a3 = {};
 15     printf("请输入第一个点的位置:");
 16     scanf("%d%d", &a1.x, &a1.y);
 17     printf("请输入第二个点的位置:");
 18     scanf("%d%d", &a2.x, &a2.y);
 19     midpt(&a1, &a2, &a3);
 20     printf("中点的位置为:%d  %d\n", a3.x, a3.y);
 21     return 0;
 22 }
 
练习:求矩形面积
  1 #include <stdio.h>
  2
  3 typedef struct pt {
  4     int x, y;
  5 } pt;
  6
  7 typedef struct rect {
  8     pt p1, p2;
  9 } rect;
 10
 11 int get(const rect *r_r) {
 12     int ret = 0;
 13     ret = (r_r->p1.x - r_r->p2.x) * (r_r->p2.y - r_r->p1.y);
 14     ret = ret > 0 ? ret : 0 - ret;
 15     return ret;
 16 }
 17 int main() {
 18     rect r = {};
 19     int ret = 0;
 20     printf("请输入第一个点的位置:");
 21     scanf("%d%d", &r.p1.x, &r.p1.y);
 22     printf("请输入第二个点的位置:");
 23     scanf("%d%d", &r.p2.x, &r.p2.y);
 24     ret = get(&r);
 25     printf("面积是:%d\n", ret);
 26     return 0;
 27 }

 
  1 /*
  2    对齐,补齐演示
  3  */
  4 #include <stdio.h>
  5 typedef struct {
  6     char str[2];
  7     int num;
  8
  9 } stru;
 10 int main() {
 11     printf("sizeof(stru)是%d\n", sizeof(stru));
 12     return 0;
 13 }
结果是8
任何变量,它的地址一定是它自身大小的整数倍(double类型变量的大小按4的整数倍计算),这个规则叫做数据对齐
数据对齐会造成结构体内部不同子变量之间有空隙
一个结构体的大小必须是其内部最大子变量的整数倍(double类型变量的大小按4的整数倍计算), 这个规则叫做数据补齐
数据补齐可能造成结构体在最后多占用一些浪费的字节
 
 结构体中子变量的顺序会影响结构体的大小
 
练习:一个班有五个学生,每个学生参加三门期末考试(语文,数学,英语),用
一个结构体记录一个学生的所有成绩,编写一个函数计算出这个班每门科目的平均成绩,
并记录在一个结构体中,最后把所有平均成绩打印在屏幕上。
  1 #include <stdio.h>
  2 typedef struct grade {
  3     double ch;
  4     double math;
  5     double eng;
  6 } grade;
  7
  8 typedef struct average {
  9     double a_ch;
 10     double a_math;
 11     double a_eng;
 12 } average;
 13
 14 void print() {
 15     grade g1, g2, g3, g4, g5;  //分别表示五个学生的成绩
 16     average average;
 17     printf("请输入第一个学生的成绩:");
 18     scanf("%lf%lf%lf", &g1.ch, &g1.math, &g1.eng);
 19     printf("请输入第二个学生的成绩:");
 20     scanf("%lf%lf%lf", &g2.ch, &g2.math, &g2.eng);
 21     printf("请输入第三个学生的成绩:");
 22     scanf("%lf%lf%lf", &g3.ch, &g3.math, &g3.eng);
 23     printf("请输入第四个学生的成绩:");
 24     scanf("%lf%lf%lf", &g4.ch, &g4.math, &g4.eng);
 25     printf("请输入第五个学生的成绩:");
 26     scanf("%lf%lf%lf", &g5.ch, &g5.math, &g5.eng);
 27     average.a_ch = (g1.ch + g2.ch + g3.ch + g4.ch + g5.ch) / 5.    0;
 28     average.a_math = (g1.math + g2.math + g3.math + g4.math + g    5.math) / 5.0;
 29     average.a_eng = (g1.eng + g2.eng + g3.eng + g4.eng + g5.eng    ) / 5.0;
 30     printf("平均成绩为:%g %g %g\n", average.a_ch, average.a_ma    th, average.a_eng);
 31 }
 32
 33 int main() {
 34     print();
 35     return 0;
 36 }

 或者:
 #include <stdio.h>
typedef struct {
    int chn;
    int math;
    int eng;
} rank;

rank *ave(const rank *p_rank, int size, rank *p_ave) {
    int num = 0;
    for(num = 0; num <= size - 1; num++) {
        p_ave->chn += (p_rank + num)->chn;
        p_ave->math += (p_rank + num)->math;
        p_ave->eng += (p_rank + num)->eng;
    }
    p_ave->chn /= size;
    p_ave->math /= size;
    p_ave->eng /= size;
    return p_ave;
}

int main() {
    rank ranks[5] = {};
    rank ave_rank = {};
    int num = 0;
    for(num = 0; num <= 4; num++) {
        printf("请输入第%d个学生的成绩:", num + 1);
        scanf("%d%d%d", &ranks[num].chn, &ranks[num].math, &ranks[num].eng);
    }
    ave(ranks, 5, &ave_rank);
    printf("语文平均成绩是%d\n", ave_rank.chn);
    printf("数学平均成绩是%d\n", ave_rank.math);
    printf("英语平均成绩是%d\n", ave_rank.eng);
    return 0;
}

枚举类型可以把一组相关名称转换成数字

20170505