Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Programmierproblem einer Anfängerin

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 <
000
06.07.2003, 20:12 Uhr
~vituel
Gast


Hallo kann mir vielleicht jemand bei dieser Aufgabe behilflich sein?

Leider bin ich nicht sehr weit gekommen, beginne gerade es in einem Schnellkurs zu lernen. also:

Eine Integer-Liste ist eine Folge von Integer-Werten. Beispiele für Integer-Listen: Leere Liste: < >, eine Liste mit zwei Elementen: < 2, 4 >, eine Liste kann Wiederholungen enthalten: <3, 3, 3, 7 >.

1. Definieren Sie einen Datentyp List für Integer-Listen mit maximal 12 Elementen.
2. Geben Sie für die Listen < >, < 2, 4 >, < 3, 3, 3, 7 > jeweils an, wie sie von Ihrem Datentyp dargestellt werden.
3. Erweitern Sie Ihren Datentyp List um eine Methode empty, die die Liste, für die sie aktiviert wird, leert. Die leere List kann also mit

List x; x.empty ( );
erzeugt werden.
4. Schreiben Sie eine freie Funktion emptyList die eine leere Liste erzeugt. Ein Beispiel für die Verwendung dieser Funktion ist:
Liste x ; x = emptyList ( ) ;
5. Schreiben Sie eine Methode append die einen übergebenen Integer-Wert an ihre Liste anhängt. Beispiel: Wenn x die Liste < 7, 9, 7 > darstellt, dann wird mit x.append ( 4 ) die Darstellung der Liste < 7, 9, 7, 4 > in x erzeugt.
6. Geben Sie die Abstraktionsfunktion und die Dateninvariante Ihrer Liste an.

Ok, hier mein Ansatz:
Zu 1:
typedef int List [ 12 ]

Zu 2:
List list1, list2, list3;
Liste list1 = {};
Liste list2 = {2, 4};
Liste list3 = {3, 3, 3, 7};

Zu 3:
struct List empty () {…

naja irgendwie komme ich nicht weiter, weiss auch nicht ob soweit alles richtig ist. würde mich über Antworten sehr freuen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.07.2003, 21:31 Uhr
Pablo
Supertux
(Operator)


Wie ich sehe, es handelt sich um C++, stimmt's?
Naja, du könntest eine Klasse nehmen.
Wenn du nur hast typedef int List[12] dann kannst du folgendes nicht tun:

C++:
List x;
// nehmen wir an, es gäbe schon Elemente in x
x.empty();



Dafür brauchst du mindestens einen Struct oder gleich eine Klasse.

Was ist per Definition leer?
Du könntest verkette Listen nehmen, oder ein Array oder vielleicht einen vector.
Wie soll denn eine leere Liste von ints aussehen? Nur nullen?

Ich hätte ein kleines Beispiel, sehr einfach, man müsste Kopierkonstruktoren und andere Operatoren überladen.

C++:
// liste.h
#ifndef __LISTE_H
#define __LISTE_H

class Liste
{
    public:
    int content[12];
    
