Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Hilfe! Klausuraufgabe

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 ] [ 3 ]
000
19.06.2004, 22:07 Uhr
~iboT
Gast


Hallo! Ich habe ein großes Problem. Folgende Aufgabe ist in einer Testklausur, leider habe ich nicht wirklich den Durchblick.

Hier das Programm:

C++:
#include <stdio.h>

char kette[100]="?Da'szn\1ist1w\2zr\1rrrzy1!To be or not to be";

void main(void)
{
    char *pChar;
    for (pChar= kette+1; *pChar && (*pChar !='T'); pChar++);
    {
        switch (*pChar)
        {
            case 'a':putchar('o'); continue;
            case '1':break;
            case  1 :pChar+=2; continue;
            case  2 :putchar('o'); pChar++;
            case 's':case 'z':continue;
            default :putchar(*pChar); continue;
        }
        putchar(' ');
    }
    putchar('\n');
}



Die Frage ist was das Programm ausgibt.

Meine Frage: Wie kommts dass in meiner C++ Version in einer Switch-Anweisung kein Continue erlaubt ist? (C++.NET)

Es wird nur ein 'T' ausgegeben, sonst nichts (wenn ich break schreibe statt continue). Aber warum? Das T ist doch Lauf-bzw Abbruchbedingung und hat erstmal nichts mit dem ganzen zu tun dachte ich.

Und wie siehts damit aus: case 's':case 'z':continue;
wird das als zwei getrennte case-Fälle gesehen, auch wenn nach dem ersten kein ; steht? ansonsten wäre das ja schwachsinn pur.

HILFE!!

Vielleicht hat mein Prof auch nur mal wieder 10000 Fehler gemacht, was nicht das erst mal wäre...

Besten Dank für eure Hilfe :-)
Noch 2 Wochen bis zur Prüfung :-(

Grüße


Bearbeitung:
code-Tags durch cpp-Tags ersetzt

Dieser Post wurde am 19.06.2004 um 22:16 Uhr von typecast editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.06.2004, 22:26 Uhr
typecast
aka loddab
(Operator)


Das Problem liegt nicht daran, dass das continue in der switch-Anweisung steht, sondern daran, dass nach der for-Schleife ein ; ist, der Block also nicht zur for-Schleife gehört.

case 's':case 'z':continue; Bedeutet, dass sowohl bei den Fällen s und z genau das selbe gemacht wird.

So mehr verrat ich nicht, sonst ist die Aufgabe schon gelöst und du hast keinen Spass mehr dran :-))))

Du kannst aus der Aufgabe gleich zwei Stück machen.

Erstens kanst du dir überlegen, was passiert, wenn du das continue durch breaks ersetzt.

Zweitens kannst du dir überlegen, was passiert, wenn du den ; nach dem Schleifenkopf wegnimmst.

Das ist eine gute Übung.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.06.2004, 22:41 Uhr
~iboT
Gast


Danke für die schnelle Antwort!!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.06.2004, 12:09 Uhr
~iboT
Gast


..und hier die nächste Aufgabe bei der ich grad nen Hänger hab...

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

int *iniFld( int fld[] ); //(1)
int *iniFld( int *pF   ); //(2)

void main()
{
    const int LNG=10;
    int fld[LNG];
    int *pf;
    pf = iniFld(pf); //(3)
    cout<<*pf;        //(4)
    cout<<pf;        //(5)
}

int *iniFld( int fld[] )
{
    for(int i=0; i<LNG; i++) fld[i]=i;
}




Frage: Welche der beiden Prototypen (1) oder (2) ist syntaktisch richtig?
Meine Vermutug: Syntaktisch sind beide richtig, aber nur die erste wird verwendet

Frage: In der Implementation von iniFld (Initialisierung eines Feldes) befinden sich 2 Fehler. Geben sie diese an! Welche Fehlereffekte erwarten sie?
Meine Vermutung: LNG wurde nicht übergeben, kann also nicht verwendet werden da es lokal in main deklariert wurde. Aber wo ist der 2te Fehler?

Aufgabe: Korrigieren sie so, dass in iniFld(...) die Feldinitialisierung für Felder beliebiger Länge erfolgt.
Mein Ansatz: int *fld anstatt int fld[]
Aber wie finde ich dann heraus wie viele Elemente das Feld beinhaltet? Gibts da ne Funktion dafür? Geht das mit sizeof? Oder muss ich das was bei sizeof(fld)rauskommt durch sizeof(int) teilen???

