Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Hätte ne Frage zum programmieren

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
20.06.2003, 17:45 Uhr
~modooo
Gast


Schreibe ein Programm, das eine positive ganze Zahl n einliest und
dann ein Karo aus Sternchen in 2n-1 Zeilen ausgibt.
Für n=4 ergibt sich z. B. die folgende Ausgabe:
*
***
*****
*******
*****
***
*

Kapseln Sie dabei geeignete Funktionalitaeten in Funktionen.

Wer kann mir denn dazu ein paar Tips geben.Weil ohne Ansatz krieg ich gar nix hin.Wäre echt net.

Dann hätte ich noch eine Frage "Was ist Implementieren?
Wie Implementiere
ich für alle Menuepunkte eine Funktion in dem folgendem Programm?


C++:
#include <iostream>
using namespace std ;


int main ()
{

char Buchstaben;
while(Buchstaben){ //beginn der while Schleife ohne b

cout << endl; //Platz schaffen

//Menue wird gestartet

cout << "Geben sie bitte die Buchstaben a,b,r oder u ein: ";
cin >> Buchstaben;


cout << endl ; //Platz schaffen
cout << endl ;


switch(Buchstaben) //Switch Umgebung fängt an
{

//Der erste Unterpunkt von Switch

case 'a':{cout << "Der vollständige Zeichensatz für den Integerbereich von -128 bis 127 lautet: " << endl;


cout << endl ;
cout << endl ; //Platz schaffen
cout << endl ;


for(int i=-128;i<128;i++) { //for Schleife
cout << char(i);
} //ende der for Schleife


cout << endl ; //Platz schaffen
cout << endl ;
cout << endl ;} break;

//Der zweite Unterpunkt von Switch

case 'r':{cout << "Geben sie bitte eine Dezimahlzahl ein: " ;
double zahl ;
cin >> zahl ;

if (zahl >=0) {
cout << "Die gerundete Dezimahlzahl lautet: "
<< int(zahl+0.5);
}

cout << endl ; //Platz schaffen
cout << endl ;

if (zahl <0) {
cout << "Die gerundete Dezimahlzahl lautet: "
<< int(zahl-0.5)<< endl;

cout << endl ; //Platz schaffen
cout << endl ;
}

}break;

//Der dritte Unterpunkt von Switch

case 'u':{cout << "Geben sie bitte einen Buchstaben ein: " ;
char zeichen ;
cin >> zeichen ;

if( zeichen >= 'A' && zeichen <= 'Z') {
cout << "Der Gegenbuchstabe lautet: " << char(tolower(zeichen))<< endl;
}

if( zeichen >= 'a' && zeichen <= 'z') {
cout << "Der Gegenbuchstabe lautet: " << char(toupper(zeichen))<< endl;
}

if (!(zeichen >= 'A' && zeichen <= 'Z'|| zeichen >= 'a' && zeichen <= 'z')) {
cout << "Fehler! Sie müssen einen Buchstaben eingeben. "<< endl;
}

}break;

//Der vierte Unterpunkt von Switch

case 'b':{return 0 ;}break;

//Der Unterpunkt von Switch wenn keine der ersten zutrift

default:{ cout << "Weder a,b,r,u wurde eingegeben.Sie müssen einen der am Anfang genannten Buchstaben eingeben um das Menü zu starten. "
<< endl;}break;

} //switch Umgebung beendet


} //while Schlife beendet

} //Programm beendet




Das wäre echt sehr nett.
Danke schon mal im Vorraus.

Dieser Post wurde am 20.06.2003 um 19:59 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.06.2003, 18:29 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Vermute mal das das so gemeint ist:


C++:
#include <iostream>
using namespace std ;


void a_pressed(){
    int i;
    cout << "Der vollständige Zeichensatz für den Integerbereich von -128 bis 127 lautet: " << endl << endl << endl << endl ;
    for(i=-128;i<128;i++) cout << char(i);
    cout << endl<< endl<< endl ;
}

void r_pressed(){
    double zahl ;
    cout << "Geben sie bitte eine Dezimahlzahl ein: " ;
    cin >> zahl ;

    if (zahl >=0) cout << "Die gerundete Dezimahlzahl lautet: " << int(zahl+0.5);
    else cout << "Die gerundete Dezimahlzahl lautet: "<< int(zahl-0.5)<< endl;
    cout << endl<< endl ;
}

void u_pressed(){
    char zeichen ;
    cout << "Geben sie bitte einen Buchstaben ein: " ;
    cin >> zeichen ;
    if(isalpha(zeichen)) cout << "Der Gegenbuchstabe lautet: " << char(zeichen^32)<< endl;
    else cout << "Fehler! Sie müssen einen Buchstaben eingeben. "<< endl;        

}

