创建包含4个城市和每个城市温度的列表、向量或数组



我无法使这个程序正常工作。我们应该通过用户输入创建一个包含4个城市和每个城市温度的列表,向量或数组,我已经成功地添加了城市和温度,我们还必须保持温度在-60和+60之间,我也成功地做到了。程序的最后一部分是用户输入要搜索的温度,如果其中一个城市的温度存在,它应该写温度,有温度的城市和数组/向量/列表中的索引。我决定把它列成一个清单,因为我认为这是最简单的(也许我错了?)我似乎不能让线性搜索工作,虽然它总是做"返回-1";部分,只表示用户正在搜索的温度在任何索引中都不存在。

我已经尝试切换名称周围,如果有什么我做错了,但要么打破一切或给出相同的结果。我试着改变名字,我试着让线性搜索使用其他变量,看看我是否可能错误地标记了一些东西,但这只是打破了程序,当它达到代码中的那个点。我也试着移动代码块,看看它是否试图以错误的顺序访问它,但它产生相同的结果。

我是一个编程初学者,我在使用几个类和构造函数方面真的毫无价值,但因为这是我的家庭作业,我不得不这样做。还有ToSpring();我们必须在代码中包含的东西,课程上的每个人都在做我做的事情,因为它似乎已经过时了?也许我做错了什么?也许是构造函数本身但我是从课程文献中取的?不确定是否有效的信息,但我使用Visual Studio 2022。

我希望瑞典语不会让大家太迷惑,我已经试着用英语添加评论来描述它应该是什么或做什么。"Stad"意思是瑞典的城市,顺便说一句,如果这能澄清或帮助,因为这是构造函数和类的很大一部分?

class Stad
{
public string name;
public int temp;
public Stad()
{
}
public Stad(string name, int temp)
{
this.name = name;
this.temp = temp;
}
public string Name
{
get { return name; }
set { name = value; }
}
public int Temp
{
get { return temp; }
set { temp = value; }
}
public override string ToString()
{
return base.ToString();
}
}

class Program
{
static int LinearSearch(List<Stad> myList, int n) // linear search creation
{
for (int i = 0; i < Stad.Count; i++)
{
if (myList[i].Temp == n)
return i;
}
return -1;
}
static void Main(string[] args)
{
List<Stad> myList = new List<Stad>(); // list for cities and temperature
Stad myStad = new Stad();
Stad_1: // city 1
Console.WriteLine("Ange stad nummer 1"); // user input for city
myStad.Name = Console.ReadLine();
Console.WriteLine("Ange temperatur för stad nummer 1"); // user input for temp 
myStad.Temp = Convert.ToInt32(Console.ReadLine());
if (myStad.Temp >= 61) // what happens if temp is higher than 60 degrees
{
Console.WriteLine("Felaktigt värde var god välj en siffra mellan -60 och +60");
goto Stad_1;
}
else if (myStad.Temp <= -61) // what happens if temp is lower than -60 degrees
{
Console.WriteLine("Felaktigt värde var god välj en siffra mellan -60 och +60");
goto Stad_1;
}
else
{
Console.WriteLine("Ange stad nummer 2");
}

Stad_2: // see city 1 for details
myStad.Name = Console.ReadLine();
Console.WriteLine("Ange temperatur för stad nummer 2");
myStad.Temp = Convert.ToInt32(Console.ReadLine());
if (myStad.Temp >= 61)
{
Console.WriteLine("Felaktigt värde var god välj en siffra mellan -60 och +60");
goto Stad_2;
}
else if (myStad.Temp <= -61)
{
Console.WriteLine("Felaktigt värde var god välj en siffra mellan -60 och +60");
goto Stad_2;
}
else
{
Console.WriteLine("Ange stad nummer 3");
}

Stad_3: // see city 1 for details
myStad.Name = Console.ReadLine();
Console.WriteLine("Ange temperatur för stad nummer 3");
myStad.Temp = Convert.ToInt32(Console.ReadLine());
if (myStad.Temp >= 61)
{
Console.WriteLine("Felaktigt värde var god välj en siffra mellan -60 och +60");
goto Stad_3;
}
else if (myStad.Temp <= -61)
{
Console.WriteLine("Felaktigt värde var god välj en siffra mellan -60 och +60");
goto Stad_3;
}
else
{
Console.WriteLine("Ange stad nummer 4");
}

Stad_4: // see city 1 for details
myStad.Name = Console.ReadLine();
Console.WriteLine("Ange temperatur för stad nummer 4");
myStad.Temp = Convert.ToInt32(Console.ReadLine());
if (myStad.Temp >= 61)
{
Console.WriteLine("Felaktigt värde var god välj en siffra mellan -60 och +60");
goto Stad_4;
}
else if (myStad.Temp <= -61)
{
Console.WriteLine("Felaktigt värde var god välj en siffra mellan -60 och +60");
goto Stad_4;
}
else
{
Console.WriteLine("Tack");
}
// what temp to search for in the linear search
Console.Write("Ange temperatur att söka efter: ");
string str = Console.ReadLine(); 
int n = Convert.ToInt32(str);
int list = LinearSearch(myList, n);
// linear search printout
if (list == -1)
Console.WriteLine("Temperaturen finns ej");
else
Console.WriteLine("Staden med temperaturen " + n + " finns på index " + list + " och är " + myList[list].Name);
}
}

我不会给你一个完整的解决方案,因为这显然是课程作业。

但是我会给你一些建议。

  1. 不要使用"goto"使用循环代替。最好忘记它是被支持的。我将在后面给出一个如何避免使用goto的例子。

    goto"这是一种简单的方法,即使是简单的代码也会变得不可读,无法维护。这就是为什么很多c#开发人员根本不使用的原因。事实上,到目前为止,我已经编写了大约20年的c#代码,并且从来没有在产品代码中使用过一个goto。但是,当然,它有它的位置。只是在简单的日常代码中不是这样。如果你想使用它,你应该有一个很好的理由这样做。所以,这有点像"先学会爬,再学会走"。的事情。

  2. 如果用户输入不可解析,使用Convert.ToInt32(userInput)将使程序崩溃。用int.TryParse代替。

  3. 当前的实际问题是:您创建了Stad实例,但从未将它们添加到列表中。

所以我要做的(同时保持简单)是:

  1. 拆分您的"数据条目";部分。
List<Stad> myList = new List<Stad>();
for( int i = 0 ; i < 4; i++ ) // 4 times ...
{
myList.Add(GetStadFromUser()); // ... ask for a Stad and add it to your list.
}
// The Rest of your code should work now.

where GetStadFromUser is:

public static Stad GetStadFromUser()
{
var stad = new Stad();
do
{
// Get stad.Name with Console.ReadLine(); 
} while(string.IsNullOrWhiteSpace(stad.Name)); // Name should be not empty
do
{ 
// Ask User for Temperature
var userInput = Console.ReadLine();
if(!int.TryParse(userInput, out int temperature)) // could not be parsed
{
// TODO: User input was not a number => Tell him
continue; // Try again
}
else if( /*check temperature too high || too low*/ )
{
// TODO: Temperature out of range => Tell user and ...
continue; // try again
}
else
{
stad.Temperature = temperature;
break; // Success => break out of loop
}
}
while(true); 
// Stad is complete, now return it:
return stad;
}

您可以找到类似的模式来实现几乎任何类型的循环。你可以用do/while, while, for,…也许如果你已经有了各种类型的循环,你可以试着在它们之间切换。"Refactoring"这是一个学习的好方法,特别是在什么时候使用什么形式的循环。


最后一件事:你想知道,为什么你在搜索中没有成功。我应该怎么做才能找到错误:

static int LinearSearch(List<Stad> myList, int n) // linear search creation
{
// vv This would have told you, your list is empty.
Console.WriteLine("Performing search on List of size: {0}", myList.Count)
for (int i = 0; i < Stad.Count; i++)
{
if (myList[i].Temp == n) return i;
}
return -1;
}

花点时间熟悉断点和调试器是一个好主意,这在Visual Studio中真的是小菜一碟。

你可能想看看:教程:学习使用Visual Studio调试c#代码

尝试修改后的程序。主要和新的外推InputCity方法。

我用一个循环和新的可重用方法替换了输入城市数据的4个(几乎相同的)块。

我还修正了Convert的原始用法。带有适当int的ToInt32。TryParse(仅在InputCity中).

最后,新的循环现在将城市添加到myList中。

static void Main(string[] args)
{
List<Stad> myList = new List<Stad>(); // list for cities and temperature
const int NumCities = 4;
for (int ixCity = 1; ixCity <= NumCities; ixCity++)
{
Stad myStad = InputCity(ixCity);
myList.Add(myStad);
}
Console.WriteLine("Tack");
// what temp to search for in the linear search
Console.Write("Ange temperatur att söka efter: ");
string str = Console.ReadLine();
int n = Convert.ToInt32(str);
int list = LinearSearch(myList, n);
// linear search printout
if (list == -1)
Console.WriteLine("Temperaturen finns ej");
else
Console.WriteLine("Staden med temperaturen " + n + " finns på index " + list + " och är " + myList[list].Name);
}
private static Stad InputCity(int ixCity)
{
Console.WriteLine("Ange stad nummer {0}", ixCity); // user input for city
string name = Console.ReadLine();
while (true)
{
Console.WriteLine("Ange temperatur för stad nummer {0} ([{1}])", ixCity, name); // user input for temp 
int temp;
if (!int.TryParse(Console.ReadLine(), out temp))
{
Console.WriteLine("NOT A NUMBER");
continue;
}
if (temp >= 61) // what happens if temp is higher than 60 degrees
{
Console.WriteLine("Felaktigt värde var god välj en siffra mellan -60 och +60");
continue;
}
if (temp <= -61) // what happens if temp is lower than -60 degrees
{
Console.WriteLine("Felaktigt värde var god välj en siffra mellan -60 och +60");
continue;
}
Stad myStad = new Stad();
myStad.name = name;
myStad.Temp = temp;
return myStad;
}
}

最新更新