• C基础学习笔记——01-C基础第11天(复合类型)


    在学习C基础总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。

    01-C基础第11天(复合类型)

    目录:

    1、结构体
    2、共用体(联合体)
    3、枚举
    4、typedef
    练习:打字游戏;
    练习:QT版本的打字游戏

    1、结构体

    1)概述

    数组:描述一组具有相同类型数据的有序集合,用于处理大量相同类型的数据运算。

    有时我们需要将不同类型的数据组合成一个有机的整体,如:一个学生有学号/姓名/性别/年龄/地址等属性。显然单独定义以上变量比较繁琐,数据不便于管理。

    C语言中给出了另一种构造数据类型——结构体。

    2)结构体变量的定义和初始化

    定义结构体变量的方式:

    (1)先声明结构体类型再定义变量名

    (2)在声明类型的同时定义变量

    (3)直接定义结构体类型变量(无类型名)

    案例:学生成绩

     1 #define _CRT_SECURE_NO_WARNINGS
     2 #include<stdio.h>
     3 #include<string.h>
     4 #include<stdlib.h>
     5 struct stu2
     6 {
     7     //成员列表
     8     //char name[21];
     9     char * name;
    10     float * scores;
    11 };
    12 
    13 int main()
    14 {
    15     struct stu2 *p = (struct stu2 *)malloc(sizeof(struct stu2) * 3);
    16     for (int i = 0; i < 3; i++)
    17     {
    18         p[i].name = (char *)malloc(sizeof(char) * 21);
    19         p[i].scores = (float *)malloc(sizeof(float) * 3);
    20         //(p+i)->name
    21 
    22         printf("请您输入学生 姓名   成绩 :
    ");
    23         scanf("%s%f%f%f", p[i].name, &p[i].scores[0], &p[i].scores[1], &p[i].scores[2]);
    24 
    25     }
    26 
    27     //冒泡排序
    28     for (int i = 0; i < 3 - 1; i++)
    29     {
    30         for (int j = 0; j < 3 - i - 1; j++)
    31         {
    32             float sum1 = p[j].scores[0] + p[j].scores[1] + p[j].scores[2];
    33             float sum2 = p[j + 1].scores[0] + p[j + 1].scores[1] + p[j + 1].scores[2];
    34             if (sum1 > sum2)
    35             {
    36                 struct stu2 temp = p[j];
    37                 p[j] = p[j + 1];
    38                 p[j + 1] = temp;
    39             }
    40         }
    41     }
    42 
    43 
    44     for (int i = 0; i < 3; i++)
    45     {
    46 
    47         printf("姓名:%s
    ", p[i].name);
    48         printf("成绩: %.1f   %.1f   %.1f
    ", p[i].scores[0], p[i].scores[1], p[i].scores[2]);
    49     }
    50 
    51 
    52     //释放
    53     for (int i = 0; i < 3; i++)
    54     {
    55         free(p[i].name);
    56         free(p[i].scores);
    57     }
    58 
    59     free(p);
    60 
    61 
    62 
    63     system("pause");
    64     return EXIT_SUCCESS;
    65 }

    2、共用体(联合体)

    (1)联合union是一个能在同一个存储空间存储不同类型数据的类型;

    (2)联合体所占的内存长度等于其最长成员的长度,也有叫做共用体;

    (3)同一内存段可以用来存放几种不同类型的成员,但每一瞬时只有一种起作用;

    (4)共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员的值会被覆盖;

    (5)共用体变量的地址和它的各成员的地址都是同一地址。

    3、枚举

    枚举:将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。

    (1)在枚举值表中应列出所有可用值,也称为枚举元素。

    (2)枚举值是常量,不能在程序中用赋值语句再对它赋值。

    (3)举元素本身由系统定义了一个表示序号的数值从0开始顺序定义为0,1,2 …

    注意:可以用在switch中。

    4、typedef

    typedef为C语言的关键字,作用是为一种数据类型(基本类型或自定义数据类型)定义一个新名字,不能创建新类型。

    (1)与#define不同,typedef仅限于数据类型,而不是能是表达式或具体的值

    (2)#define发生在预处理,typedef发生在编译阶段

    练习:打字游戏

     1 #define _CRT_SECURE_NO_WARNINGS
     2 #include<stdio.h>
     3 #include<string.h>
     4 #include<stdlib.h>
     5 #include <conio.h>
     6 #include <time.h>
     7 
     8 
     9 void tips()
    10 {
    11     printf("==================打字游戏================
    ");
    12     printf("================按任意键继续==============
    ");
    13     printf("===============按Esc 退出游戏=============
    ");
    14     char ch = _getch();
    15     if (ch == 27)
    16     {
    17         exit(0);
    18     }
    19 }
    20 void rand_ch(char * arr)
    21 {
    22     srand((unsigned int)time(NULL));
    23     for (int i = 0; i < 50; i++)
    24     {
    25         arr[i] = rand() % 26 + 'a';
    26     }
    27 
    28 }
    29 void print_ch(char * arr)
    30 {
    31 
    32     //变量  计时器  开始 结束   计数器  val
    33     unsigned int start_time;
    34     unsigned int end_time;
    35     int val = 0;
    36     for (int i = 0; i < 50; i++)
    37     {
    38         char ch = _getch();
    39         if (i == 0)
    40         {
    41             start_time = time(NULL);
    42         }
    43         if (ch == arr[i])
    44         {
    45             printf("%c", ch);
    46             val++;
    47         }
    48         else
    49         {
    50             printf("_");
    51         }
    52     }
    53     end_time = time(NULL);
    54 
    55 
    56     printf("
    用时:%d(秒)
    ", end_time - start_time);
    57     printf("正确率:%.1f%%
    ", val*1.0 / 50 * 100);
    58     if (val*1.0 / 50 * 100 > 80.0)
    59     {
    60         printf("打字小能手!
    ");
    61     }
    62 
    63 }
    64 int main()
    65 {
    66     //字库
    67     char arr[51];
    68     memset(arr, 0, 51);
    69     while (1)
    70     {
    71         //1、提示
    72         tips();
    73         //2、随机字符
    74         rand_ch(arr);
    75         printf("%s
    ", arr);
    76         //3、输入字符
    77         print_ch(arr);
    78     }
    79     return EXIT_SUCCESS;
    80 }

    练习:QT版本的打字游戏

    创建项目:名称、路径都不能中文,选择“创建界面”,点击“完成”。

    创建button:“重置”,“提交”。

    创建label:

    创建输入框:

    “重置”右击转到槽:定义start_time、end_time、value,,添加头文件,定义构造函数MainWindow

    main.cpp

     1 #include "mainwindow.h"
     2 #include <QApplication>
     3 
     4 int main(int argc, char *argv[])
     5 {
     6     QApplication a(argc, argv);
     7     MainWindow w;
     8     w.show();
     9 
    10     return a.exec();
    11 }

    mainwindow.cpp

     1 #include "mainwindow.h"
     2 #include "ui_mainwindow.h"
     3 #include <QString>
     4 
     5 MainWindow::MainWindow(QWidget *parent) :
     6     QMainWindow(parent),
     7     ui(new Ui::MainWindow)
     8 {
     9     ui->setupUi(this);
    10 }
    11 
    12 MainWindow::~MainWindow()
    13 {
    14     delete ui;
    15 }
    16 
    17 void MainWindow::on_pushButton_clicked()
    18 {
    19     //随机字母
    20     srand((unsigned int)time(NULL));
    21     for(int i=0;i<20;i++)
    22         arr[i] = rand()%26+'a';
    23     arr[20]=0;
    24 
    25     //重置界面
    26     ui->label->setText("");
    27     ui->textEdit->setText("");
    28     ui->label_2->setText("");
    29     ui->label->setText(arr);
    30 
    31     start_time = time(NULL);
    32 
    33     //重置计数器
    34     value =0;
    35 }
    36 
    37 void MainWindow::on_pushButton_2_clicked()
    38 {
    39     end_time = time(NULL);
    40     //获取文本内容
    41     QString txt =  ui->textEdit->toPlainText();
    42     //去除文本中的空格
    43     txt.isEmpty();
    44     const char * temp = txt.toStdString().data();
    45     int i=0;
    46     while(*temp++==arr[i++] && *temp)
    47         value++;
    48     QString res =QString("Right : %1%  Time : %2(s)").arg(value/20.0*100).arg(end_time- start_time);
    49     ui->label_2->setText(res);
    50 
    51 }

    mainwindow.h

     1 #ifndef MAINWINDOW_H
     2 #define MAINWINDOW_H
     3 
     4 #include <QMainWindow>
     5 #include <time.h>
     6 
     7 namespace Ui {
     8 class MainWindow;
     9 }
    10 
    11 class MainWindow : public QMainWindow
    12 {
    13     Q_OBJECT
    14 
    15 public:
    16     explicit MainWindow(QWidget *parent = 0);
    17     ~MainWindow();
    18 
    19 private slots:
    20     void on_pushButton_clicked();
    21 
    22     void on_pushButton_2_clicked();
    23 
    24 private:
    25     Ui::MainWindow *ui;
    26     unsigned int start_time;
    27     unsigned int end_time;
    28     int value=0;
    29     char arr[21];
    30 
    31 };
    32 
    33 #endif // MAINWINDOW_H

    在学习C基础总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。

  • 相关阅读:
    通过docker-composer启动容器nginx,并完成spring.boot的web站点端口转发
    手写redis的docker文件,通过docker-compose配置redis
    基于Docker Compose搭建mysql主从复制(1主2从)
    ubuntu 14.04 挂载window共享目录
    asp.net mvc,基于aop实现的接口访问统计、接口缓存等
    自定义属性Attribute的运用
    表值参数的使用
    js的title提示
    Android之ViewPager中包含ViewFlipper时实现双滑动嵌套解决父控件干扰问题
    Android之ViewFlipper实现手动+自动切换图片(附加动画效果)
  • 原文地址:https://www.cnblogs.com/Alliswell-WP/p/C_BasicLearning_11.html
Copyright © 2020-2023  润新知