    Liste(); // Konstruktor
    void empty();
    void print();
};
#endif
##############################################
// liste.cpp
#include "liste.h"
#include <stdio.h>
Liste::Liste()
{
    // Alles initialisieren
    // hier kannst du auf this-Pointer verzichten, ich benutze ihn immer
    this->empty();
}

void Liste::empty()
{
    for (int i=0; i<12; i++)
        this->content[i] = 0;
}

void Liste::print()
{
    printf("{");
    for(int i = 0; i<12; i++)
       printf("%d%s", i, i==11 ? "}\n" : ", ");
}
#########################################
// main.cpp
#include "liste.h"
int main()
{
    Liste x;
    for(int i=0; i<12; i++)
        x.content[11-i] = i+1;
    x.print();
    x.empty()
    x.printf();
}



Die Ausgabe soll sein:
{12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}

--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 06.07.2003 um 21:31 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.07.2003, 23:45 Uhr
~virtuel
Gast


- vielen dank für die schnelle antwort.
- also wir sind noch nicht soweit arrays oder klassen zu benutzen, es soll noch schlichtes anfängerprogrammierung sein
- auch keinen konstrukor oder zeiger
- vielleicht hilft dir diese infor weiter.

gruss
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.07.2003, 00:24 Uhr
virtuel



- ups hab mich vertan also arrays und konstruktor sind natürlich ok
- wir sollen erst mal lernen mit freien funktionen und methoden umzugehen, bevor wir ins richtige obejektorientierte gehen (also müssen wir noch mit typedef, struct und enum arbeiten)
- aber wir dürfen auf keinen fall jetzt schon mit klassen arbeiten, sieht vielleicht professioneller aus, aber soweit sind wir leider noch nicht
- vielen dank für deine mühe

gruss
v.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.07.2003, 02:10 Uhr
Pablo
Supertux
(Operator)


Hat mich schon gewundert ohne Arrays, ohne Klassen kann ich verstehen.
Wenn es C++ ist, dann kannst du class mit strcut vertauschen vertauschen. Ich weiß aber nicht, ob, wenn du typedef struct benutzt, Funktionen erlaubt sind, weil wenn du x.empty() haben willst, ist das eine Klasse bzw. struct oder union.

Eine andere Lösung ist wie gesagt Verkettete Listen. Verkettete Listen sind Klassen, die eine weitere Variable enthalten, deren Typ dam Typ der Klasse entspricht. Meistens ist diese ein Pointer, d.h. ein Zeiger auf das nächste Element. Somit kann man unendlich lange Listen erzeugen.

Wenn du aber eine Liste willst, die eine feste Länge hat und deren Länge dir bewusst ist, dann benutze ein Array.

Der folgende Code tut das, was ich schon gepostet habe, aber ohne Klasse, sondern mit typdef struct.

C++:
#include <stdio.h>

typedef struct Liste
{
    int list[12];
    void empty();
    void init();
    void print();
};

void Liste::empty()
{
    for(int i=0; i<12; i++)
      list[i] = 0;
}

void Liste::init()
{
    this->empty(); // ohne this-> geht nicht
    // müsstest 2 Mal empty schreiben, weil es
    // hier das 2 Mal wäre
}

void Liste::print()
{
    printf("{");
    for(int i=0; i<12; i++)
      printf("%d%s", this->list[i], i==11 ? "}\n" : ", ");
    
}

int main()
{
    Liste x;
    x.init();
    for(int i=0; i<12; i++)
      x.list[11-i] = i+1;
    x.print();
    x.empty();
    x.print();
}



Ich ich schon sagte, die Ausgabe ist:
{12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}


Ach so, vielleicht ist dir ein Rätsel was i==11 ? "}\n" : ", " tut.
Die meisten C/C++ Operatoren sind zweistellig, ? : ist 3 Stellig. Zuerst brauchen wir eine Bedingung, d.h. einen boolschen Ausdruck. In diesem Fall i == 11. Sollten wir schon am Schluss sein, dann muss keine Komma geschrieben werden sondern }. Wenn i==11 true (besser gesagt einen Wert ungleich 0) liefert, so wird zurüchgegeben, das was vor : steht, sonst das was nach : steht. In diesem Fall strings, deshalb %s im Format von printf.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 07.07.2003 um 02:14 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
07.07.2003, 10:36 Uhr
ao

(Operator)



Zitat:
virtuel postete
- ups hab mich vertan also arrays und konstruktor sind natürlich ok
- wir sollen erst mal lernen mit freien funktionen und methoden umzugehen, bevor wir ins richtige obejektorientierte gehen (also müssen wir noch mit typedef, struct und enum arbeiten)
- aber wir dürfen auf keinen fall jetzt schon mit klassen arbeiten, sieht vielleicht professioneller aus, aber soweit sind wir leider noch nicht
- vielen dank für deine mühe


Ihr dürft Konstruktoren benutzen, aber keine Klassen? Das verstehe ich nicht, Konstruktoren gibt es nur im Zusammenhang mit Klassen.

Ich greife mal deinen Ansatz auf:

C++:
typedef int Liste[12];


Das verschafft dir Platz für 12 int-Einträge, aber es fehlt noch die Information, wie viele dieser 12 Plätze besetzt sind, also ein AnzahlElemente. Da die Elemente und die Anzahl untrennbar zusammengehören, schlage ich vor, sie in einer Struktur unterzubringen:

C++:
#define MAXLEN 12
typedef struct
{
    int nElemente[MAXLEN];
    int nAnzahlElemente;
} TListe;


Jetzt kann man eine Variable vom Typ TListe deklarieren:

C++:
TListe Liste;


Die Funktion zum Leermachen der Liste könnte dann so aussehen:

C++:
void TListeEmpty (TListe* pListe)
{
    /* Hier mit pListe->... auf die Struktur-Members zugreifen.
        Wie wird wohl die Liste "leergemacht"? */

}



ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
07.07.2003, 11:19 Uhr
~virtuel
Gast


ok, super! hast mir schon sehr geholfen, wird sich bald rausstellen, ob die Lösung so gefordert war. werde auf jeden fall diesen ansatz benutzen. vielen dank!

gruss
v.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
07.07.2003, 14:04 Uhr
Pablo
Supertux
(Operator)


Es wird aber gesagt, man könne keine Zeiger verwenden, also

C++:
void TListeEmpty(TListe* pListe);


nicht erlaubt, oder?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
07.07.2003, 18:24 Uhr
ao

(Operator)


Ich fand die Aufzählung, was erlaubt ist und was nicht, eh ein bißchen wirr. struct sind erlaubt, und sie dürfen auch Methoden haben, aber class ist verboten. Dabei sind structs mit Methoden zu 98 % wie Klassen. Das ist nicht ganz logisch. Wahrscheinlich einfach ein Verständnisproblem.

Wenn es mit der Aufgabe noch Schwierigkeiten gibt, kann vituel ja noch mal genau sagen, was benutzt werden darf.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


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: