我的问题有:(VS2019上,C++)
- 使用while循环语句后,通过Switch开关来选择自己想要执行的程序,但是输入一个合乎规则的数字后,程序直接结束了,即一次性程序;
- 使用system(“pause”)后,执行没有暂停,会一直进行下去,也尝试过cin.ignore(),getchar(),但是都没有达到我想要的结果。
- 在循环内使用cin.ignore()后,虽然执行暂停了,但是选择代码块后,结果只有一种,即便多次输入也无济于事,如图:
标题
我的目的是:
- 程序可以由自己输入的数字来决定其执行语句,且没有遇到自己设置的停止符号(如代码中的数字“0”),程序便不会结束。
当然,鄙人学识有限,可能有描述不到位的地方,望各位大神能帮我指出来,在此,感激不尽!!!
鄙人所写代码如下:(其中有些内容是他人所提供的,就main函数是自己写的,如有侵权还请告知)
// 先序遍历的递归算法
#include<iostream>
#include <stdlib.h>
// #include<conio.h>
using namespace std;
typedef struct BiNode{ //二叉链表定义
char data;
struct BiNode *lchild,*rchild;
}BiTNode,*BiTree;
//用先序遍历的顺序建立二叉链表
void CreateBiTree(BiTree &T){
//按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
char ch;
cin >> ch;
if(ch=='#') T=NULL; //递归结束,建空树
else{
T=new BiTNode;
T->data=ch; //生成根结点
CreateBiTree(T->lchild); //递归创建左子树
CreateBiTree(T->rchild); //递归创建右子树
} //else
} //CreateBiTree
void PreOrderTraverse(BiTree T){
// 先序遍历二叉树T的递归算法
if(T==NULL); // 空二叉树
else{
cout<<T -> data; // 访问根结点
PreOrderTraverse(T -> lchild); // 递归遍历左子树
PreOrderTraverse(T -> rchild); // 递归遍历右子树
}
}
void InOrderTraverse(BiTree T){
//中序遍历二叉树T的递归算法
if(T){
InOrderTraverse(T->lchild);
cout << T->data;
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T){
// 后序遍历二叉树T的递归运算
if(T==NULL); // 空二叉树
else{
PostOrderTraverse(T -> lchild); // 递归遍历左子树
PostOrderTraverse(T -> rchild); // 递归遍历右子树
cout << T->data ; // 访问根结点
}
}
int NodeCount(BiTree T){
// 计算二叉树结点总数
if(T == NULL ) return 0;
else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
// 结点个数为左子树的结点个数+右子树的结点个数再+1
}
int main(){
BiTree tree;
cout<<"\n 请输入建立二叉链表的序列:"<<endl; //Inputing instance : A B C # # D E # G # # F # # #
CreateBiTree(tree);
// cout << "-------------------------------------" << endl;
cout << "-----------------------------------------------\n 请输入下列内容对应数字,"
"来选择您想执行的程序:\n-----------------------------------------------"
"\n 0:退出程序 \n 1:先序遍历 \n 2:中序遍历 \n 3:后序遍历 \n 4:二叉树结点总数 "
"\n -----------------------------------------------" << endl; // 输入内容提示
int num; // 定义变量,
cin >> num; // 然后将键盘输入数字赋值给它
while (num) {
if (isdigit(num)) { // 此处isdigit()用法有点迷惑,跟我网上查找的有点不一样
cout << "\n 输入为非数字类型,请从上述列表你想进行的功能对应数字序列选择合适数"
"字进行输入!!!\n " << endl;
break;
}
else { // 首先判断输入是否在规定的范围内,然后再执行Switch开关语句
if (0 <= num && num <= 4) {
switch (num) {
// Switch开关,和系统暂停配合用来多次选择执行输入的数字所代表的的程序
case 0:
cout << "\n 0,退出程序" << endl; exit(0); break;
case 1: {
cout << "\n 1,先序遍历的结果为:";
PreOrderTraverse(tree);
cout << endl;
break;
}
case 2: {
cout << "\n 2,中序遍历的结果为:";
InOrderTraverse(tree);
cout << endl;
break;
}
case 3: {
cout << "\n 3,后序遍历的结果为:";
PostOrderTraverse(tree);
cout << endl;
break;
}
case 4:
cout << "\n 4,二叉树结点总数:" << NodeCount(tree) << endl; break;
default:
_exit(0);
}
cin.clear(); // 在此处使用这两句代码时,虽然VS2019的控制
//台会暂停,但是会出现只能执行输入的数字和之后数字的代码的情况
cin.ignore(); // 因此,还是使用Dev编译器,使用system(“pause”)
}
else { // 当输入超过范围时就报以下内容
cout << "\n 您输入有误,请输入0-4的正整数!!!" << endl;
break;
cin.clear(num);
cin.ignore(num);
}
}
}
system("pause"); // 系统暂停,在VS中无法使用,可以在Dev编译器上使用
return 0;
// getchar(); // VS2019已经淘汰了这段代码,还有sleep()也淘汰了
// std::cin.ignore(); // 用错位置了,可以放在if中去
printf("\n\n谢谢您的使用,请按任意键退出\n\n\n");
}