Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Hilfe bei Adressverwaltungsprogramm

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
11.06.2010, 11:42 Uhr
ganandoor56



Hi,

ich programmiere mir gerade einen Adressverwaltungsprogramm.
Momentan versuche ich, leider erfolgslos, es so zu schreiben, dass die eingegebenen Daten automatisch einen leeren Arrey zugeordnet wird.
Siehe:


C++:
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <string.h>


using namespace std;

struct Adresse
{
    char *name;
    char *straße;
    char *stadt;
};

Adresse useradressen[11];

int i = 0;
int eingabe = 0;
int eingabe1 = 0, eingabe2 = 0;
char* name = new char [40];
char auswahl;

void main (void)
{
useradressen[i].name   = new char[80];
useradressen[i].straße = new char[80];
useradressen[i].stadt  = new char[80];



for(i = 0; i < 11; i++)
{
    useradressen[i].name    = new char[80];
    useradressen[i].straße  = new char[80];
    useradressen[i].stadt   = new char[80];
}

for ( i = 0; i < 11; i++ )
{
    useradressen[i].name   = strcpy(useradressen[i].name, "leer");
    useradressen[i].straße = strcpy(useradressen[i].straße, "");
    useradressen[i].stadt  = strcpy(useradressen[i].stadt, "");
}

do
{

cout << "Drücken Sie '1'Adresse einzugeben,..." << endl;
cin >> eingabe;

if (eingabe == 1)
{
    getchar();
    cout << "Bitte geben Sie 'leer' ein" << endl;
    gets (name);

        for ( i = 1; i < 11; i++ )
        {
            if (strcmp (useradressen[i].name, name) == 0)
            {
                cout << i << " ist noch leer. " << endl;
            }
        
                getchar();
                cout << "Bitte geben Sie ihren Namen ein:" << endl;
                gets (useradressen[i].name);

                cout << "Bitte geben Sie ihre Straße ein:" << endl;
                gets (useradressen[i].straße);

                cout << "Bitte geben Sie ihr Wohnort ein:" << endl;
                gets (useradressen[i].stadt);

                cout << "Deine Adresse lautet:" << endl;
                cout << useradressen[i].name    << endl;
                cout << useradressen[i].straße  << endl;
                cout << useradressen[i].stadt   << endl;
        }
}



Also ich habs mir so vorgestellt:
Ich gebe 'leer' ein, die For-Schleife durchkämmt den Arrey nach diesem leer, strcmp vergleicht die Eingabe, dann steigt es zu if um.
Jedoch habe ich festgestellt, dass es alle Fücher aufruft.

Gibt es irgendwelche Verbesserungsvorschläge?

Greetz

Dieser Post wurde am 11.06.2010 um 12:10 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.06.2010, 12:07 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,

benutz doch std::string statt dem ganzen pointer-gefummel, dann haste das problem nicht.

Weiterhin gibst du den mit new angelegten speicher am ende nicht mehr frei!


C++:
useradressen[i].name = strcpy(useradressen[i].name, "leer");


das ist doppelt gemoppelt:

C++:
strcpy(useradressen[i].name, "leer");


reicht aus!

dann solltest du deinen code korrekt einrücken, dann siehst du auch, das du dein name eingeben usw außerhalb des "ifs" machst. Wichtig ist dann, um aus der Schleife zu springen, wenn du ein leeres Element gefunden hast, ein "break"
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.06.2010, 10:18 Uhr
ganandoor56



Hi,

danke schön!
Auf break, wäre ich nie gekommen...
Was meinst du eigentlich mit "std::string"? Leider verstehe ich es nicht ganz wo und wie man es einsetzen muss. Welches Problem hätte ich dadurch nicht?
Eigentlich fange ich gerade an mit C++. ;-)

Und ich hätte da noch eine Frage:
Kann man irgendwie die Adressen nach Name alphabetisch anordnen?
Ich habe mir überlegt es mit strcmp in einer for-Schleife zu machen.
Ich befürchte aber, dass es nciht geht...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.06.2010, 12:43 Uhr
~f.-th.
Gast


Gemeint ist, du sollst statt der C-Header und -Funktionen die
C++ Varianten nutzen , wenn du C++ programmieren möchtest.

MfG f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.07.2010, 11:34 Uhr
ganandoor56



Hi,

momentan bin ich ja noch auf bestimmte Anzahl von Adressen beschränkt und es wird immer der Gleiche Speicher belegt.
Nun sollte ich in diesem Code dynamische Speicherreservierung durch Zeigern ändern.
Leider ist mir da irgendetwas unklar. Ich weiß nicht genau wo/wie ich anfangen soll.

Ich hoffe, dass Ihr mir wieder helfen könnt.

Gruß, ganandoor56

Dieser Post wurde am 15.07.2010 um 11:41 Uhr von ganandoor56 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.07.2010, 19:44 Uhr
Hans
Library Walker
(Operator)


Hi,

ohne eine genauere Beschreibung des Problems wird Dir da keiner weiter helfen können.
Ganz allgemein kann man dazu aber sagen, das es im einfachsten Fall auf eine verkettete Liste hinaus läuft, und Du den Speicher für jedes Element der Liste, d.h. für jede Adresse mit new anfordern, und am Ende mit delete wieder freigeben musst.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.07.2010, 21:40 Uhr
0xdeadbeef
Gott
(Operator)


Für mich klingt das nach einer std::deque oder einem std::set mit entsprechender Ordnung. Wenn du abschätzen kannst, wie viele Namen erwartet werden, tut's statt der std::deque auch ein std::vector. In beiden Fällen könnte das etwa so aussehen:

C++:
#include <algorithm>
#include <deque>
#include <iostream>
#include <locale>
#include <string>

struct adresse {
  std::string name;
  std::string strasse;
  std::string stadt;
};

bool compare_by_name(adresse const &lhs, adresse const &rhs) {
  return lhs.name < rhs.name;
}

std::string getline_prompt(std::string const &prompt) {
  std::string result;

  std::cout << prompt << std::flush;
  std::getline(std::cin, result);

  return result;
}

int main(int argc, char *argv[]) {
  std::deque<adresse> adressen;
  std::string line;

  do {
    adresse a;

    a.name    = getline_prompt("Name: "  );
    a.strasse = getline_prompt("Straße: ");
    a.stadt   = getline_prompt("Stadt: " );

    adressen.push_back(a);

    line = getline_prompt("Nochmal (J/N)? ");
  } while(!line.empty() && std::tolower(line[0], std::locale()) == 'j');

  std::sort(adressen.begin(), adressen.end(), compare_by_name);

  // adressen sind jetzt nach Name sortiert.
}


Mit std::set entfällt die explizite Sortierung natürlich.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 15.07.2010 um 21:41 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.07.2010, 23:08 Uhr
Hans
Library Walker
(Operator)


@Beefy: Das ist natürlich die Lösung, wie man sie als Fortgeschrittener oder Profi vorziehen würde. Aber so wie ich ihn verstehe, auch nach Posting 002 zu schliessen, soll er jetzt erst mal was über Speicherverwaltung und die damit verbundenen Probleme lernen, weshalb man die STL besser erst mal aussen vor lassen sollte.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
16.07.2010, 10:33 Uhr
ganandoor56



Hallo!
@ 0xdeadbeef: Leider bin ich noch nicht soweit, dass ich deinen Code komplett verstehen kann.
@ Hans: Ich poste jetzt mal die genaue Aufgabe hin:

"2.Mmmh, wenn Dir das lieber ist, schnapp Dir das Adressprogramm, oder was Du auch immer in den vorigen Übungen verwalten wolltest. Hier ist der Benutzer noch auf eine bestimmte Anzahl Adressen beschränkt, und es wird immer der gleiche Speicher belegt, egal, ob der Benutzer 3 oder 3000 Adressen eingeben möchte. Versuch das ganze mal mit dynamischer Speicherreservierung durch Zeiger.
Ein paar Tips: Merke Dir immer, wieviele Datensätze gespeichert sind. Wenn gelöscht wird, überschreibe den gelöschten Datensatz mit dem letzten in dem Array und verkleinere dann den Speicher um eins. Nicht elegant, aber im nächsten Kapitel werden wir eine schönere Methode kennenlernen."

Und... soll ich euch noch meinen kompletten Code hier rein posten?


Gruß, ganandor56
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
16.07.2010, 13:35 Uhr
Hans
Library Walker
(Operator)


Hi,

das klingt nach einem (Online?)Kurs, wo ein (möglicherweise virtueller) Lehrer den Stoff und die Aufgaben vorgibt. Aber das nur nebenbei. Was da verlangt wird ist folgendes: Du hast neben Deiner Adressstruktur:

C++:
struct Adresse
{
    char *name;
    char *straße;
    char *stadt;
};

einen Zeiger auf diese, also etwa:

C++:
Adresse *AdressPtr;

antelle von

C++:
Adresse useradressen[11];

Nun sollst Du damit versuchen, Deine Daten zu verwalten, wobei immer nur soviel Speicher belegt wird, wie auch Adressen eingegeben wurden. Wenn also nur eine Adresse eingegeben wurde, ist auch nur Speicher für eine Adresse belegt. Hast Du dagegen 10 Adressen eingegeben, ist auch Platz für 10 belegt.
Was dem Menschen da vorschwebt, ist folgendes: Du reservierst erst mal Speicher für einen Datensatz, d.h. eine Adresse. Wenn Du eine weitere eingeben willst, erweiterst Du den Platz um eins, so dass Du Platz für zwei Adressen reserviert hast. Das Spiel geht so lange, bis Du alle Adressen eingegeben hast. Wenn Du dann eine Adresse löschst, die sich irgendwo innerhalb dieses Speicherbereichs befindet, dann soll das Programm die Adresse, die am Ende des belegten Speichers steht, an die Stelle verschieben, wo Du zuvor gelöscht hast und anschliessend den Speicherplatz verkleinern. Im Ergebniss hast Du dann immer noch genau soviel Platz belegt, wie Du für die Adressen benötigst, nicht mehr und nicht weniger.
(Das ist übrigens wirklich keine elegante Lösung, aber eine gute Übung zur Speicherverwaltung. )

Ach ja: Da es sich um C++ handelt, sollten für die Aktionen zum Speicher anfordern und freigeben die "Befehle" bzw. Operanden new und delete in den Beispiellösungen auftauchen, so es welche gibt. Wenn dort dagegen malloc(), realloc() und free() auftauchen, handelt es sich nicht um C++ sondern um C, was ein unschönes und fehleranfälliges mischen der Sprachen bedeutet.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 16.07.2010 um 13:39 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: