Anzeige

Falls aktueller Array Struct Wert kleiner als aktueller kleinster Array Struct Wert, dann ersetzen


#1
Hey Leute, ich weiß dass der Titel etwas verwirrt, ich konnte aber nichts besseres finden.

Folgende Aufgabenstellung:
Eingabe: Name, Automarke, Kilometerstand sowie Gesamtverbrauch (max 100 Personen).
Ausgabe: Jene Person mit dem sparsamstem Auto und Durchschnittsverbrauch pro 100 km.

Heißt nichts anderes als dass ich alle gespeicherten Informationen jener Person ausgeben soll, welche das sparsamste Auto hat. Um das mal anzugehen habe ich daran gedacht Array sowie Struct zu verwenden und die Eingabe mit einer for-Schleife mit von 1 bis 100 zu bewältigen. Jetzt weiß ich aber nicht wie es machen soll, falls der User gar nicht 100 Eingaben machen will und wie ich einer Variable konstant den kleinsten Verbrauch zuweise. Als Beispiel:

falls verbrauch von person 2 kleiner als verbrauch von person 1 dann deklariere der Variable den Wert verbrauch von person 2

Und das immer so weiter, so dass er das komplette Array durchgeht und den aktuellen Verbrauch mit dem nächsten im Array vergleicht und falls dieser kleiner ist dann ersetzen. Ich hoffe ihr versteht, was ich meine. Das ist jetzt an sich nicht schwer, aber mit was soll ich den ersten Verbrauch vergleichen, wenn die Variable noch gar keinen Wert hat?

Mein aktueller Code sieht bislang so aus:

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _59__2_
{
    class Program
    {
        struct person
        {
            public string name;
            public string marke;
            public double km;
            public double verbrauch;
            public double durchschnitt;
        }
        static void Main(string[] args)
        {
            //Array
            person[]person = new person[100 + 1];

            //Initialisierung
            int i;

            //for-Schleife
            for (i = 1; i <= 100; i = i + 1)
            {
                //Name
                Console.WriteLine("Bitte geben Sie den Namen der " + i + ". Person ein:");
                person[i].name = Console.ReadLine();

                //Automarke
                Console.WriteLine("Bitte geben Sie die Automarke der " + i + ". Person ein:");
                person[i].marke = Console.ReadLine();

                //Kilometerstand
                Console.WriteLine("Bitte geben Sie den Kilometerstand des Autos der " + i + ". Person ein:");
                person[i].km = double.Parse(Console.ReadLine());

                //Gesamtverbrauch
                Console.WriteLine("Bitte geben Sie den Gesamtverbrauch des Autos der " + i + ". Person ein:");
                person[i].verbrauch = double.Parse(Console.ReadLine());

                person[i].durchschnitt = person[i].verbrauch / person[i].km * 100;
            }

            Console.ReadKey();
        }
    }
}
Code ist für eine Consolenanwendung.

Ich bin in C# noch ein Anfänger, deshalb können manche Dinge die für mich schwer sind, für andere logisch sein.
 
Zuletzt bearbeitet:

sheel

I love Asm
#2
Hi

zuerst mal der bestehende Code:
a) Warum 100+1 und die Schleife ab 1, statt 100 und die Schleife ab 0 bis <100?
b) "int i;" ist keine Initialisierung, sondern eine Definition. Beim Initialisieren weist man das erste mal einen Wert zu.

Das Problem, wie viel Personen man einliest:
Man könnte vor der Schleife fragen, wie viel Personen es werden sollen (in einer do-while-Schleife so lange wiederholen bis ein gültiger Wert zwischen 0 und 100 eingegeben wird), und dann die Schleife bis zu dieser Zahl statt bis zu 100 laufen lassen.
Oder man könnte nach jeder Person fragen, ob noch eine Person eingegeben werden soll, und falls nein ein "break;" machen.

Zu der Findeschleife nach dem Einlesen:
Zuerst einmal prüfen ob überhaupt mindestens eine Person vorhanden ist. Wenn nein, die ganze Finderei gar nicht machen. Dann, ohne Schleife, der Variable (wo die kleinste Person ist) den Wert der ersten Person im Array zuweisen (deswegen muss zuerst geprüft werden, ob es überhaupt eine Person gibt). Und dann eine Schleife ab der zweiten Person machen, wo drin vergleichen wird.
 
#3
Na weil ich mit 100+1 die 0 ignoriere und es bei der Ausgabe komisch aussieht, wenn da steht: "0. Person".
Deine Idee mit der do-while Schleife habe ich bereits versucht, nur in der Art, dass ich frage, ob der Nutzer den Vorgang wiederholen möchte.

Code:
do
{
Console.WriteLine("Möchten Sie den Vorgang wiederholen? (J/N):");
antwort = Console.ReadLine();
} while (antwort == 'J')
Allerdings mag er dann antwort == 'J' nicht, da sich die Initialisierung der Variable antwort innerhalb der for-Schleife befindet. Deine andere Idee mit der Abfrage, wie viele Personen es werden sollen, könnte auch funktionieren. Bislang wäre mein Code demnach wie folgt:

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _59__2_
{
    class Program
    {
        struct person
        {
            public string name;
            public string marke;
            public double km;
            public double verbrauch;
            public double durchschnitt;
        }
        static void Main(string[] args)
        {
            //Deklaration
            int i, anzahl;
            double sparsam;

            //Anzahl an Personen
            Console.WriteLine("Wie viele Eingaben wollen Sie machen?");
            anzahl = int.Parse(Console.ReadLine());

            //Array
            person[] person = new person[anzahl + 1];

            //for-Schleife
            for (i = 1; i <= anzahl; i = i + 1)
            {
                //Name
                Console.WriteLine("Bitte geben Sie den Namen der " + i + ". Person ein:");
                person[i].name = Console.ReadLine();

                //Automarke
                Console.WriteLine("Bitte geben Sie die Automarke der " + i + ". Person ein:");
                person[i].marke = Console.ReadLine();

                //Kilometerstand
                Console.WriteLine("Bitte geben Sie den Kilometerstand des Autos der " + i + ". Person ein:");
                person[i].km = double.Parse(Console.ReadLine());

                //Gesamtverbrauch
                Console.WriteLine("Bitte geben Sie den Gesamtverbrauch des Autos der " + i + ". Person ein:");
                person[i].verbrauch = double.Parse(Console.ReadLine());

                person[i].durchschnitt = person[i].verbrauch / person[i].km * 100;
            }

            //Initialisierung
            sparsam = person[1].durchschnitt;

            for (i = anzahl; i <= 1; i = i - 1)
            if (person[i+1].durchschnitt < person[i].durchschnitt)
            {
                sparsam = person[2].durchschnitt;
            }

            Console.ReadKey();
        }
    }
}
Jetzt würde ich gerne wissen, wie ich die Abschnitte im Vergleich schrittweise um 1 erhöhen kann, um das komplette Array durch zu gehen? Vielleicht mit einer for-Schleife, die 2 durch i + 1 und die 1 mit i ersetzen?
 
Zuletzt bearbeitet:

sheel

I love Asm
#4
Zu:
C#:
do
{
    Console.WriteLine("Möchten Sie den Vorgang wiederholen? (J/N):");
    antwort = Console.ReadLine();
} while (antwort == 'J');
Wie wäre
C#:
do
{
    Console.WriteLine("Möchten Sie den Vorgang wiederholen? (J/N):");
    antwort = Console.ReadLine();
} while (antwort != 'j' && antwort != 'n');
if(antwort != 'j') break;
Der do-while-Teil ist dazu da, um die Gültigkeit der Eingabe zu prüfen,
nicht als Ersatz für die Bedingung der "großen" Schleife

Ähnlich dazu:
C#:
do {
    Console.WriteLine("Wie viele Eingaben wollen Sie machen? (1-100)");
    anzahl = int.Parse(Console.ReadLine());
} while(anzahl < 1 || anzahl > 100);
Zu dem Start bei 1 oder 0: EInfacher wäre es, bei 0 zu starten, und nur der der Ausgabe der x-ten Person den Wert +1 zunehmen..

Und zum untersten Teil: Wieder mit einer for-Schleife.
Außerdem muss der aktuelle Wert mit dem derzeit kleinsten verglichen werden, nicht mit dem vorigen.
Code:
sparsam = person[1].durchschnitt;
for (i = 2; i <= anzahl; i = i + 1)
{
    if (person[i].durchschnitt < sparsam )
        sparsam = person[i].durchschnitt;
}
 
#5
Könnte das funktionieren?

C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _59__2_
{
    class Program
    {
        struct person
        {
            public string name;
            public string marke;
            public double km;
            public double verbrauch;
            public double durchschnitt;
        }
        static void Main(string[] args)
        {
            //Deklaration
            int i, anzahl;
            double sparsam;

            //Anzahl an Personen
            Console.WriteLine("Wie viele Eingaben wollen Sie machen?");
            anzahl = int.Parse(Console.ReadLine());

            //Array
            person[] person = new person[anzahl + 1];

            //for-Schleife
            for (i = 1; i <= anzahl; i = i + 1)
            {
                //Name
                Console.WriteLine("Bitte geben Sie den Namen der " + i + ". Person ein:");
                person[i].name = Console.ReadLine();

                //Automarke
                Console.WriteLine("Bitte geben Sie die Automarke der " + i + ". Person ein:");
                person[i].marke = Console.ReadLine();

                //Kilometerstand
                Console.WriteLine("Bitte geben Sie den Kilometerstand des Autos der " + i + ". Person ein:");
                person[i].km = double.Parse(Console.ReadLine());

                //Gesamtverbrauch
                Console.WriteLine("Bitte geben Sie den Gesamtverbrauch des Autos der " + i + ". Person ein:");
                person[i].verbrauch = double.Parse(Console.ReadLine());

                person[i].durchschnitt = person[i].verbrauch / person[i].km * 100;
            }

            //Initialisierung
            sparsam = person[1].durchschnitt;

            for (i = 1; i <= anzahl; i = i + 1)
            {
                if (person[i].durchschnitt < sparsam)
                {
                    sparsam = person[i].durchschnitt;
                }
            }
        }
    }
}
 
Anzeige
Anzeige