satz in char satz [50] einlesen

Schnelle objektorientierte, kompilierende Programmiersprache.
Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Re: satz in char satz [50] einlesen

Beitrag von Empire » Do Jun 25, 2009 6:39 pm

ich hab jetzt das:

Code: Alles auswählen

#include <stdio.h>
#include <iostream>

int s;
int wort;
char k [25];
char wort1 [25], wort2 [25], wort3 [25], wort4 [25], wort5 [25], wort6 [25], wort7 [25], wort8 [25], wort9 [25], wort10 [25], wort11 [25], wort12 [25], wort13 [25], wort14 [25], wort15 [25], wort16 [25], wort17 [25], wort18 [25], wort19 [25], wort20 [25], wort21 [25], wort22 [25], wort23 [25], wort24 [25], wort25 [25];

void pi()
void change()

void change ()
{
  switch (wort)
  {
    case 0: k= wort1;
            break;
    case 1: k= wort2;
            break;
    case 2: k= wort3;
            break;
    case 3: k= wort4;
            break;
    case 4: k= wort5;
            break;
    case 5: k= wort6;
            break;
    case 6: k= wort7;
            break;
    case 7: k= wort8;
            break;
    case 8: k= wort9;
            break;
    case 9: k= wort10;
            break;
    case 10: k= wort11;
            break;
    case 11: k= wort12;
            break;
    case 12: k= wort13;
            break;
    case 13: k= wort14;
            break;
    case 14: k= wort15;
            break;
    case 15: k= wort16;
            break;
    case 16: k= wort17;
            break;
    case 17: k= wort18;
            break;
    case 18: k= wort19;
            break;
    case 19: k= wort20;
            break;
    case 20: k= wort21;
            break;
    case 21: k= wort22;
            break;
    case 22: k= wort23;
            break;
    case 23: k= wort24;
            break;
    case 24: k= wort25;
            break;
  }
}

int main ()
{
  printf ("Geben sie ihre Frage ein:");
  scanf ("%[^ ]", &wort1);
  if (wort1=="?") goto auswerten;
  scanf ("%[^ ]", &wort2);
  if (wort2=="?") goto auswerten;
  scanf ("%[^ ]", &wort3);
  if (wort3=="?") goto auswerten;
  scanf ("%[^ ]", &wort4);
  if (wort4=="?") goto auswerten;
  scanf ("%[^ ]", &wort5);
  if (wort5=="?") goto auswerten;
  scanf ("%[^ ]", &wort6);
  if (wort6=="?") goto auswerten;
  scanf ("%[^ ]", &wort7);
  if (wort7=="?") goto auswerten;
  scanf ("%[^ ]", &wort8);
  if (wort8=="?") goto auswerten;
  scanf ("%[^ ]", &wort9);
  if (wort9=="?") goto auswerten;
  scanf ("%[^ ]", &wort10);
  if (wort10=="?") goto auswerten;
  scanf ("%[^ ]", &wort11);
  if (wort11=="?") goto auswerten;
  scanf ("%[^ ]", &wort12);
  if (wort12=="?") goto auswerten;
  scanf ("%[^ ]", &wort13);
  if (wort13=="?") goto auswerten;
  scanf ("%[^ ]", &wort14);
  if (wort14=="?") goto auswerten;
  scanf ("%[^ ]", &wort15);
  if (wort15=="?") goto auswerten;
  scanf ("%[^ ]", &wort16);
  if (wort16=="?") goto auswerten;
  scanf ("%[^ ]", &wort17);
  if (wort17=="?") goto auswerten;
  scanf ("%[^ ]", &wort18);
  if (wort18=="?") goto auswerten;
  scanf ("%[^ ]", &wort19);
  if (wort19=="?") goto auswerten;
  scanf ("%[^ ]", &wort20);
  if (wort20=="?") goto auswerten;
  scanf ("%[^ ]", &wort21);
  if (wort21=="?") goto auswerten;
  scanf ("%[^ ]", &wort22);
  if (wort22=="?") goto auswerten;
  scanf ("%[^ ]", &wort23);
  if (wort23=="?") goto auswerten;
  scanf ("%[^ ]", &wort24);
  if (wort24=="?") goto auswerten;
  scanf ("%[^ ]", &wort25);
  if (wort25=="?") goto auswerten;


  change();
  switch (k)
  {
    case "Pi": pi ();
  }


  auswerten:

  printf (" %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s", wort1[0], wort2[0], wort3[0], wort4[0], wort5[0], wort6[0], wort7[0], wort8[0], wort9[0], wort10[0], wort11[0], wort12[0], wort13[0], wort14[0], wort15[0], wort16[0], wort17[0], wort18[0], wort19[0], wort20[0], wort21[0], wort22[0], wort23[0], wort24[0], wort25[0]);

  return 0;
}
leider macht mir codeblocks ein strich durch die rechnung:

