www.vorhilfe.de
Vorhilfe

Kostenlose Kommunikationsplattform für gegenseitige Hilfestellungen.
Hallo Gast!einloggen | registrieren ]
Startseite · Forum · Wissen · Kurse · Mitglieder · Team · Impressum
Forenbaum
^ Forenbaum
Status Vorhilfe
  Status Geisteswiss.
    Status Erdkunde
    Status Geschichte
    Status Jura
    Status Musik/Kunst
    Status Pädagogik
    Status Philosophie
    Status Politik/Wirtschaft
    Status Psychologie
    Status Religion
    Status Sozialwissenschaften
  Status Informatik
    Status Schule
    Status Hochschule
    Status Info-Training
    Status Wettbewerbe
    Status Praxis
    Status Internes IR
  Status Ingenieurwiss.
    Status Bauingenieurwesen
    Status Elektrotechnik
    Status Maschinenbau
    Status Materialwissenschaft
    Status Regelungstechnik
    Status Signaltheorie
    Status Sonstiges
    Status Technik
  Status Mathe
    Status Schulmathe
    Status Hochschulmathe
    Status Mathe-Vorkurse
    Status Mathe-Software
  Status Naturwiss.
    Status Astronomie
    Status Biologie
    Status Chemie
    Status Geowissenschaften
    Status Medizin
    Status Physik
    Status Sport
  Status Sonstiges / Diverses
  Status Sprachen
    Status Deutsch
    Status Englisch
    Status Französisch
    Status Griechisch
    Status Latein
    Status Russisch
    Status Spanisch
    Status Vorkurse
    Status Sonstiges (Sprachen)
  Status Neuerdings
  Status Internes VH
    Status Café VH
    Status Verbesserungen
    Status Benutzerbetreuung
    Status Plenum
    Status Datenbank-Forum
    Status Test-Forum
    Status Fragwürdige Inhalte
    Status VH e.V.

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Neuerdings beta neu
 Forum...
 vorwissen...
 vorkurse...
 Werkzeuge...
 Nachhilfevermittlung beta...
 Online-Spiele beta
 Suchen
 Verein...
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Dt. Schulen im Ausland: Mathe-Seiten:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "Schul-Informatik Algorithmen" - C-string umdrehen mit arrays
C-string umdrehen mit arrays < Algorithmen < Schule < Informatik < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Schul-Informatik Algorithmen"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

C-string umdrehen mit arrays: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 20:42 Sa 04.03.2006
Autor: MonoTon

Aufgabe
Das Programm soll ein Wort einlesen und dieses mit Hilfe von arrays umgekehrt ausgeben.

hier mein lösungsvorschlag, funktioniert nur leider nicht ganz so wie es sollte...


1:
2: /* SPEICHERTAUSCH mit 2 arrays (sa, mar 4th 2006 19:40) */
3:
4: #include <stdio.h>
5: #include <conio.h>
6: #include <string.h>
7:
8: void main ()
9: {
10:
11:   char array[30], tmp[30];
12:   int i, j, smax, k;
13:
14:   while(1)
15: {
16:   printf("Bitte ein Wort eingeben: \ n ");
17:   scanf("%s%*c",array);
18:
19:   for( i=0 ; array[i] ! = '\ 0' ;i++ );
20:
21: j=i;
22: smax=i;
23:
24: printf(" smax = %d\ n", smax );
25:
26:    for (i=j;i>0;i--)          /*Diese Schleife zieht von i 1 ab.*/
27:    {
28:      for (k=0;k>i;k++)       /*Diese schleife setzt k=0 und lässt k hochzählen*/
29:      array[i]=tmp[k];           /*während die i-Schleife runterzählt und damit*/
30:    }                     /*von hinten nach forne den string in tmp abspeichert*/
31:
32: printf("Das umgekehrte Wort lautet %d",tmp);
33:
34:
35: }
36:
37: }



Das Programm kann das Wort nicht rückwerts ausgeben, es gibt merkwürdiger Weise nur irgendeinen Zahlenwert aus. Bin für jede Hilfe dankbar!
mfg mono

        
Bezug
C-string umdrehen mit arrays: viel einfacher...
Status: (Antwort) fertig Status 
Datum: 11:01 So 05.03.2006
Autor: Karl_Pech

Hallo MonoTon,


[willkommenir]


Ich habe mir dein Programm genommen, und es soweit verändert, daß es funktioniert:


