用循环队列解决舞伴配对问题发现自己的问题
2019-11-08 16:01:15来源:博客园 阅读 ()
1.首先是对vs2017这款软件的使用
1.VS中的scanf()这个函数的使用问题
直到这次写代码我才知道VS中用scanf是会被警告的,VS中正规的类似于scanf()函数的输入函数是scanf_s()只有使用这个函数你才不会报错,它有三个参分别是数据类型,地址,最大存储量,
还有两种方法
- 第一在代码的第一行加上“#define _CRT_SECURE_NO_WARNINGS”。
2. 或者修改文件属性也可以做到和上面一样的效果
右键点击源文件,
点击属性
依次选中:C/C++ >> 预处理器,在右侧预处理器定义右侧添加上:_CRT_SECURE_NO_DEPRECATE
2.第二就是我的知识了,真的好菜
- while()括号中的是循环条件,而不是停止条件,请一定要想好循环条件是啥
- 我本来以为%s输入有一个特点就是遇到空格就停止,其实这是函数scanf()函数的特点而不是%s的特点,如果想把空格也吞了,那就用gets(),还有两个函数就是getchar()和getch()
- 还有就是写代码的习惯很不好,总是思路混乱,不知道接下来干啥,其实应该,想着写着,就像翻译一样,把你的想法,思路,用代码翻译下来
- 对算法原理思想理解的不够,不重视思想原理,循环列表的原理最重要的就两个(front + 1)% maxsize 和 (rear + 1) % maxsize,我感觉
- 只是太薄弱,尤其是在数组的形参表那里,要去补补了,传递的是一个地址,怎么写才好,是 status inqueue(queue all[],&man)还是 status inqueue(queue all,&man)呢?我不是很清楚,最后我用了前者对了,但我不知道为啥
-
void inqueue(person all[], queue &man, queue &woman,int n) {//根据性别分别如男队和女队 for (int i = 0; i < n; i++) { if (all[i].sex == 1) { //strcpy(man.elem[man.number], all[i].name); strcpy(man.elem[man.rear], all[i].name); man.rear = (man.rear + 1) % 100; man.number++; } else { //strcpy(woman.elem[woman.number], all[i].name); strcpy(woman.elem[woman.rear], all[i].name); woman.rear = (woman.rear + 1) % 100; woman.number++; } } }
下面就是我这次写的代码,很low,很菜,哎,我太菜了。
-
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<iostream> #include<malloc.h> #include<math.h> #include<windows.h> using namespace std; typedef int status; int n; typedef struct { char name[20]; int sex; }person; typedef struct { int front; int rear; char elem[100][20]; int number;//人的数量 }queue; void inperson(person &all) { cout << "请输这位同学的姓名和性别:"; scanf("%s", all.name);//在c和c++语言中输入字符串向字符数组中是不需要加&的, /*输入参数是已经定义好的“字符数组名”, 不用加&, 因为在C语言中数组名就代表该数组的起始地址*/ //cout << "请输入这位同学的性别:"; scanf("%d", &all.sex); } void inqueue(person all[], queue &man, queue &woman,int n) {//根据性别分别如男队和女队 for (int i = 0; i < n; i++) { if (all[i].sex == 1) { //strcpy(man.elem[man.number], all[i].name); strcpy(man.elem[man.rear], all[i].name); man.rear = (man.rear + 1) % 100; man.number++; } else { //strcpy(woman.elem[woman.number], all[i].name); strcpy(woman.elem[woman.rear], all[i].name); woman.rear = (woman.rear + 1) % 100; woman.number++; } } } status initqueue(queue &man) { /*int n,i; cout<<"请输入队中的人员数量:"; cin>>n; man.number = n + 1; cout<<"输入队中人员的姓名"; for(i = 0;i < n;i ++){ scanf("%s",&man.elem[i]); } man.rear = n; */ man.rear = man.front = 0; man.number = 0; return 0; } int emptyqueue(queue man) {//用于判断队列中还有没有人 if (man.front == man.rear) return 0; else return 1; } int dequeue(queue &man, char *str) {//删除队首元素 if (man.front == man.rear) return 0; else { strcpy(str, man.elem[man.front]); man.front = (man.front + 1) % 100; man.number--; return 1; } } int main() { person all[100]; int n;//总人数 queue man; queue woman; initqueue(man); initqueue(woman);//初始化两个队列,使两个队列的首和尾都为零 cout << "请输入本班的人数 :"; cin >> n; for (int i = 0; i < n; i++) {//把所有人都存入一个队列 inperson(all[i]); } //根据性别入队列 inqueue(all, man, woman,n);//按性别分别入队 char str[20]; while (emptyqueue(man) && emptyqueue(woman)) {//配对,改这里没有想好停止条件,我本来写的是“||”应该是当两个都不为空时才停止 dequeue(man, str); dequeue(woman, str); } if (man.front == man.rear&&woman.front == woman.rear) { cout << "完全配对"; cout << endl; } else if (woman.front != woman.rear) { cout << "下一位配对的女性是:"; printf("%s", woman.elem[woman.front]); cout << endl; } else printf("下一位配对的男性是:%s", man.elem[man.front]); Sleep(50000); return 0; }
给自己提个醒吧,重视基础,出来混总是要还的,所以还是好好学习,打牢自己的基础吧
原文链接:https://www.cnblogs.com/hjt2ZhaoYing/p/11817240.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:C++引用与常量
- 关于各种不同开发语言之间数据加密方法(DES,RSA等)的互通的 2020-06-07
- 单调队列模板【附例题】 2020-05-05
- STL之queue 2020-04-08
- DSA_06:队列 2020-03-29
- 算法训练 自行车停放 2020-02-27
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash