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 istlg
-
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 dankeaber 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 lassen10-3=7 zeigen lassen
7-5= 2 zeigen lassen
2-2= 0 zeigen lassen
diese abziehen und zeigen lassen ist mein Hauptproblemlg
-
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,60Ausgabe 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 AusgabefunktionOhne 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 habenZu 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.