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

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

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

目录:

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

1、结构体

1)概述

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

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

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

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

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

定义结构体变量的方式:

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

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

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

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

案例:学生成绩

 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,转载请注明出处。