1:
2: /* SPEICHERTAUSCH mit 2 arrays (sa, mar 4th 2006 19:40) */  
3:  
4: #include <stdio.h>
5:  
6: int main(int argc, char* argv[])  
7: {
8:   char array[30], tmp[30];  
9:   int smax, k;  
10:  
11:   while(1)  
12:     {  
13:       printf("Bitte ein Wort eingeben:\n");
14:       scanf("%s%*c",array);
15:  
16:       for(smax=0; array[smax] != '\0'; smax++);
17:  
18:       printf("smax = %d\n", smax);
19:  
20:       tmp[smax] = '\0'; /* Wir benutzen smax, um das Ende des Wortes zu markieren. */
21:       for(k = smax-1; k >= 0; k--)   /* Diese schleife setzt k auf den letzten Buchstaben
22:    des Wortes und lässt k runterzählen */
23:
24: tmp[smax-k-1] = array[k];   /* hier wird von hinten nach forne der string in tmp abgespeichert */  
25:  
26:       printf("Das umgekehrte Wort lautet: %s\n",tmp);
27:     }
28:
29:   return 0;
30: }



Variablen wie j oder i waren bei dir letztlich nicht notwendig, smax hat jetzt die Funktion einer Markierung des Ende des eingegebenen Wortes und die äußere FOR-Schleife habe ich auch entfernt. Und dann hattest du da z.B. array[..] = tmp[..] statt tmp[..] = array[..] stehen, obwohl du nachher tmp ausgibst ;-); war aber wohl ein Versehen. Bis Zeile 18 funktioniert das Programm eigentlich wie bei dir. Danach kommt die Umkopierschleife. Die Anweisung in Zeile 20 markiert das Ende des neuen Wortes, welches ja mit dem Ende des Originalwortes identisch ist. Danach kommt eine Schleife die k runterzählt.
Also nochmal: von 0 bis smax-1 steht das eigentliche Wort; bei smax steht NULL. Die einzige Schwierigkeit hier ist die Kopiertgrenzen von tmp richtig zu wählen. Dazu reicht es aber den smax-1-ten (ersten) und 0-ten (letzten) Schritt der Kopieroperation zu betrachten. Es gilt:


smax-k-1 = smax-(smax-1)-1 = 0


Damit landet das smax-1-te Zeichen aus array auf der 0ten Position in tmp. Für k = 0 gilt: smax-k-1 = smax-1. Damit landet das 0-te Zeichen in array auf der smax-1ten Position in tmp und auf der smax-ten Position steht ja NULL, womit die Umkehrung erfolgt wäre.


Jetzt zu deiner Lösung:


> for (i=j;i>0;i--)          /*Diese Schleife zieht von i 1
> ab.*/
>     {
>       for (k=0;k>i;k++)       /*Diese schleife setzt k=0
> und lässt k hochzählen*/
>       tmp[k]=array;       /*während die i-Schleife
> runterzählt und damit*/
>     }                     /*von hinten nach forne den
> string in tmp abspeichert*/
>


Ok, die innere Schleife sieht für i = SMAX so aus:

for(k = 0; k > SMAX; k++)


Aber eigentlich dürfte er hier den Schleifenrumpf doch gar nicht mehr ausführen, denn 0 ist nicht größer als SMAX also ist die Schleifenbedingung sofort nicht mehr erfüllt. Selbst für i = 0 dürfte der Schleifenrumpf niemals ausgeführt werden, weil [mm]0 \not> 0[/mm] ist. Also müßte dort eher sowas wie k <= SMAX stehen. Im Übrigen wäre doch der i-te Index während die innere Schleife ausgeführt wird immer derselbe, also würde tmp bei jedem Durchlauf der äußeren Schleife mit denselben Zeichen gefüllt werden. [kopfkratz3]

Na ja, ich denke mit dem abgeänderten Programm bist Du jetzt erstmal ganz gut beraten. ;-)



Viele Grüße
Karl





Bezug
                
Bezug
C-string umdrehen mit arrays: thanks!
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 22:46 Do 23.03.2006
Autor: MonoTon

Dankeschön, hat mir sehr geholfen.
Aber auch ein paar andere Fragen aufgeworfen die sich inzwischen aber auch schon erledigt haben!
mfg
monoTon

Bezug
                
Bezug
C-string umdrehen mit arrays: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 15:33 Mo 23.11.2009
Autor: anna_h

Ich habe ein riesen Problem. Ich muss bis morgen ein c-programm schreiben das mir char umdreht.Den Code habe ich gegoogelt. Den habe ich ausprobiert und der klappt 1A :-)
Allerdings verstehe ich ihn nicht. Also was er macht schon, aber nicht jede einzelne Zeile. Ich nummeriere einfach mal meine fragen durch damit die sache nicht zu kompliziert wird.
1)Ist das ein reiner c-code, oder ist da c++ dabei?
2) Was macht diese zeile genau int main(int argc, char* argv[])  ? Vorallem was bedeutet das *?
3) die ausgaben sind nicht klar!!! Was bedeutet ("%s%*c",array),("smax = [mm] %d\n", [/mm] smax) und ("Das umgekehrte Wort lautet: [mm] %s\n",tmp). [/mm]
vorallem diese %buchstabe ist mir unklar.
4) Wo wird smax bestimmt?
Ich weiß das es nicht die feine englische Art ist einfach so die fragen hinzuschreiben ohne zu sagen was man weiß. Ich bin nur total im stress, da ich noch mehr aufgaben lösen muss.
100000000000 Dank für eure hilfe ;-)

Bezug
                        
Bezug
C-string umdrehen mit arrays: Antwort
Status: (Antwort) fertig Status 
Datum: 10:07 Di 24.11.2009
Autor: Karl_Pech

Hallo anna_h,


> Ich habe ein riesen Problem. Ich muss bis morgen ein
> c-programm schreiben das mir char umdreht.Den Code habe ich
> gegoogelt. Den habe ich ausprobiert und der klappt 1A :-)


Der Code, den du gefunden hast, stammte offenbar aus meiner Antwort zur obigen Diskussion. Deswegen habe ich den Code aus deiner Frage entfernt und die Frage hierhin verschoben.


>  1)Ist das ein reiner c-code, oder ist da c++ dabei?


Es kommt darauf an, was du unter "reinem c-code" verstehst. Z.B. akzeptieren manche älteren(?) Compiler nur folgende Möglichkeit Variablen zu deklarieren:


statt: int x,y,z;
schreibt man: int x;int y; int z; x=0;x=1;x=2;
(letzteres schreibt man, wenn man die Variablen noch mit Anfangswerten belegen möchte ("initialisieren").)


Als Antwort würde ich hier sagen: Es ist C-Quelltext und C++ sehe ich da nicht. (Wäre da C++ drin, sollte der Quelltext vom Compiler während der Übersetzung in Maschinensprache auch nicht akzeptiert werden.)


>  2) Was macht diese zeile genau int main(int argc, char*
> argv[])  ? Vorallem was bedeutet das *?


Lies dir z.B. []das hier durch. 'int argc' gibt die Anzahl der Parameter an mit denen ein Programm aufgerufen wird. Es sollte, wenn ein Programm ohne Parameter aufgerufen wurde, zumindest 1 sein, da der Programmname und pfad immer in argv[0] abgelegt werden. argv ist ein Array von Zeigern auf Variablen vom Typ char. Wenn du z.B. ein Programm abc mit dem Parameter def aufrufst: ./abc def . Erhälst du
argv[1] zeigt auf "abc\0" und *argv[1] wäre z.B. gleich 'a'.


>  3) die ausgaben sind nicht klar!!! Was bedeutet
> ("%s%*c",array),("smax = [mm]%d\n",[/mm] smax) und ("Das umgekehrte
> Wort lautet: [mm]%s\n",tmp).[/mm]
>  vorallem diese %buchstabe ist mir unklar.


Du kannst z.B. mit []dieser Lektüre hier anfangen. Bei scanf wird also eine ganze Zeichenkette ohne Whitespace eingelesen und jegliche nachfolgenden Zeichen im Eingabestrom werden verworfen. Es handelt sich um zwei Formatbezeichner:


%: hier fängt ein Formatbezeichner an
s: liest mehrere Zeichen hintereinander ein bis ein Leer-, Return- oder Tabulatorzeichen gefunden wird.

%: siehe oben
*: liest Daten aus dem Eingabestrom und verwirft sie ohne diese in irgendeine Variable abzulegen
c: liest genau ein zeichen ein


Genauso funktioniert es auch bei printf; Nur das printf Daten aus einer Variablen nach den Vorgaben des Formatstrings ausliest und diese dann ausgibt.


>  4) Wo wird smax bestimmt?


In Zeile 16 siehst du eine for-Schleife mit leerem Schleifenrumpf, die dazu gedacht ist, das Ende (bzw. die Länge) der umzukopierenden Zeichenkette array auszumachen.



Viele Grüße
Karl




Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Schul-Informatik Algorithmen"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
www.vorhilfe.de