Good evening everyone
I recently started learning C#. Since I have already studied C / C many times, and this semester I am studying Java, I thought that it would not be very difficult. But I ran into an unexpected problem.
The task is like this: "There are four persons. Person data is given in such format: name (string), height in meters (double) and weight in kilos (double). Create a class Person to store data about single person. Initial data is entered from keyboard (user input). Write a program that finds average weight of person and calculate which person is the lowest. If multiple persons are found to be the lowest, print them all. At least 3 custom methods must be implemented: for data input, calculation (-s) and for displaying results to the screen. Print initial data in table format, average weight and all data about the lowest person(-s) to console. Usage of an array of objects is not allowed."
The problem is that in the results table, I have fields Name, Height and Width. And for some reason, the height data is also written to the width field:
Write a person`s name-: Artem
Write a person`s height-: 1,81
Write a person`s weight-: 67
Write a person`s name-: Yaroslav
Write a person`s height-: 1,80
Write a person`s weight-: 65,5
Write a person`s name-: Ivan
Write a person`s height-: 1,78
Write a person`s weight-: 70
Write a person`s name-: Ann
Write a person`s height-: 1,78
Write a person`s weight-: 64
Write a person`s name-: x
-----------------------------------------------------------------
| Name | Height (m.) | Weight (kg.) |
-----------------------------------------------------------------
| Artem | 1,81 | 1,81(must be 67) |
-----------------------------------------------------------------
| Yaroslav | 1,80 | 1,80(must be 65,5) |
-----------------------------------------------------------------
| Ivan | 1,78 | 1,78(must be 70) |
-----------------------------------------------------------------
| Ann | 1,78 | 1,78(must be 64) |
-----------------------------------------------------------------
And I don't even know why this is happening.
Code:
using System;
using System.Collections.Generic;
namespace Person
{
internal class Program
{
class Person{
private string name;
private double width, height;
public Person(string name, double width, double height) {
this.name = name;
this.width = width;
this.height = height;
}
public string GetName() { return name; }
public double GetHeight() { return height; }
public double GetWidth() { return width; }
}
static void Main(string[] args)
{
string name;
double height, width;
int count = 0;
List<Person> person = new List<Person>();
for (int i = 0; ;i ) {
name = getName();
if (name == "X" || name == "x") {
break;
}
height = getHeight();
width = getWidth();
person.Add(new Person(name, height, width));
count ;
}
Console.WriteLine("-----------------------------------------------------------------");
Console.WriteLine("|\tName\t |\tHeight (m.)\t|\tWeight (kg.)\t|");
Console.WriteLine("-----------------------------------------------------------------");
for (int i = 0; i < count; i ) {
Console.WriteLine("| {0}\t |\t{2,8:f2}\t|\t{2,8:f2}\t|", person[i].GetName(), person[i].GetHeight(), person[i].GetWidth());
Console.WriteLine("-----------------------------------------------------------------");
}
double avg = SetAverageWidth(person, count);
Console.WriteLine("\nAvergae width-: {0:f2}", avg);
Lowest(person, count);
}
static string getName() {
Console.Write("\nWrite a person`s name-: ");
string name = Console.ReadLine();
return name;
}
static double getWidth(){
Console.Write("Write a person`s width-: ");
double width = double.Parse(Console.ReadLine());
return width;
}
static double getHeight(){
Console.Write("Write a person`s height-: ");
double height = double.Parse(Console.ReadLine());
return height;
}
static double SetAverageWidth(List<Person> person, int count)
{
double res = 0;
for (int i = 0; i < count; i )
{
//if (person[i] == null) { break; }
res = person[i].GetWidth();
}
return res / count;
}
static void Lowest(List<Person> person, int count) {
double max, min;
int i = 0;
max = min = count;
for (int j = 0; j < count; j ) {
if (person[i].GetHeight() > max)
max = person[i].GetHeight();
}
Console.WriteLine("\n-*-*-*-*-*-*-*-*-*-*-*-*- The Lowest -*-*-*-*-*-*-*-*-*-*-*-*-*- ");
Console.WriteLine("-----------------------------------------------------------------");
for (int j = 0; j < count; j ) {
if (person[j].GetHeight() == max)
{
Console.WriteLine("| {0}\t |\t{2,8:f2}\t|\t{2,8:f2}\t|", person[j].GetName(), person[j].GetHeight(), person[j].GetWidth());
Console.WriteLine("-----------------------------------------------------------------");
}
}
}
}
}
CodePudding user response:
Your format string only uses {0}
and {2}
. You're missing {1}
in line 50:
Console.WriteLine("| {0}\t |\t{2,8:f2}\t|\t{2,8:f2}\t|", person[i].GetName(), person[i].GetHeight(), person[i].GetWidth());
and line 106:
Console.WriteLine("| {0}\t |\t{2,8:f2}\t|\t{2,8:f2}\t|", person[j].GetName(), person[j].GetHeight(), person[j].GetWidth());
Change the second format string to {1,8:f2}
.
Other than that:
- check the order of arguments in the constructor of
Person
, you accidentally flipped width and height when you create a new person - read about properties. C# does not use
Get...()
andSet...()
methods like Java - check whether you want width or weight of the person
CodePudding user response:
public Person(string name, double width, double height) {
and
person.Add(new Person(name, height, width));
you have the arguments in the wrong order