C:\Dokumente und Einstellungen\Steffen\Desktop\Untitled1.c|10|error: expected initializer before "void"|
C:\Dokumente und Einstellungen\Steffen\Desktop\Untitled1.c||In function `int main()':|
C:\Dokumente und Einstellungen\Steffen\Desktop\Untitled1.c|124|error: `change' was not declared in this scope|
C:\Dokumente und Einstellungen\Steffen\Desktop\Untitled1.c|125|error: switch quantity not an integer|
C:\Dokumente und Einstellungen\Steffen\Desktop\Untitled1.c|127|error: `pi' was not declared in this scope|
||=== Build finished: 4 errors, 0 warnings ===|

kann mir jemand helfen?

mfg
Empire

PS: jetzt wisst ihr warum ich funktionen hasse :(

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: satz in char satz [50] einlesen

Beitrag von Dirty Oerti » Do Jun 25, 2009 6:52 pm

Du willst also eine Art "BOT" (mal im weitesten Sinne, ich weiß ja nicht, welchen Anwendungszweck dein Programm haben soll) programmieren :)
Sicher keine einfache Aufgabe. Aber sicher auch schaffbar :)

Worum es uns hierbei geht (ich nehm mir mal raus, von "uns" zu sprechen):

Damit du dein Ziel (=ein BOT bzw Sprachanalysator) erreichen kannst musst du funktionierenden Code produzieren.
Dazu musst du programmieren können :) Nun kann man das ja nicht einfach so, sondern muss man über lange Zeit lernen.

Deswegen geben wir die hier Anregungen, bzw Ratschläge, wie du deinen Code besser schreiben kannst.
Besser im Sinne von leichter verständlich, und vorallem für dich besser wartbar.

Wie Xin (und ich davor auch schon) also schon sagte:
Nimm lieber EIN einziges Array.

Nun liest du deine Frage ein.
Dann lässt du dir die Frage unterteilen, z.B. eben von strtok (siehe Link).
Damit bekommst du die einzelnen Wörter heraus :)
Und die speicherst du in EINEM Array.
(char **woerter).
Dieses Array ist ein Array aus Zeigern, von denen jeder auf EIN Wort zeigen kann.

Du zählst jetzt, wieviele Wörter du hast. Wie du das machst, dazu fällt dir bestimmt etwas ein :)
Wenn du weißt, wieviele Wörter du hast, dann kannst du genau so viel Speicher für Zeiger reservieren.

Code: Alles auswählen

woerter = (char **)malloc (sizeof (char *) * anzahl_woerter);
Jetzt kannst du die einzelnen Wörter (bzw Zeiger auf ihre Adressen) in diesem Array speichern.

Code: Alles auswählen

char * wort = //z.b. von strtok
woerter[5] = wort; (um z.B. das 6. Wort zu speichern.)
Und jetzt ist es egal, wie viele Wörter dein Benutzer eingibt, oder wie lang der Satz ist.
Du hast sie dann alle schon ordentlich in einem Array, auf das du dann z.B. mit Schleifen zugreifen kannst.
Dann kannst du z.B. das Array nach einem Wort "Name" durchsuchen (strcmp).
Was du dann damit anfängst ist deine Sache :)


------------------- (das soll nicht heißen, dass du das da oben nicht liest!)------------

Zu deinem letzten Beitrag:

Erstmal:
void funktion();
Wenn du die Funktion nur deklarierst, nicht definierst (= wenn { ... CODE ...} dahinter ist) muss hinter die Deklaration ein Semikolon ;
Deswegen werden deine Funktionen auch nicht vom Compiler "anerkannt".

Das ist kein Manko an Funktionen.. ;)

Code: Alles auswählen

change();
  switch (k)
  {
    case "Pi": pi ();
  }
Das geht nicht. Du kannst mit Case nur "Zahlen" miteinander vergleichen.
Außerdem: Warum ein case, wenn nur ein Fall eintreten kann? Benutz doch ein if :)

In dem Fall müsstest du also zwei Strings vergleichen (strcmp).

Außerdem: Was bringt dir die Funktion change? In ihr wird überprüft, welches Wort du willst, und das über das int wort. Sagst du aber irgendwo in deinem Code, welches Wort du willst? Gibst du wort irgendwo einen Wert...? Woher weißt du, welches Wort du möchtest?

Dann: Wo ist die Funktion pi() ?

Nächstes: Du hast immernoch zig tausend Arrays (Char-Arrays, also Strings, die wortX Dinger eben ;) ).
Was machst du, wenn meine Frage 26 Wörter lang ist...?

Glaub mir (uns) :)
SO wird das nichts.
Ich würde dir fast schon raten, dich an etwas einfacheres zu machen (vorerst), aber ich denke, aus Fehlern lernt man.

=> Nimm EIN Array!

Dann sind übrigens auch die gotos weg :)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: satz in char satz [50] einlesen

Beitrag von Xin » Do Jun 25, 2009 6:54 pm

Empire hat geschrieben:Ich will dass das progg auf fragen antwortet!
Dazu muss das progg den satz auf schlüsselworte durch suchen.
Kein Problem.
scanf() und goto sind dafür eher suboptimal.

Beschäftige Dich mit strtok und dann kannst Du nach Schlüsselwörtern suchen. (Am besten mit strcmp).
Empire hat geschrieben:Wer jetzt versucht mir das auszureden/ seine metohde auf drehen will / oder mich auslachen will kann sich das sparen.
Hab ich schon alles gehört.
Danke!
(nur zur vorsorge(ich habs langsam sat))
Ich habe keine Ahnung, wie Dein Plan ist, aber ich wüßte nicht, was gegen ihn spricht. In allen Fällen wirst Du Erfahrung sammeln.

PS: gar nicht gesehen, dass da eine 2. Seite ist... aber zumindest ist schon eine Antwort da :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Re: satz in char satz [50] einlesen

Beitrag von Empire » Do Jun 25, 2009 7:13 pm

Das switch ist da weil ich das "wissen" des "BOT" später erweitern will.
da ich baber erstmal wissen will ob das so funkt wie ich mir das vorstelle gehe ich erstmal nur auf pi ein da ich wesentich weniger arbeit reingesteckt habe wenns nicht funkt.

mfg
Empire

Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Re: satz in char satz [50] einlesen

Beitrag von Empire » Do Jun 25, 2009 7:17 pm

das folgende prob löse ich mit einem zeiger!
aber trozdem möchte ich wissen warum das nicht geht:
k= wort1;
beides sind variable vom typ char und bis auf den namen gleich als fehlermeldung kommt:
C:\Dokumente und Einstellungen\Steffen\Desktop\Untitled1.c|21|error: ISO C++ forbids assignment of arrays|

warum?

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: satz in char satz [50] einlesen

Beitrag von nufan » Do Jun 25, 2009 7:28 pm

1. Doppelposts bitte vermeiden. Du kannst den alten Beitrag noch editieren und Text hinzufügen. :)
2. Ganz links auf der Tastatur über der Strg-Taste gibts eine Taste damit die Buchstaben groß werden. ;)
Empire hat geschrieben:aber trozdem möchte ich wissen warum das nicht geht:
k= wort1;
beides sind variable vom typ char und bis auf den namen gleich als fehlermeldung kommt:
C:\Dokumente und Einstellungen\Steffen\Desktop\Untitled1.c|21|error: ISO C++ forbids assignment of arrays|
Nach dem Code oben ist "k" ein Array. Der Name des Arrays ist ein konstanter Zeiger auf den Anfang des Speicherbereichs. Und da er konstant ist kannst du ihm auch nichts zuweisen. Dafür reicht ein einfacher Zeiger:

Code: Alles auswählen

char *k;
Du willst doch mit "k" nur auf die Wörter zugreifen und nicht kopieren oder etwas in der Art, als brauchst du keinen extra Speicher.

Vielleicht solltest du dir das einmal durchlesen:
http://proggen.org/doku.php?id=c:pointer
http://proggen.org/doku.php?id=c:array

Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Re: satz in char satz [50] einlesen

Beitrag von Empire » Do Jun 25, 2009 8:10 pm

thx

zur groß und glein schreibung (und zur restlichen rechtschreibung)
für mich ist es so warscheinlich 3 sätze fehler frei zu schreiebn (wenns net garade "Wie geht es dir?" ist) so warscheinlich wie für euch nen 6er im Lotto deshalb mach ich mir erst garnicht die mühe überhaupt auf die G/K schreibung zu achten und versuch staddessen lieber sonst keinen fehler zu machen

mfg
Empire

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: satz in char satz [50] einlesen

Beitrag von Xin » Fr Jun 26, 2009 10:38 am

Empire hat geschrieben:zur groß und glein schreibung (und zur restlichen rechtschreibung)
für mich ist es so warscheinlich 3 sätze fehler frei zu schreiebn (wenns net garade "Wie geht es dir?" ist) so warscheinlich wie für euch nen 6er im Lotto deshalb mach ich mir erst garnicht die mühe überhaupt auf die G/K schreibung zu achten und versuch staddessen lieber sonst keinen fehler zu machen
Bemüh Dich so gut Du kannst, dann passt das :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten