嵌套while语句上的无限循环

时间:2020-02-07 04:19:52

标签: c# while-loop

我试图为C#控制台程序利用2个while循环。外部是重复程序菜单和功能,直到用户退出。我正在使用内部循环作为用户输入的验证(需要将其解析为int)。

内部循环似乎可以正常工作,但是一旦程序进入switch语句,它似乎就无限循环循环切换条件。因此,我相信外部的while循环使它不断地写入,而不是一次写入控制台。只有将flag设置为false的情况才会按预期停止。

有人可以解释发生了什么吗?我将如何更新标志,以便外部while循环不会无休止地执行开关中的功能?在所有情况下,程序都应返回到用户菜单并等待输入,除非用户选择7结束程序。我已经盯着这个看了好几个小时了。请指示我!

import React, {Component} from 'react';


import Button from '@material-ui/core/Button';
import TextField from '@material-ui/core/TextField';
import Dialog from '@material-ui/core/Dialog';
import DialogActions from '@material-ui/core/DialogActions';
import DialogContent from '@material-ui/core/DialogContent';
import DialogContentText from '@material-ui/core/DialogContentText';
import DialogTitle from '@material-ui/core/DialogTitle';


class FormDialog extends Component{
  constructor(props) {
    super(props);
    this.state = {edit: false,
      view: true,
      students: [
        { id: 1, name: 'Wasif', age: 21, email: 'wasif@email.com' },
        { id: 2, name: 'Ali', age: 19, email: 'ali@email.com' },
        { id: 3, name: 'Saad', age: 16, email: 'saad@email.com' },
        { id: 4, name: 'Asad', age: 25, email: 'asad@email.com' },
        { id: 5, name: 'kiwi', age: 20, email: 'kiwi@email.com' }
     ],
    };
    this.onSubmitHandle = this.onSubmitHandle.bind(this);
  }
  handleClose(){
    this.setState({view:!this.state.view})
  }
  onDeleteHandle() {let id = arguments[0];
    this.setState({students:this.state.students.filter(item => {if (item.id !== id)
       {return item;}})});}


onEditHandle(event) 
{   
this.setState({edit:true,id: arguments[0],name:arguments[1],age:arguments[2],email:arguments[3]});

}
onUpdateHandle(event){
  event.preventDefault();
  this.setState({students: this.state.students.map(item => {
    if (item.id === this.state.id){
      item['id'] = event.target.updatedItem.value;        
      item['name']=event.target.updatedItem1.value;
      item['age']=event.target.updatedItem2.value;
      item['email']=event.target.updatedItem3.value;
    }return item;})})
    this.setState({edit: false});
}

renderEditForm() {
  if (this.state.edit) {
  return <form onSubmit={this.onUpdateHandle.bind(this)}>
  <input type="text" name="updatedItem" className="item" defaultValue={this.state.id} />
  <input type="text" name="updatedItem1" className="item" defaultValue={this.state.name} />
  <input type="text" name="updatedItem2" className="item" defaultValue={this.state.age} />
  <input type="text" name="updatedItem3" className="item" defaultValue={this.state.email} />
  <button className="update-add-item">Update</button> 
  </form>    }  }

  onSubmitHandle(event) {

    event.preventDefault();
    this.setState({students: [...this.state.students, {id:event.target.id.value,name: event.target.item.value,age:event.target.xyz.value,email:event.target.email.value}]  })
      event.target.item.value = '';
      event.target.id.value = parseInt(event.target.id.value)+parseInt(1);
      event.target.email.value = '';
      event.target.xyz.value = '';
    }; 


      render() {

      return (
        <div> 
          <Dialog  fullWidth open={this.state.view} onClose={this.handleClose.bind(this)}>
            <DialogTitle>Sign Up Provide Details</DialogTitle>
            <DialogContent>
            {this.renderEditForm()} 

              <DialogContentText>
                <div>    

                <form onSubmit={(e)=>this.onSubmitHandle(e)}>              

             <label >ID</label>
                   <input type="number"  name="id" className="item"  />
                 <label>Name</label>
                   <input type="text" name="item" className="item"  />
                   <label>age</label>
                   <input type="number" name="xyz" className="item"  />
                   <label>email</label>
                   <input type="text" name="email" className="item"  />  
                   <button className="btn-add-item">Add</button>                 
                   <table>{this.state.students.map(abc =>  (<tr><td>{abc.id}</td><td>{abc.name}</td><td>{abc.age}</td><td>{abc.email}</td>

                    <button onClick={this.onEditHandle.bind(this,abc.id,abc.name,abc.age,abc.email)}>Edit</button>
                    </tr>))}</table>
                    </form>
                    </div>

                </DialogContentText>

                </DialogContent>
                <DialogActions>

          <Button onClick={this.handleClose.bind(this)} color="primary">
            Cancel
          </Button>



                </DialogActions>
                </Dialog>         


          </div>

      );

  }
}

export default FormDialog;

2 个答案:

答案 0 :(得分:1)

尝试添加

inputvalue="";

之后

caseSwitch = Convert.ToInt32(inputvalue);

答案 1 :(得分:1)

只需让您的程序运行,请执行以下更改,

在检查如下所示的用户输入之前,重置inputvalue和caseSwitch的值,

...
...
do
            {
                inputvalue = "";
                caseSwitch = 0;
                // repeat menu until user input can be parsed into an integer
                while (!int.TryParse(inputvalue, out caseSwitch))
                {
...
...

而且,下面的语句也不是必需的

caseSwitch = Convert.ToInt32(inputvalue);

其他问题是

在所有功能中,它都在要求用户输入,但是输入未在任何变量中使用或存储。

即使在诸如CalculateParallelogram,CalculateRhombus之类的某些功能中,也要求用户输入长度和高度这两个值,并且只接受一个输入以及太单一的键(Console.ReadKey())。

因此将ReadKey更改为ReadLine并在需要输入的地方输入两个内容。 此代码中还有其他逻辑问题需要改进。