Frage: Was ist am Hauptprogramm main falsch (Zeile (3) )? Welche Fehlereffekte erwarten sie?
Meine Vermutung: müsste nicht fld anstatt pf übergeben werden?

Frage: WAs wird in Zeile (4) ausgegeben?
Meine Vermutungas erste Element, hier 0

Frage: Was wird in der Zeile (5) ausgegeben?
Meine Vermutung: Das komplette Feld.

In der Zeile int fld[LNG]; kommt noch ein Compilerfehler 'fld': Unreferenzierte lokale Variable. Leider hab ich keine Ahnnung warum :-(

Würde mich freuen wenn mir jemand helfen könnte :-D
Danke schonmal!!

Schönen Sonntag allerseits ;-)


Bearbeitung von typecast:
Wenn du statt den code-Tags die cpp-Tags benutzt, dann haben wir hier auch Syntaxhighlighnting (oder wie man das auch schreibt)

Dieser Post wurde am 20.06.2004 um 12:18 Uhr von typecast editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.06.2004, 12:28 Uhr
typecast
aka loddab
(Operator)


Erste Frage: Ack

Zweite Frage: Rückgabe int , erwartete Rückgabe int*

Dritte Frage: Auf keinen Fall int*, denn dann ergibt sizeof(fld) die anzahl der Bytes die ein Pointer belegt (auf 32-Bit Systemen 4 Byte). Bei int[] gibt sizeof() ebenfalls die Anzahl der Bytes an die insgesammt verbrauch wurden. Deshalb muss du (wie du schon gesagt hattest) sizeof(fld)/sizeof(int)

Vierte Frage: Ack. Was erwartest du?

Fünfte Frage: Ack

Sechste Frage: Leider nein. Es wird die Addresse des ersten Elementes ausgegeben.

Den Fehler hab ich nicht und kann ihn mir auch nicht erklären.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.06.2004, 12:29 Uhr
typecast
aka loddab
(Operator)


Übrigens fällt mir gerade auf, dass es sich dabei eigentlich um ANSI handelt, deshalb gehen wir auch mal in das passende Forum.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
20.06.2004, 12:54 Uhr
~iboT
Gast


Was meinst du mit Ack?

Wieso ist die Rückgabe denn int?

Zu Zeile (3): ich kann mir nicht so recht vorstellen was da passieren soll wenn man pf übergibt. Pf würde dann ja selbst inititalisiert werden?!

Wenn bei Zeile (5) aber die Adresse ausgegeben wird, warum erhalte ich dann bei folgendem Beispiel die Ausgabe

bcdefghijklmnopqrstuvwxyz
b


C++:
void main()
{
    char *zz;
    char werte[27]={"abcdefghijklmnopqrstuvwxyz"};
    zz=werte+1;
    cout<<zz<<endl;
    cout<<*zz<<endl;;
}



Müsste dann hier in der ersten Zeile nicht auch die Adresse ausgegeben werde? Wo ist da der Unterschied zum vorigen Beispiel?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
20.06.2004, 13:10 Uhr
Pablo
Supertux
(Operator)


void main???

nach ANSI soll int main heißen.
--
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
20.06.2004, 13:12 Uhr
typecast
aka loddab
(Operator)


Also mit Ack meine Acknowledge (Bestätigung)

Du hast recht. cout ist so implementiert, dass es direkt das ausgibt, was an der Speicherstelle steht. Mein Fehler.

Ich habe noch einen Feher gemacht. Der Rückgabewert ist nicht int sondern int* (ich habe da irgendwo ein return in der Funktion gelesen *nacheinemkaffeemschau*)
Der Rückgabewert ist undefiniert, kann also alles sein.
Das heißt, dass die beiden couts auf Speicher zugreifen können der ihnen nicht gehört (da der Rückgabewert undefinert ist...)

Was passiert wenn du pf der Funktion übergibst ist folgendes:

pf ist nicht definiert, kann also auf jeden bereich im Speicher zeigen. Wäre LNG mit 10 bekannt, dann würde er also an die Stelle wohin pf zeigt (unbekannt) die Zahlen 0 bis 9 hinschreiben.

Anschließend wird eine undefinierte Addresse an pf übergeben und versucht das auszugeben, was an dieser Addresse steht.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
20.06.2004, 13:13 Uhr
typecast
aka loddab
(Operator)



Zitat:
Pablo postete
void main???

nach ANSI soll int main heißen.



Looooool. Wenn das das einzige wäre, was an dem Programm falsch ist, dann wäre es ja nicht so schlimm
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ 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: