使用整数范围的 Visual C# 切换命令 - 课程作业要求
Visual C# switch command using range of integers - course assignment requirement
首先,如果发布了两次,我深表歉意。我认为该网站可能已经打嗝了。
在我的 C# 课程中,我有一个显然不可能的临床试验药物应用要求。如果我对这部分作业的解释不正确(从讲义中逐字复制),请有人告诉我:
"MONTHS NUMBER OF TREATMENTS (use a Switch command)
1 -19 10 -30
20 - 39 31 -60
40 - 59 61 - 100
60 - 79 101 - 130
80 - 99 131 - 180
例如:
如果随机选择的月数是从 20 到 39 - 治疗次数将是从 31 到 60 的随机数。如果月数是 82 - 治疗次数是从 131 到 180。 “
患者可用于试验的月数直接输入到文本框中;我的代码提供了患者参与临床试验的随机实际月份。我已经知道范围不能用于开关命令。由于该讲师还教授 Visual Basic,它显然支持切换命令中的范围,因此她可能将两者搞混了(遗憾的是,这种情况发生的频率惊人)。无论如何,我读过的所有内容都表明这对于开关盒来说是完全不可能的。
我不知道如何在没有 if/else 树而不是开关的情况下完成此操作。谁能给我任何想法?请不要使用正则表达式或 LINQ。我们不涵盖任何一个。
这是我的所有代码。这里的东西有效; file read/write 还没有实现,但我已经理解了那部分。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
namespace NallyKProgram3ClinicalTrials
{
public partial class NallyKClinicalTrialsForm : Form
{
public NallyKClinicalTrialsForm()
{ InitializeComponent(); }
private StreamWriter outputFile;
private StreamReader inputFile;
int numberOfMonthsInTrialRangeInteger;
int numberAssignedToPatientInteger;
int numberOfMonthsInTrialInteger;
int numberOfTreatmentPlanInteger;
int numberOfTreatmentsInteger;
// const string CASE_STRING; this attempt didn't work
Random rndNumber = new Random();
Boolean duplicateNameBoolean;
private void NallyKClinicalTrialsForm_Load(object sender, EventArgs e)
{
reportLabel.ResetText();
removePatientButton.Enabled = false;
writeFileButton.Enabled = false;
}
private void addPatientButton_Click(object sender, EventArgs e)
{
if (patientNameTextBox.Text.Trim() != string.Empty)
{
checkForDuplicateNames();
generatePatientNumber(rndNumber);
if (duplicateNameBoolean == false)
{
if (numberOfMonthsTextBox.Text.Trim() != string.Empty)
{
if (int.TryParse(numberOfMonthsTextBox.Text.Trim(), out numberOfMonthsInTrialRangeInteger))
{
if (numberOfMonthsInTrialRangeInteger < 1 || numberOfMonthsInTrialRangeInteger > 99)
{
errorProvider1.SetError(numberOfMonthsTextBox, "The number of months available for participation in this trial must not be less than 1 or greater than 99.");
numberOfMonthsTextBox.Focus();
numberOfMonthsTextBox.SelectAll();
}
else
{
generateNumberOfMonthsInTrial(rndNumber);
generateTreatmentPlan(rndNumber);
// determineCaseString(); NOPE!
// determineNumberOfTreatments(rndNumber); TO DO
addToListBox();
addToNamesListBox();
readFileButton.Enabled = false;
removePatientButton.Enabled = true;
writeFileButton.Enabled = true;
}
}
else
{
errorProvider1.SetError(numberOfMonthsTextBox, "Please enter a number.");
numberOfMonthsTextBox.Focus();
numberOfMonthsTextBox.SelectAll();
}
}
else
{
numberOfMonthsTextBox.Text = " ";
errorProvider1.SetError(numberOfMonthsTextBox, "You must enter a number of months.");
numberOfMonthsTextBox.Focus();
numberOfMonthsTextBox.SelectAll();
}
}
else
{
errorProvider1.SetError(namesListBox, patientNameTextBox.Text + " is a duplicate name. Please enter a different name.");
patientNameTextBox.Focus();
patientNameTextBox.SelectAll();
}
}
else
{
patientNameTextBox.Text = " ";
errorProvider1.SetError(patientNameTextBox, "You must enter a patient name.");
patientNameTextBox.Focus();
patientNameTextBox.SelectAll();
}
}
private void checkForDuplicateNames()
{
int indexInteger = 0;
duplicateNameBoolean = false;
while (indexInteger < namesListBox.Items.Count)
{
if (patientNameTextBox.Text.ToLower().Trim() ==
namesListBox.Items[indexInteger].ToString().ToLower())
{
duplicateNameBoolean = true;
indexInteger = namesListBox.Items.Count;
}
indexInteger++;
}
}
private Random generatePatientNumber(Random rndNumber)
{
numberAssignedToPatientInteger = rndNumber.Next(1000, 9999);
return rndNumber;
}
private Random generateNumberOfMonthsInTrial(Random rndNumber)
{
numberOfMonthsInTrialInteger = rndNumber.Next(1, numberOfMonthsInTrialRangeInteger);
return rndNumber;
}
private Random generateTreatmentPlan(Random rndNumber)
{
numberOfTreatmentPlanInteger = rndNumber.Next(1, 5);
return rndNumber;
}
//private void determineCaseString() NOPE, NOPE, NOPE
//{
// if ((numberOfTreatmentPlanInteger >= 1) && (numberOfTreatmentPlanInteger < 20)) CASE_STRING = "a"; // clever, but error!
// if ((numberOfTreatmentPlanInteger >= 20) && (numberOfTreatmentPlanInteger < 40)) CASE_STRING = "b";
// if ((numberOfTreatmentPlanInteger >= 41) && (numberOfTreatmentPlanInteger < 60)) CASE_STRING = "c";
// if ((numberOfTreatmentPlanInteger >= 60) && (numberOfTreatmentPlanInteger < 80)) CASE_STRING = "d";
// if ((numberOfTreatmentPlanInteger >= 80) && (numberOfTreatmentPlanInteger < 100)) CASE_STRING = "e";
//}
//private Random determineNumberOfTreatments(Random rndNumber)
//{
// numberOfTreatmentsInteger = rndNumber.Next(10, CASE_STRING);
//}
private void addToListBox()
{
patientInformationListBox.Items.Insert(0, numberAssignedToPatientInteger.ToString() + "," + numberOfTreatmentPlanInteger + "," + numberOfMonthsInTrialInteger + "," + Environment.NewLine); // number of treatments goes after the final comma
}
private void addToNamesListBox()
{
namesListBox.Items.Insert(0, patientNameTextBox.Text.Trim());
}
private void exitButton_Click(object sender, EventArgs e)
{
this.Close();
}
private void removePatientButton_Click(object sender, EventArgs e)
{
if (patientInformationListBox.SelectedIndex > -1)
patientInformationListBox.Items.RemoveAt(patientInformationListBox.SelectedIndex);
else MessageBox.Show("You must select an entry you wish to remove from the list.", "SELECT AN ITEM TO REMOVE", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void patientNameTextBox_TextChanged(object sender, EventArgs e)
{
errorProvider1.SetError(patientNameTextBox, "");
errorProvider1.SetError(patientInformationListBox, "");
}
private void numberOfMonthsTextBox_TextChanged(object sender, EventArgs e)
{
errorProvider1.SetError(numberOfMonthsTextBox, "");
}
}
}
如果你必须使用开关,你可以将你的月份除以 20,然后再做一个开关。像这样:
int monthValue = numberOfTreatmentPlanInteger / 20;
switch (monthValue)
{
case 0:
// between 10 and 30 treatments
break;
case 1:
// between 31 and 60 treatments
break;
case 2:
// between 61 and 100 treatments
break;
// and so on
}
你说得对,C# 不允许你在 switch 语句中使用范围。事实上,C# 只允许你写一个 case X:
,其中 X
是一个单一的常量文字值。
但是,C# 确实允许您从一种情况跳转到另一种情况,因此允许您列出所有可以编写一个代码体来执行的情况。
因此,你可以这样写代码:
switch (months)
{
case 1:
case 2:
case 3:
...
case 19:
treatments = r.Next(10, 31);
break;
case 20:
case 21:
case 22:
...
case 39:
treatments = r.Next(30, 61);
break;
case 40:
...
现在,这是你能做的最好的了吗?
没有。您可以在此处注意到范围内的模式。每个范围从 X 到 X+19,其中 X 是可以被 20 整除的数字,因此您可以使用整数除法将向下截断的事实:
int monthsSection = months / 20; // 0-19 --> 0, 20-39 --> 1, etc.
switch (monthsSection)
{
case 0: // 0-19
treatments = r.Next(10, 31);
break;
case 1: // 20-39
treatments = r.Next(30, 61);
break;
case 2: // 40-59
...
是的,这也包括 0。如果这是一个问题,那么我会简单地在前面添加一个特定的 if 语句来过滤掉它。
首先,如果发布了两次,我深表歉意。我认为该网站可能已经打嗝了。
在我的 C# 课程中,我有一个显然不可能的临床试验药物应用要求。如果我对这部分作业的解释不正确(从讲义中逐字复制),请有人告诉我:
"MONTHS NUMBER OF TREATMENTS (use a Switch command)
1 -19 10 -30
20 - 39 31 -60
40 - 59 61 - 100
60 - 79 101 - 130
80 - 99 131 - 180
例如:
如果随机选择的月数是从 20 到 39 - 治疗次数将是从 31 到 60 的随机数。如果月数是 82 - 治疗次数是从 131 到 180。 “
患者可用于试验的月数直接输入到文本框中;我的代码提供了患者参与临床试验的随机实际月份。我已经知道范围不能用于开关命令。由于该讲师还教授 Visual Basic,它显然支持切换命令中的范围,因此她可能将两者搞混了(遗憾的是,这种情况发生的频率惊人)。无论如何,我读过的所有内容都表明这对于开关盒来说是完全不可能的。
我不知道如何在没有 if/else 树而不是开关的情况下完成此操作。谁能给我任何想法?请不要使用正则表达式或 LINQ。我们不涵盖任何一个。
这是我的所有代码。这里的东西有效; file read/write 还没有实现,但我已经理解了那部分。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
namespace NallyKProgram3ClinicalTrials
{
public partial class NallyKClinicalTrialsForm : Form
{
public NallyKClinicalTrialsForm()
{ InitializeComponent(); }
private StreamWriter outputFile;
private StreamReader inputFile;
int numberOfMonthsInTrialRangeInteger;
int numberAssignedToPatientInteger;
int numberOfMonthsInTrialInteger;
int numberOfTreatmentPlanInteger;
int numberOfTreatmentsInteger;
// const string CASE_STRING; this attempt didn't work
Random rndNumber = new Random();
Boolean duplicateNameBoolean;
private void NallyKClinicalTrialsForm_Load(object sender, EventArgs e)
{
reportLabel.ResetText();
removePatientButton.Enabled = false;
writeFileButton.Enabled = false;
}
private void addPatientButton_Click(object sender, EventArgs e)
{
if (patientNameTextBox.Text.Trim() != string.Empty)
{
checkForDuplicateNames();
generatePatientNumber(rndNumber);
if (duplicateNameBoolean == false)
{
if (numberOfMonthsTextBox.Text.Trim() != string.Empty)
{
if (int.TryParse(numberOfMonthsTextBox.Text.Trim(), out numberOfMonthsInTrialRangeInteger))
{
if (numberOfMonthsInTrialRangeInteger < 1 || numberOfMonthsInTrialRangeInteger > 99)
{
errorProvider1.SetError(numberOfMonthsTextBox, "The number of months available for participation in this trial must not be less than 1 or greater than 99.");
numberOfMonthsTextBox.Focus();
numberOfMonthsTextBox.SelectAll();
}
else
{
generateNumberOfMonthsInTrial(rndNumber);
generateTreatmentPlan(rndNumber);
// determineCaseString(); NOPE!
// determineNumberOfTreatments(rndNumber); TO DO
addToListBox();
addToNamesListBox();
readFileButton.Enabled = false;
removePatientButton.Enabled = true;
writeFileButton.Enabled = true;
}
}
else
{
errorProvider1.SetError(numberOfMonthsTextBox, "Please enter a number.");
numberOfMonthsTextBox.Focus();
numberOfMonthsTextBox.SelectAll();
}
}
else
{
numberOfMonthsTextBox.Text = " ";
errorProvider1.SetError(numberOfMonthsTextBox, "You must enter a number of months.");
numberOfMonthsTextBox.Focus();
numberOfMonthsTextBox.SelectAll();
}
}
else
{
errorProvider1.SetError(namesListBox, patientNameTextBox.Text + " is a duplicate name. Please enter a different name.");
patientNameTextBox.Focus();
patientNameTextBox.SelectAll();
}
}
else
{
patientNameTextBox.Text = " ";
errorProvider1.SetError(patientNameTextBox, "You must enter a patient name.");
patientNameTextBox.Focus();
patientNameTextBox.SelectAll();
}
}
private void checkForDuplicateNames()
{
int indexInteger = 0;
duplicateNameBoolean = false;
while (indexInteger < namesListBox.Items.Count)
{
if (patientNameTextBox.Text.ToLower().Trim() ==
namesListBox.Items[indexInteger].ToString().ToLower())
{
duplicateNameBoolean = true;
indexInteger = namesListBox.Items.Count;
}
indexInteger++;
}
}
private Random generatePatientNumber(Random rndNumber)
{
numberAssignedToPatientInteger = rndNumber.Next(1000, 9999);
return rndNumber;
}
private Random generateNumberOfMonthsInTrial(Random rndNumber)
{
numberOfMonthsInTrialInteger = rndNumber.Next(1, numberOfMonthsInTrialRangeInteger);
return rndNumber;
}
private Random generateTreatmentPlan(Random rndNumber)
{
numberOfTreatmentPlanInteger = rndNumber.Next(1, 5);
return rndNumber;
}
//private void determineCaseString() NOPE, NOPE, NOPE
//{
// if ((numberOfTreatmentPlanInteger >= 1) && (numberOfTreatmentPlanInteger < 20)) CASE_STRING = "a"; // clever, but error!
// if ((numberOfTreatmentPlanInteger >= 20) && (numberOfTreatmentPlanInteger < 40)) CASE_STRING = "b";
// if ((numberOfTreatmentPlanInteger >= 41) && (numberOfTreatmentPlanInteger < 60)) CASE_STRING = "c";
// if ((numberOfTreatmentPlanInteger >= 60) && (numberOfTreatmentPlanInteger < 80)) CASE_STRING = "d";
// if ((numberOfTreatmentPlanInteger >= 80) && (numberOfTreatmentPlanInteger < 100)) CASE_STRING = "e";
//}
//private Random determineNumberOfTreatments(Random rndNumber)
//{
// numberOfTreatmentsInteger = rndNumber.Next(10, CASE_STRING);
//}
private void addToListBox()
{
patientInformationListBox.Items.Insert(0, numberAssignedToPatientInteger.ToString() + "," + numberOfTreatmentPlanInteger + "," + numberOfMonthsInTrialInteger + "," + Environment.NewLine); // number of treatments goes after the final comma
}
private void addToNamesListBox()
{
namesListBox.Items.Insert(0, patientNameTextBox.Text.Trim());
}
private void exitButton_Click(object sender, EventArgs e)
{
this.Close();
}
private void removePatientButton_Click(object sender, EventArgs e)
{
if (patientInformationListBox.SelectedIndex > -1)
patientInformationListBox.Items.RemoveAt(patientInformationListBox.SelectedIndex);
else MessageBox.Show("You must select an entry you wish to remove from the list.", "SELECT AN ITEM TO REMOVE", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void patientNameTextBox_TextChanged(object sender, EventArgs e)
{
errorProvider1.SetError(patientNameTextBox, "");
errorProvider1.SetError(patientInformationListBox, "");
}
private void numberOfMonthsTextBox_TextChanged(object sender, EventArgs e)
{
errorProvider1.SetError(numberOfMonthsTextBox, "");
}
}
}
如果你必须使用开关,你可以将你的月份除以 20,然后再做一个开关。像这样:
int monthValue = numberOfTreatmentPlanInteger / 20;
switch (monthValue)
{
case 0:
// between 10 and 30 treatments
break;
case 1:
// between 31 and 60 treatments
break;
case 2:
// between 61 and 100 treatments
break;
// and so on
}
你说得对,C# 不允许你在 switch 语句中使用范围。事实上,C# 只允许你写一个 case X:
,其中 X
是一个单一的常量文字值。
但是,C# 确实允许您从一种情况跳转到另一种情况,因此允许您列出所有可以编写一个代码体来执行的情况。
因此,你可以这样写代码:
switch (months)
{
case 1:
case 2:
case 3:
...
case 19:
treatments = r.Next(10, 31);
break;
case 20:
case 21:
case 22:
...
case 39:
treatments = r.Next(30, 61);
break;
case 40:
...
现在,这是你能做的最好的了吗?
没有。您可以在此处注意到范围内的模式。每个范围从 X 到 X+19,其中 X 是可以被 20 整除的数字,因此您可以使用整数除法将向下截断的事实:
int monthsSection = months / 20; // 0-19 --> 0, 20-39 --> 1, etc.
switch (monthsSection)
{
case 0: // 0-19
treatments = r.Next(10, 31);
break;
case 1: // 20-39
treatments = r.Next(30, 61);
break;
case 2: // 40-59
...
是的,这也包括 0。如果这是一个问题,那么我会简单地在前面添加一个特定的 if 语句来过滤掉它。