Rautezeichen



  • Du machst mir Spaß... wenn Z nur 10 Elemente hat, kannst du nicht auf's 11te (Z[10]) zugreifen. Und unten das strlen(Z) ist ja auch hochinteressant...

    was hast du eigentlich genau vor?



  • Z kennt dein Compiler nicht, oder hast du das in dem nicht geposteten Quelltext definiert? Die 4. Warnung sagt du hast das nicht oder dein Compiler versteht nicht was du ihm beibringen wolltest.

    Da er es nicht kennt, kann da jeder beliebige Wert drin stehen - bei sehr grossen Werten bekommst du halt einen Stacküberlauf.



  • Hier ist mein gesamte Quellcode

    #include <stdafx.h> 
    #include <stdio.h> 
    #include <string.h> 
    
    int main(void) 
    {	
    	// deklaration
    
        int j,i; 
        char Komma[5][6] =    {"     ", "     ", "     ", "     ", "    *"}; 
        char Null[5][6] =   {"#####", "*   #", "#   #", "#   #", "#####"}; 
        char Eins[5][6] =   {"    #", "  # #", "#   #", "    #", "    #"}; 
    	char Zwei[5][6] =   {"#####", "    #", "#####", "#    ", "#####"};
    	char Drei[5][6] =   {"#####", "    #", "#####", "    #", "#####"};
    	char Vier[5][6] =   {"#   #", "#   #", "#####", "    #", "    #"};
    	char Fuenf[5][6] =  {"#####", "#    ", "#####", "    #", "#####"};
    	char Sechs[5][6] =  {"#####", "    #", "#####", "#   #", "#####"};
    	char Sieben[5][6] = {"#####", "    #", "   # ", "  #  ", " #   "};
    	char Acht[5][6] =   {"#####", "#   #", "#####", "#   #", "#####"};
    	char Neun[5][6] =   {"#####", "#   #", "#####", "    #", "#####"};
    	char Z[10];
    	int g ;
    	int wg;
    	int e;
    
    		/*  printf("\n\nBitte eine Zahl waehlen :  \n\n\n");
    		  fgets(Z, 10, stdin); //wird benutzt, um eine Zeile aus einem externen File zu lesen indiesem Fall von externe Eingabe.
    	      printf("\n\n"); // abstand zwischen eingabe und ausgabe*/
    
       do 
    	    {
    	      printf("Zahl1 ein geben  :  ");
    	      scanf("%d",&g);
    	    } while (g < 1);  // Nur positive Zahlen
    
    	      printf("\n zahl2   :  ");
    	      scanf("%d",&wg);
    
    		  e = g-wg;
    		  Z[10]=e;
    
    	 //printf("\n\n bitte geben Sie errechnet wert ein :  \n\n\n");
    		//fgets(Z,10, stdin);
    
        for (i = 0; i < 5; ++i) // schleife um 5 mal Rautezeichen in 5 reihen 
        { 
            for (j = 0; j < strlen(Z); ++j)  // strlen bestimmt die länge von string
            { 
                switch (Z[j])  // die Schubladen
                { 
                    case ',': 
                        printf("%s", Komma[i]); 
                        break; 
    
                    case '0': 
                        printf("%s", Null[i]); 
                        break; 
    
                    case '1': 
                        printf("%s", Eins[i]); 
                        break; 
    				case '2': 
                        printf("%s", Zwei[i]); 
                        break; 
    				case '3': 
                        printf("%s", Drei[i]); 
                        break; 
    				case '4': 
                        printf("%s", Vier[i]); 
                        break; 
    				 case '5': 
                        printf("%s", Fuenf[i]); 
                        break; 
    				case '6': 
                        printf("%s", Sechs[i]); 
                        break; 
    				case '7': 
                        printf("%s", Sieben[i]); 
                        break; 
    				case '8': 
                        printf("%s", Acht[i]); 
                        break; 
    				case '9': 
                        printf("%s", Neun[i]); 
                        break; 
                } 
               printf("   "); // abstandhalter zwischen 2 ziffern 
            } 
    
            printf("\n");  // nach jede array eine Zeile runter kommen
        } 
    
        return getchar(); 
    }
    

    ich habe viele Variante versucht aber irgendwie geht nicht.

    momentan hänge ich an 2. teil fest.

    1. teil: war für mich die zahlen als Rautenzeichen anzeigen lassen
    2. teil : Ergebnis von zahl1 und zahl 2 als rauter Zeichen anzeigen lassen
    und der 3. teil : soll solange laufen bis Ergebnis gleich null ist

    lg



  • ich hab auch mal bissl herumgebastelt. Hoffe, das es etwa C entspricht.
    Dein switch-case und dein Rautencontainer .. also des waren mir zu viel Variablen. Und ich habe 4*7 als Größenordnung verwendet.

    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
    	int character, line, row;
    	int ascii, index;
    	char input[20];
    	char numbers[11][29] =
    		{
    			{ "#####  ##  ##  ##  ##  #####" },
    			{ "   #   #   #   #   #   #   #" },
    			{ "####   #   ######   #   ####" },
    			{ "####   #   #####   #   #####" },
    			{ "#  ##  ##  #####   #   #   #" },
    			{ "#####   #   ####   #   #####" },
    			{ "#####   #   #####  ##  #####" },
    			{ "####   #   #   #   #   #   #" },
    			{ "#####  ##  ######  ##  #####" },
    			{ "#####  ##  #####   #   #####" },
    			{ "                         #  " }
    		};
    
    	do
    	{
    		// Einlesen der Zahlen
    		scanf("%s", input);
    
    		for(row=0; row<7; ++row)
    		{
    			for(character=0; character<strlen(input); ++character)
    			{
    				ascii = (int)input[character];
    				index = -1;
    
    				// Sonderbehandlung fuer Kommata
    				if(ascii == 46)
    					index = 10;
    				// Zahlen 0-9
    				else if(ascii >= 48 && ascii <= 57)
    					index = ascii-48;
    
    				if(index >= 0 && index <= 10)
    				{
    					for(line=0; line<4; ++line)
    					{
    						printf("%c", numbers[index][row*4+line]);
    					}
    					printf("  ");
    				}
    			}
    			printf("\n");
    		}
    
    	} while(input[0] != 'q');
    
    	return 0;
    }
    

    😃 ist vielleicht net unbedingt perfekt.



  • Hi
    @ BasicMan01 vielen danke

    aber wie kann ich hier etwas Rechnung rein packen
    es soll von zahl1 dem zahl2 solange abziehen bis zahl1 null wird auch bei jede Eingabe von zahl2 das zwischen-Ergebnis zeigen lassen

    10-3=7 zeigen lassen
    7-5= 2 zeigen lassen
    2-2= 0 zeigen lassen
    diese abziehen und zeigen lassen ist mein Hauptproblem 😞

    lg



  • In dem Fall würde ich zunächst ersteinmal die Ausgabe auf der Konsole in eine
    Funktion stecken. Als Übergabeparameter den Zahlenstring. (im prinzip das bisherige Programm 😃 )

    kleines Beispiel Fahrkartenautomat:
    User möchte eine Karte kaufen im Wert von 2,60

    Ausgabe auf der Konsole 2,60 (mittels der geschriebenen Funktion)
    User wirft ein 2,00 Stück ein.
    du rechnest 2,60 - 2,00 und gibst das Ergebnis (0,60) an die Ausgabefunktion
    Ausgabe auf der Konsole 0,60
    User wirft ein 50 Cent Stück ein
    du rechnest 0,60 - 0,50 und gibst das Ergebnis (0,10) an die Ausgabefunktion
    Ausgabe auf der Konsole 0,10
    User wirft ein 10 Cent Stück ein
    du rechnest 0,10 - 0,10 und gibst das Ergebnis (0,00) an die Ausgabefunktion

    Ohne Funktion wird es sehr Unübersichtlich.

    Auch kannst du einen double einlesen anstatt eines C-Strings. Das macht sich für eine Rechnung einfacher. Für die Ausgabe wäre dann ein String besser.
    Zum Casten bzw. umwandeln kannst du sprintf() verwenden.



  • Wenn ich mich da auch einmischen darf, ich hab so etwas in der Art noch hier rumliegen:

    #include <ctype.h>
    #include <stddef.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #ifdef _WIN32
    #  define NOMINMAX
    #  include <windows.h>
    #else
    #  include <fcntl.h>
    #  include <sys/ioctl.h>
    #  include <unistd.h>
    #endif
    
    static size_t get_term_columns(void) {
      size_t cols = 80;
    
    #ifdef _WIN32
      HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
      CONSOLE_SCREEN_BUFFER_INFO info;
    
      if(GetConsoleScreenBufferInfo(h, &info)) {
        cols = info.dwSize.X;
      }
    #else
      char const *col_env = getenv("COLUMNS");
    
      if(!col_env || sscanf(col_env, "%lu", &cols) != 1) {
        struct winsize wsz;
        if(!ioctl(STDOUT_FILENO, TIOCGWINSZ, &wsz)) {
          cols = wsz.ws_col;
        }
      }
    #endif
    
      return cols;
    }
    
    static size_t size_t_max(size_t x, size_t y) {
      return x > y ? x : y;
    }
    
    static void print_phrase(char const *s) {
      static char const font[][97] = {
       /* !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~*/
        "@DJ@DSBDHB@@@@@PNDNNH_L_NN@@H@BNNNONO__NQDPQAQQNONON_QQQQQ_NAND@D@A@P@L@ADPAF@@@@@@@D@@@@@@HDB@",
        "@DJJNSEDDDJD@@@PQFQQLABPQQ@@D@DQQQQQQAAQQDPIA[QQQQQQDQQQQQPBAHJ@H@A@P@B@A@@AD@@@@@@@D@@@@@@DDD@",
        "@D@_AHE@DDND@@@HYDPPJAAHQQDDB_HPYQQAQAAAQDPEAUSQQQQADQQQJJHBBHQ@@NON^NB^OFXIDKGNO^MNNQQQQQ_DDDV",
        "@D@JNDB@DD__@_@DUDHLIOODN^@@A@PHU_OAQOOA_DPCAQUQOQONDQQQDDDBDH@@@PQQQQOQQDPEDUIQQQRADQQQJQHBDHM",
        "@D@JPBU@DDND@@@BSDDP_PQDQPDDB_HD]QQAQAAYQDPEAQYQAUQPDQQUJDBBHH@@@^QAQOBQQDPCDUIQQQBNDQQUDQDDDD@",
        "@@@_NYI@DDJD@@@AQDBQHQQDQH@BD@D@AQQQQAAQQDPIAQQQAIQQDQJ[QDABPH@@@QQQQAB^QDPEDUIQO^BPDYJUJ^BDDD@",
        "@D@JDYV@HB@@D@DANN_NHNNDNF@@H@BDNQONO_ANQDQQ_QQNAVQNDNDQQD_NPN@_@^ON^NBPQNRINUINAPGNLVDJQP_HDB@",
        "@@@@@@@@@@@@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@L@@@@@AP@@@@@@@N@@@@@"
      };
      static size_t const font_x = 6;
      static size_t const font_y = 8;
    
      /* lpl == letters per line. Zeilenumbrüche werden sehr rudimentär forciert;
       * vernünftige Silbentrennung wäre mir viel zu viel Aufwand. */
      size_t i, j, lpl = size_t_max(get_term_columns() / 6, 1);
      /* "line" hier im Sinne von nach lpl umgebrochenen Zeilen des Eingabetextes */
      char const *pos_line;
      char const *pos_letter;
    
      for(pos_letter = pos_line = s; *pos_letter; pos_line += lpl) {
        for(i = 0; i < font_y; ++i) {
          for(pos_letter = pos_line; *pos_letter && (pos_letter - pos_line) < lpl; ++pos_letter) {
            char c = isprint(*pos_letter) ? *pos_letter : '?';
    
            for(j = 0; j < font_x; ++j) {
              putchar((font[i][c - ' '] >> j & 1) ? '#' : ' ');
            }
          }
          putchar('\n');
        }
      }
    }
    
    int main(int argc, char *argv[]) {
      char text[] =
        " !\"#$%&'()*+,-./0123456789:;<=>?@"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`"
        "abcdefghijklmnopqrstuvwxyz{|}~";
    
      if(argc == 1) {
        print_phrase(text);
      } else {
        size_t i;
        for(i = 1; i < argc; ++i) {
          print_phrase(argv[i]);
        }
      }
    
      return 0;
    }
    

    Der wichtige Teil ist in der Funktion "print_phrase". Das große Array ist eine 6x8-Schrift, die die 96 druckbaren ASCII-Zeichen (Leerzeichen bis Tilde) umfasst und so kodiert ist, dass die niederwertigsten 6 bit eines Zeichens die Darstellung der betreffenden Zeile kodieren. Etwa ist Z so kodiert:

    _ = 11111001 -> "##### "
    P = 00001001 -> "    # "
    H = 00010001 -> "   #  "
    D = 00100001 -> "  #   "
    B = 01000001 -> " #    "
    A = 10000001 -> "#     "
    _ = 11111001 -> "##### "
    @ = 00000000 -> "      "
    

    (Binärdarstellung in LSB-Notation).

    Der restliche Code ist dann nur noch, zu erkennen, wie viele Zeichen nebeneinander in eine Zeile passen und diese dann zeilenweise nebeneinander runterzuschreiben.



  • Hi,

    ja genau hier liegt das Problem ich kriege die Rechnung ausgabe nicht in variable Z in diesem Fall rein also meine aus gerechnete wert ist ein int wert aber Z ist ein char.

    int a,b,c;
            char Z[10];
    
    	printf("zahl1");
    	scanf("%d",&a);
    	printf("zahl2");
    	scanf("%d",&b);
    	c=a+b;
    	printf("%d",&c);
    

    wie kann ich den wert von c im Z rein schreiben?

    lg



  • sprintf(Z, "%d", c);
    


  • hi
    man kann sehen,er macht sein Job richtig aber geht nach eine sec wieder weg
    woran kann das liegen bei return hab eich viele Varianten ausprobiert aber leider Erfolglos.

    lg



  • Hi,
    es klappt einfach nicht bitte um hilfe.!
    danke
    lg



  • the.neo schrieb:

    hi
    man kann sehen,er macht sein Job richtig aber geht nach eine sec wieder weg
    woran kann das liegen bei return hab eich viele Varianten ausprobiert aber leider Erfolglos.

    lg

    Das versteh ich nicht? ... was meinst du damit?



  • hi,

    das Programm startet und ich kann sehen das es Ergebnis auch kommt aber es stürzt nach paar Sekunde ab.

    int main() 
    {	
    
        int j,i; 
        char Komma[5][6] =    {"     ", "     ", "     ", "     ", "    *"}; 
        char Null[5][6] =   {"#####", "*   #", "#   #", "#   #", "#####"}; 
        .
        .
        .
    
    	char Neun[5][6] =   {"#####", "#   #", "#####", "    #", "#####"};
    	char Z[10];
    	int g ,wg,e;
    
    	      printf("Zahl1 ein geben  :  ");
    	      scanf("%d",&g);
    
    	      printf("\n zahl2   :  ");
    	      scanf("%d",&wg);
    
    		  e = g-wg;
    		 sprintf(Z, "%d", e);
    
        for (i = 0; i < 5; ++i) // schleife um 5 mal Rautezeichen in 5 reihen 
        { 
            for (j = 0; j < strlen(Z); ++j)  // strlen bestimmt die länge von string
            { 
                switch (Z[j])  // die Schubladen
                { 
                    case ',': 
                        printf("%s", Komma[i]); 
                        break; 
    
                    case '0': 
                        printf("%s", Null[i]); 
                        break; 
    
                    case '1': 
                        printf("%s", Eins[i]); 
                        break; 
    				case '2': 
                       .
                       .
                       .
    
    				case '9': 
                        printf("%s", Neun[i]); 
                        break; 
                } 
               printf("   "); // abstandhalter zwischen 2 ziffern 
            } 
    
            printf("\n");  // nach jede array eine Zeile runter kommen
        } 
    
        return getchar(); 
    }
    


  • In dem Fall würd ich den Debugger mal zur rate ziehen.
    Der sagt dir, an welcher Stelle es kracht.

    Bei dem bestehenden Code lässt es sich nur schwer rausfinden.



  • wie soll ich es mit visual Studio 2005 machen.?

    ich hoffe das ich richtig gemacht habe aber verstehen mache ich von diese Warnungen nix.

    >	mu.exe!main()  Line 30	C
     	mu.exe!__tmainCRTStartup()  Line 586 + 0x19 bytes	C
     	mu.exe!mainCRTStartup()  Line 403	C
     	kernel32.dll!753b3677() 	
     	[Frames below may be incorrect and/or missing, no symbols loaded for     kernel32.dll]
     	ntdll.dll!77089d72() 	
     	ntdll.dll!77089d45()
    
    Warning	1	warning C4996: 'scanf' was declared deprecated		
    Warning	2	warning C4996: 'scanf' was declared deprecated		
    Warning	3	warning C4996: 'sprintf' was declared deprecated	
    Warning	4	warning C4018: '<' : signed/unsigned mismatch
    

    lg



  • Deine angegebenen Warnungen haben mit dem von dir beschriebenen Problem wohl nichts zu tun.
    "deprecated" sagt lediglich aus, dass diese Funktion in zukünftigen Versionen eventuell nicht mehr unterstützt wird.
    Warnung 4 bezieht sich auf strlen welche einen unsigned int (size_t) zurückgibt und diese wird mit einem int verglichen.

    Nun kann ich dir jetzt schlecht ne Bedienungsanleitung zum Debugger schreiben.
    Aber du solltest dir ernsthaft Zeit nehmen, die funktionsweiße zu lernen.
    Der Debugger gehört zu den wichtigsten Werkzeugen, die man zum proggen braucht.
    Microsoft wird da irgendwo schon was haben 🙂

    Zu deinem Problem ... poste mal den ganzen Code



  • @BasicMan01 Danke sehr lieb von dir
    ehrlich gesagt möchte sehr gerne mehr zeit nehme und lernen aber habe ich kaum Zeit jede Woche gehe ich ein Projekt ab. in Verschiedene Fächer.
    ich habe in meine Plan nur 3 Stunde am Tag Programmieren lernen mehr schaffe ich nicht.

    #include <stdafx.h> 
    #include <stdio.h> 
    #include <string.h> 
    
    int main() 
    {	   
        int j,i; 
        char Komma[5][6] =  {"     ", "     ", "     ", "     ", "    *"}; 
        char Null[5][6] =   {"#####", "*   #", "#   #", "#   #", "#####"}; 
        char Eins[5][6] =   {"    #", "  # #", "#   #", "    #", "    #"}; 
    	char Zwei[5][6] =   {"#####", "    #", "#####", "#    ", "#####"};
    	char Drei[5][6] =   {"#####", "    #", "#####", "    #", "#####"};
    	char Vier[5][6] =   {"#   #", "#   #", "#####", "    #", "    #"};
    	char Fuenf[5][6] =  {"#####", "#    ", "#####", "    #", "#####"};
    	char Sechs[5][6] =  {"#####", "    #", "#####", "#   #", "#####"};
    	char Sieben[5][6] = {"#####", "    #", "   # ", "  #  ", " #   "};
    	char Acht[5][6] =   {"#####", "#   #", "#####", "#   #", "#####"};
    	char Neun[5][6] =   {"#####", "#   #", "#####", "    #", "#####"};
    	char Z[10];
    	int g ,wg,e;
    
    	      printf("Zahl1 ein geben  :  ");
    	      scanf("%d",&g);
    
    	      printf("\n zahl2   :  ");
    	      scanf("%d",&wg);
    
    		  e = g-wg;
    		 sprintf(Z, "%d", e);
    
        for (i = 0; i < 5; ++i) // schleife um 5 mal Rautezeichen in 5 reihen 
        { 
            for (j = 0; j < strlen(Z); ++j)  // strlen bestimmt die länge von string
            { 
                switch (Z[j])  // die Schubladen
                { 
                    case ',': 
                        printf("%s", Komma[i]); 
                        break; 
                    case '0': 
                        printf("%s", Null[i]); 
                        break; 
                    case '1': 
                        printf("%s", Eins[i]); 
                        break; 
    				case '2': 
                        printf("%s", Zwei[i]); 
                        break; 
    				case '3': 
                        printf("%s", Drei[i]); 
                        break; 
    				case '4': 
                        printf("%s", Vier[i]); 
                        break; 
    				 case '5': 
                        printf("%s", Fuenf[i]); 
                        break; 
    				case '6': 
                        printf("%s", Sechs[i]); 
                        break; 
    				case '7': 
                        printf("%s", Sieben[i]); 
                        break; 
    				case '8': 
                        printf("%s", Acht[i]); 
                        break; 
    				case '9': 
                        printf("%s", Neun[i]); 
                        break; 
                } 
               printf("   "); // abstandhalter zwischen 2 ziffern 
            } 
            printf("\n");  // nach jede array eine Zeile runter kommen
        } 
        return getchar(); 
    }
    


  • Was gibst du denn ein?

    printf("Zahl1 ein geben  :  ");
    scanf("%d",&g);
    
    printf("\n zahl2   :  ");
    scanf("%d",&wg);
    
    e = g-wg;
    sprintf(Z, "%d", e);
    

    Vermutung:
    Z kann nur 9 Zeichen + Nullterminierung aufnehmen.
    Ein int (4 Byte) hat einen Wertebereich von −2147483648 bis 2147483647.
    Bei maximaler Ausschöpfung sind das allein 10 Zeichen.



  • ich gebe da bei zahl1 10 und bei zahl2 3 ein
    Ergebnis kommt 7.
    diese 7 kommt nur als Rautenzeichen für 1 sec auf dem Bildschirm und dann ist weg Konsole schlisst sich Automatik.

    lg



  • Du hast noch Zeichen im Eingabestrom, deswegen wartet getchar nicht auf eine Eingabe.

    Starte das ganze mal mit Strg+F5 oder setz nen Haltepunkt am Ende.


Anmelden zum Antworten