2017-04-06 21 views
-1

ich ein Programm schreibe, das Geld Werte von Text erhalten muss, wann immer es „RSD“ daneben mögen: "20rsd,100rsd,500rsd.." oderC-Programmierung Nummern abrufen von Text Text

John has 20rsd, Danny has 30rsd. Bill gave 40rsd. 

Ergebnis: 90

Ich habe etwas versucht, aber ich weiß nicht, wie es geht. BTW, das ist vom College-Test, den ich hatte.

int main() 
{ 
char c,d,f; 
int price; 
FILE *in; 
char rsd[] = {'r','s','d'}; 

in = fopen("moneytext.txt","r"); 

while(!feof(in)) 
{ 
    c = fgetc(in); 
    if(c=='r') 
    { 
     d = fgetc(in); 
     if(d == 's') 
     { 
      f = fgetc(in); 
      if(f == 'd') 
       printf("%c%c%c",c,d,f); //Prints rsd 
     } 
    } 
} 
//printf("%c",fgetc(in)); 
} 

Textdatei ist so etwas wie dieses:

20.10.2017. John gave me 10rsd and Lisa gave me 30rsd, Danny gave me 50rsd, Nicholas donated 10rsd. 
+1

Können Sie Ihren Beitrag bearbeiten uns zeigen der Inhalt deiner Textdatei? –

+1

Ich stimme diese Frage als off-topic zu schließen, weil es SO ist nicht zum Lösen von College-Test – peko

+1

[kleines Beispiel mit scanf] (http://ideone.com/sFkBSb#view_edit_box) ... in Ihrem Fall sollte ' fscanf' – LPs

Antwort

1

Für jede Eingabezeile Sie rekursiv Unterkette "RSD" kann finden, wenn man einmal finden:

  1. umgekehrt finden Ziffer Preis erhalten
  2. weiter suchen "rsd" nach aktuellem "rsd" +3

Es sieht mögen:

while(fgets(buf, size, fd) != NULL) 
{ 
    char *start = buf; 
    /* search for rsd */ 
    while(start = strstr(start, "rsd")) 
    { 
     p = start; 

     /* reverse find the start of price */ 
     while(p > buf && IS_DIGIT(*(p-1))) 
     {     
      p--; 
     } 
     if(p < start) 
     { 
      while(p < start) 
      { 
       price = price * 10 + *p - '0'; 
      } 
      /** do something about price here */ 
     } 
     start += 3; 
    } 
} 
+1

Ich sehe hier keine Rekursion. Sie vermischen wahrscheinlich "Rekursion" und "Wiederholung". –

+0

ja, du hast Recht –

0

-Code kann Schleife für 1 von N Bedingungen suchen

  1. Eine Ziffer gefunden: price den ganzzahligen Wert akkumulieren.

  2. Eine Übereinstimmung mit einem einzelnen Zeichen im Suffixmuster wurde gefunden: Weiter zum nächsten Zeichen. Wenn das gesamte Muster gefunden wurde, fügen Sie price hinzu.

  3. Weder. Muster und Preis zurücksetzen.

  4. Weiter bis EOF gefunden.


int main() { 
    // Use a string to include \0 to denote when to stop match 
    const char *rsd = "rsd"; 

    FILE *out = fopen("moneytext.txt", "w"); 
    fputs("123 John has 20rsd, Danny456 has 30rsd. Bill789 gave 40rsd", out); 
    fclose(out); 

    FILE *in = fopen("moneytext.txt", "r"); 
    if (in) { 
    // fgetc() return an int, typically 1 of 257 different values, char is insufficient. 
    int c; 
    int sum = 0; 
    int price = 0; 
    const char *pattern = rsd; 
    while ((c = fgetc(in)) != EOF) { 
     if (isdigit(c)) { 
     price = price * 10 + c - '0'; 
     pattern = rsd; 
     } else if (c == (unsigned char) *pattern) { 
     pattern++; 
     if (*pattern == '\0') { 
      pattern = rsd; 
      sum += price; 
      price = 0; 
     } 
     } else { 
     pattern = rsd; 
     price = 0; 
     } 
    } 
    fclose(in); 
    printf("Sum:%d\n", sum); 
    } 
} 

Ausgabe

Sum:90 

zusätzlicher Code benötigt wird, um negative Zahlen zu verarbeiten, erfassen int Überlauf, FILE Fehler usw.

Verwandte Themen