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

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

目录:

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

 

1、结构体

1)概述

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

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

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

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

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

定义结构体变量的方式:

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

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

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

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

案例:学生成绩



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("请您输入学生 姓名 成绩 :\n");
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\n", p[i].name);
48 printf("成绩: %.1f %.1f %.1f\n", 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("==================打字游戏================\n");
12 printf("================按任意键继续==============\n");
13 printf("===============按Esc 退出游戏=============\n");
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("\n用时:%d(秒)\n", end_time - start_time);
57 printf("正确率:%.1f%%\n", val*1.0 / 50 * 100);
58 if (val*1.0 / 50 * 100 > 80.0)
59 {
60 printf("打字小能手!\n");
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\n", 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​​,转载请注明出处。