zoukankan      html  css  js  c++  java
  • 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 ", 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 ", 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 ", 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 ", 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 ", ave_rank.chn);
        printf("数学平均成绩是%d ", ave_rank.math);
        printf("英语平均成绩是%d ", ave_rank.eng);
        return 0;
    }

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

    枚举类型
      1 #include <stdio.h>
      2 int main() {
      3     enum {SPR, SUM, AUT, WIN};
      4     printf("AUT是%d ", AUT);
      5     return 0;
      6 }
      转换成的数字从0开始依次递增
    联合类型:
    联合中所有子变量都占有同样的存储位置,他们之间是互相影响的
      1 #include <stdio.h>
      2 typedef union un {
      3     char ch[2];
      4     int num;
      5 } un;
      6 int main() {
      7     un un1;
      8     un1.num = 0;
      9     un1.ch[0] = 'a';
     10     un1.ch[1] = 'b';
     11     printf("un1.num是%x ", un1.num);
     12     return 0;
     13 }

  • 相关阅读:
    状态码
    vue+element下拉选项添加点击事件可跳转或触发事件
    position定位
    vue+element下拉菜单添加事件
    vue封装接口
    vue+element实现导入excel并拿到返回值
    10. EIGRP的stud
    9. EIGRP认证和默认路由
    8. EIGRP负载均衡
    7. EIGRP中应用偏移列表
  • 原文地址:https://www.cnblogs.com/dongjian16/p/6814547.html
Copyright © 2011-2022 走看看