Brauche unbedingt Hilfe!

  • geschlossen
  • C

  • MCWK
  • 882 Aufrufe 2 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Brauche unbedingt Hilfe!

    aufgabe des programmes is es, die eingegebenen großbuchstaben, in kleine umzuwandeln und umgekehrt. sonderzeichen werden belassen.
    alle verschiedenen zeichen werden zudem noch gezählt.
    leerzeichen
    sonderzeichen
    großbuchstaben
    kleinbuchstaben

    also ich hab das programm hier, und es funktioniert nicht :confused: :

    C-Quellcode

    1. #include <stdio.h>
    2. #include <conio.h>
    3. int konvertiere(int buchst, int a);
    4. int ist_klein_buchstabe(int buchst, int a);
    5. int ist_gross_buchstabe(int buchst, int a);
    6. int mach_klein_buchstabe(int buchst, int a);
    7. int mach_gross_buchstabe(int buchst, int a);
    8. int main(void)
    9. {
    10. int kette[80],i=0,back;
    11. printf ("Bitte Buchstabenkette eingeben: ");
    12. fflush(stdin);
    13. while (kette[i]!=EOF)
    14. {
    15. kette[i]=getchar();
    16. back=konvertiere(kette, i);
    17. i++;
    18. }
    19. getch();
    20. }
    21. int kovertiere(int buchst, int a)
    22. {
    23. int check1, check2,leer,gross,klein,sonder,ges;
    24. check1=ist_klein_buchstabe(buchst,a);
    25. check2=ist_gross_buchstabe(buchst,a);
    26. if (buchst[a]==' ')
    27. leer++;
    28. if (check1==1)
    29. {
    30. mach_gross_buchstabe(buchst,a);
    31. klein++;
    32. }
    33. if (check2==1)
    34. {
    35. mach_klein_buchstabe(buchst,a);
    36. gross++;
    37. }
    38. if (check1==0&&check2==0)
    39. sonder++;
    40. ges=leer+klein+gross+sonder;
    41. return ges;
    42. }
    43. int ist_klein_buchstabe(int buchst,int a)
    44. {
    45. if (buchst[a]>='a'&&buchst[a]<='z')
    46. return 1;
    47. else
    48. return 0;
    49. }
    50. int ist_gross_buchstabe(int buchst,int a)
    51. {
    52. if (buchst[a]>='A'&&buchst[a]<='Z')
    53. return 1;
    54. else
    55. return 0;
    56. }
    57. int mach_gross_buchstabe(int buchst,int a)
    58. {
    59. buchst[a]-=32;
    60. return buchst[a];
    61. }
    62. int mach_klein_buchstabe(int buchst,int a)
    63. {
    64. buchst[a]+=32;
    65. return buchst[a];
    66. }
    Alles anzeigen
  • Also hinter so manche C Funktionen bin ich sowieso nich ganz hintergestiegen (gehe eher so Richtung C++), daher kann ich dir dazu erstmal nur nen Vorschlag machen wie ich es tun würde, zunächst zum Einlesen:

    PHP-Quellcode

    1. while ((kette[i] = getch()) != 27) // 27 = escape zeichen
    2. {
    3. konvertiere(kette, i);
    4. i++;
    5. }
    Zum Verständnis, zunächst die Zuweisung in der while Loop:
    Diese besteht im Wesentlichen aus zwei Teilen, einmal der Zuweisung: (kette = getch()), damit wird der Wert von getch() dem Array kette an der Stelle i zugewiesen. Zum zweiten wird getestet, ob der Wert, der zugewiesen wird - also in dem Fall der ASCII-Wert des Zeichens, 27 ist. Dazu gesagt, 27 entspricht dem Escape-Zeichen.

    Nun zum Zählen. Die Variablen leer, gross, klein, sonder, ges würde ich als Global Vars deklarieren, so dass jede Funktion auf sie zugreifen kann. Das heißt du schreibst oben unter die Funktionsgeklarationen noch int leer = 0, gross = 0, klein = 0, sonder = 0, ges = 0;
    Gleiches könntest du mit der kette machen (ich würde übrigens "char kette[80]" schreiben, äh nein, ich würde "string kette" nehmen, aber das is C++ ^^), oder aber du übergibst die kette bei allen Funktionen als Referenz (ka ob du weißt was das ist). Ist aber recht simpel - du nimmst als Datentypen lediglich nicht "int" (beispielsweise), sondern "int&".

    Die konvertiere-Funktion würde ich so abändern:

    PHP-Quellcode

    1. void konvertiere (char& buchst[80], int a)
    2. {
    3. if (buchst[a] == 32) // 32 = leerzeichen
    4. leer++;
    5. else if (ist_gross_buchstabe(buchst[a])) // hier nur den buchstaben übergeben
    6. {
    7. buchst[a] = mach_klein_buchstabe(buchst[a]);
    8. gross++;
    9. }
    10. else if (ist_klein_buchstabe(buchst[a]))
    11. {
    12. buchst[a] = mach_gross_buchstabe(buchst[a]);
    13. klein++;
    14. }
    15. else
    16. sonder++;
    17. }
    Alles anzeigen
    Die Funktionen ist_klein_buchstabe und ist_gross_buchstabe würde ich so machen:

    PHP-Quellcode

    1. bool ist_klein_buchstabe(char buchst) // bool = ja oder nein
    2. {
    3. return (buchst >= 'a' && buchst <= 'z');
    4. }
    Das was innerhalb der Funktion steht verhält sich ganz genauso wie das was du schon hattest ... nur ein wenig kürzer. ^^ Wie du siehst entspricht der Term innerhalb der Klammern dem was in der if-Klammer steht. Solche Terme sind aber nicht auf if/while/etc-Funktionen begrenzt - sie können überall eingesetzt werden und haben IMMER einen Rückgabewert bool, also true oder false. Genau das kann man auf einfache Weise z.B. bei return benutzen - wenn also das was in der Klammer steht den Wert true ergibt, wird dieser auch returned, anderweitig eben false.

    An den Funktionen mach_klein_buchstabe und mach_gross_buchstabe würde ich wieder die Handhabung ändern, also nur den Buchstaben selber übergeben (wie schon bei ist_klein_buchstabe):

    PHP-Quellcode

    1. char mach_klein_buchstabe(char buchst)
    2. {
    3. return (buchst + 32); // 'a' - 'A' = 97 - 65 = 32
    4. }
    Am Ende der main-Funktion gibste dann eben die Übersicht der großen/kleinen/etc Zeichen und die kette aus.

    Ich hoffe mal es funktioniert soweit. Viel Erfolg. :cool: ;)