int main ()
{

    char Buchstaben;
    while(Buchstaben){ //beginn der while Schleife ohne b

        cout << endl; //Platz schaffen

        //Menue wird gestartet

        cout << "Geben sie bitte die Buchstaben a,b,r oder u ein: ";
        cin >> Buchstaben;


        cout << endl << endl;


        switch(Buchstaben){

            case 'a': a_pressed();break;

            case 'r': r_pressed();break;

            case 'u': u_pressed();break;

            case 'b': return 0;

            default: cout << "Weder a,b,r,u wurde eingegeben.Sie müssen einen der am Anfang genannten Buchstaben eingeben um das Menü zu starten. "    << endl;
            break;
        }

    }
return 0;

}


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.06.2003, 18:53 Uhr
~modooo
Gast


Nennt man das dann Implementierung?
Das Programm hab ich verstanden.
Ich wußte aber nicht das das Implementierung ist.

Und wie Schreibe ich ein Programm, das eine positive ganze Zahl n einliest und
dann ein Karo aus Sternchen in 2n-1 Zeilen ausgibt.
Für n=4 ergibt sich z. B. die folgende Ausgabe:
*
***
*****
*******
*****
***
*

Kapseln Sie dabei geeignete Funktionalitaeten in Funktionen.


Muß man das mit einer Schleife machen
Aber woher weiß ich wie viel Reihen es sind?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.06.2003, 19:18 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


hi,
man unterscheidet deklaration und implementation
in der deklaration definierst du wie deine methoden heissen, was sie für parameter übergeben bekommen und welche sie zurückliefern.
Die implementierung realisiert dann quasi die funktionalität deiner vorher deklarierten funktionen.
In der deklaration stellst du quasi eine black box auf von der du nur weiist was sie für eingaben hat und was sie darauf für ausgaben generiert.
In der Implementierung schreibst du dann eine möglichkeit der realisierung dieser funktion auf.
Der der dann später deine funktion benutzt den interessiert nicht wie du das implementiert hast sondern der will sie einfach nur benutzen

so zu deinem sternchen-problem habe ich dein programm mal ein bisschen erweitert, sorry das hatte ich am anfang irgendwie ein bisschen überlesen

hab das sternchenproblem dem buchstaben s zugeordnet.
Wenn du was nicht verstehst frag konkret was du nicht verstanden hast

Heiko


C++:
#include <iostream>
using namespace std ;


void a_pressed(){
    int i;
    cout << "Der vollständige Zeichensatz für den Integerbereich von -128 bis 127 lautet: " << endl << endl << endl << endl ;
    for(i=-128;i<128;i++) cout << char(i);
    cout << endl<< endl<< endl ;
}

void r_pressed(){
    double zahl ;
    cout << "Geben sie bitte eine Dezimahlzahl ein: " ;
    cin >> zahl ;

    if (zahl >=0) cout << "Die gerundete Dezimahlzahl lautet: " << int(zahl+0.5);
    else cout << "Die gerundete Dezimahlzahl lautet: "<< int(zahl-0.5)<< endl;
    cout << endl<< endl ;
}

void u_pressed(){
    char zeichen ;
    cout << "Geben sie bitte einen Buchstaben ein: " ;
    cin >> zeichen ;
    if(isalpha(zeichen)) cout << "Der Gegenbuchstabe lautet: " << char(zeichen^32)<< endl;
    else cout << "Fehler! Sie müssen einen Buchstaben eingeben. "<< endl;        

}


void s_pressed(){
int zahl,i,j;
cout << "Geben sie bitte eine Zahl ein: " ;
cin >> zahl;

for(j=-zahl+1;j<zahl;j++){
    cout << '*';
    for(i=1;i<zahl-abs(j);i++)cout << "**";
    cout <<endl;
}
    

}

int main ()
{

    char Buchstaben;
    while(Buchstaben){ //beginn der while Schleife ohne b

        cout << endl; //Platz schaffen

        //Menue wird gestartet

        cout << "Geben sie bitte die Buchstaben a,b,r,s oder u ein: ";
        cin >> Buchstaben;


        cout << endl << endl;


        switch(Buchstaben){

            case 'a': a_pressed();break;

            case 'r': r_pressed();break;

            case 'u': u_pressed();break;

            case 's': s_pressed();break;

            case 'b': return 0;

            default: cout << "Weder a,b,r,u wurde eingegeben.Sie müssen einen der am Anfang genannten Buchstaben eingeben um das Menü zu starten. "    << endl;
            break;
        }

    }
return 0;

}


--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 20.06.2003 um 19:36 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.06.2003, 19:50 Uhr
~0xdeadbeef
Gast


Was die Sternchen-Geschichte angeht:

C++:
#include <stdio.h>

/* Deklaration.
* Ab hier weiß der Compiler, dass es die Funktion gibt,
* aber noch nicht, was sie macht.
*/

void print_sternchen(int);
int lies_zahl();


/* Implementierung
* Hier wird festgelegt, was die Funktion macht
*/

void print_sternchen(int n) {
    int i,j;
    for(i = -n+1; i < n; ++i) {
        for(j=1; j <= 2*(n-abs(i))-1; ++j)
            printf("*");
        printf("\n");
    }
}

int lies_zahl() {
    int n;
    printf("Zahl eingeben: ");
    scanf("%d", &n); /* Hierher weißt du, wieviele Zeilen es sind. */
    return n;
}

int main(int argc, char *argv[]) {
    print_sternchen(lies_zahl());

    return 0;
}


Was die Kapselung angeht - wenn du dieselbe Funktionalität immer wieder brauchst, macht es keinen Sinn, dasselbe jedesmal wieder von Hand hinzuschreiben - dadurch wird der Code unübersichtlich. Stell dir zum Beispiel vor, du verwendest an hundert Stellen in deinem Programm dieselbe Funktionalität, und hast jedesmal wieder die 20 Zeilen Code dastehen. Jetzt ändern sich die Anforderungen, und du musst den Code ändern - du darfst an hundert Stellen hingehen und den Code von Hand umschreiben. Das ist zum einen ziemlich nervig, und zum anderen kann es leicht passieren, dass du eine Stelle vergißt und das Programm sich richtig merkwürdig verhält.

Um das zu umgehen, kapselst du die Funktionalität in eine Funktion, und schreibst an den Stellen, an denen sie gebraucht wird, nur noch hin, wo das Programm den Code findet, den es braucht. Wenn sich dann an der Funktion was ändert, musst du den Code nur einmal in der Funktion ändern.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.06.2003, 19:59 Uhr
~0xdeadbeef
Gast


Um ein Beispiel für die Kapselung zu geben - es könnte zum Beispiel sein, dass ich die Variable, der der Wert aus lies_zahl() zugewiesen werden soll, per Parameter zuweisen will. Ist in diesem Fall ein bisschen hergeholt, aber wenns um Strings geht, kommt sowas vor. lies_zahl könnte zum Beispiel so aussehen:

C++:
int lies_zahl(int *n) {
    printf("Zahl eingeben: ");
    scanf("%d", n);
    return *n;
}


in main sähe das dann so aus:

C++:
int n;
lies_zahl(&n);
print_sternchen(n);


Wenn jetzt allerdings jemand der Funktion lies_zahl Blödsinn übergibt - zum Beispiel einen NULL-Pointer - kommt es unter Umständen zu einem SIGSEGV (Allgemeine Schutzverletzung in Windows-isch). Es macht also Sinn, sich abzusichern. Das könnte dann so aussehen:

C++:
int lies_zahl(int *m) {
    int n;
    printf("Zahl eingeben: ");
    scanf("%d", &n);
    if(m != NULL) *m = n;
    return n;
}


Und damit hättest du dich mit einem Schlag gegen ne ganze Reihe Fehler abgesichert. Hättest du den Code stattdessen hundert mal irgendwo stehen - nach dem Motto 'sind ja nur vier Zeilen', hättest du richtig Tipparbeit leisten müssen.

Dieser Post wurde am 20.06.2003 um 20:12 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
20.06.2003, 20:37 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ja und ein weiterer vorteil als den krempel hundermal hinzuschreiben ist das du wenn du was änderst dies nur an einer stelle tun musst. Das verhindert fehler und arbeit
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.06.2003, 19:25 Uhr
~modooo
Gast


Hab ein kleines Problem.
Das programm mit den Sternchen läuft.
aber die Sternchen sind falsch angeordnet.
Sie sollen so sein.


*
***
*****
*******
*****
***
*

Wie muß ich das folgende programm umschreiben.

#include <iostream>
using namespace std ;



int main ()
{



int zahl,i,j;
cout << "Geben sie bitte eine Zahl ein: " ;
cin >> zahl;

for(j=-zahl+1;j<zahl;j++){
cout << '*';
for(i=1;i<zahl-abs(j);i++)cout << "**";
cout <<endl;

}
return 0 ;
}


Weil im moment gibt das Programm die Sternchen aus wie ganz oben.
Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.06.2003, 19:42 Uhr
~modooo
Gast


Also irgendwie kommt das mit den Sternen nicht so rüber.
Es soll eine Raute ergeben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.06.2003, 20:06 Uhr
~0xdeadbeef
Gast


Gut, dann musst du, bevor du mit den Sternchen anfängst, noch entsprechend viele Leerzeichen davorhängen:

C++:
void print_sternchen(int n) {
    int i,j;
    for(i = -n+1; i < n; ++i) {
        for(j=1; j <= abs(i); ++j)
            putchar(' ');
        for(j=1; j <= 2*(n-abs(i))-1; ++j)
            putchar('*');
        putchar('\n');
    }
}

 
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: