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