Lauflicht in C
-
Hallo Renate,
Du scheinst ja sehr verzweifelt zu sein. Hier erst mal Dein Code in formatierter Form, so dass man ihm lesen kann:
#include <stdio.h> #include <conio.h> #include <graph.h> #define TEMPO 51000000 #define BIL _clearscreen(_GCLEARSCREEN) void main(void) { unsigned long int i; BIL; setbuf(stdout,NULL); do { _settextposition(8,8); printf(" O O O O O O O O O O"); for (i = 1; i <= TEMPO; i++); _settextposition(8,8); printf(" O O O O O O O O O O "); for (i = 1; i <= TEMPO; i++); _settextposition(8,8); printf(" O O O O O O O O O O "); for (i = 1; i <= TEMPO; i++); _settextposition(8,8); printf(" O O O O O O O O O O "); for (i = 1; i <= TEMPO; i++); _settextposition(8,8); printf(" O O O O O O O O O O "); for (i = 1; i <= TEMPO; i++); _settextposition(8,8); printf("O O O O O O O O O O "); for (i = 1; i <= TEMPO; i++); }while (!kbhit()); }Jetzt zu Deiner Aussage:
Renate schrieb:
Da der Code eigentlich gar keinen Algorithmus darstellt, soll nun mit Hilfe eines Arrays, einer hexadezimale Ausgangszahl u. Linkschiebeoperatoren ein ordentlicher Algorithmus entwickelt werden !!!
WER KANN EINER
VERZWEIFELTEN HELFEN ???Was soll Dein Algorithms eigentlich bewirken? Was ist die Eingabe und was soll dann herauskommen?
Gruß
Werner
-
den code hast du wohl hierher?
http://www.nickles.de/c/a/archiv2002-537015434.htm
würde dann auch die antworten dort mal studieren, die letzte scheint sehr gut.hier noch die bitmuster
Bitmuster: 0x1 00000001 (2 hoch 0 = 1 ) 0x2 00000010 (2 hoch 1 = 2 ) 0x4 00000100 (2 hoch 2 = 4 ) 0x8 00001000 (2 hoch 3 = 8 ) 0x10 00010000 (2 hoch 4 = 16) 0x20 00100000 (2 hoch 5 = 32) 0x40 01000000 (2 hoch 6 = 64) 0x80 10000000 (2 hoch 7 = 128)x>>n hat die gleiche Wirkung wie: x (ganzzahlig) dividiert durch 2 hoch n
x<<n hat die gleiche Wirkung wie: x multipliziert mit 2 hoch nso, hoffe, ich versehe mich so spät nicht.. fehler dann bitte bemerken

-
Hallo Werner,
danke,
eine Eingabe gibt es nicht, sondern die Nullen sollen eben wie ein blinkendes Licht von rechts nach links über den Schirm laufen.
Bitte melde Dich
-
Das ist jetzt für POSIX-Systeme (UNIX, Linux), aber das Prinzip sollte klar werden.
#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> static char const msg[] = "Das ist ein Test."; static size_t const msg_len = sizeof(msg) - 1; unsigned get_screenwidth(void) { int columns = 80; char const *cols_env = getenv("COLUMNS"); if(cols_env != NULL) { int i = atoi(cols_env); if(i > 0) columns = i; } return columns; } void *print_thread(void *p) { unsigned cols = get_screenwidth(); char *buf = malloc(cols + 2); int textpos; int *interrupt = p; buf[0] = '\r'; memset(&buf[1], ' ', cols); buf[cols + 1] = '\0'; for(textpos = 1; !*interrupt; textpos = textpos % cols + 1) { int cols_left = cols - textpos + 1; if(cols_left <= msg_len) { memcpy(&buf[textpos], msg, cols_left); memcpy(&buf[1], msg + cols_left, msg_len - cols_left); } else { memcpy(&buf[textpos], msg, msg_len); } printf(buf); fflush(stdout); buf[textpos] = ' '; usleep(100000); } free(buf); return NULL; } int main(void) { pthread_t print_th; int interrupt = 0; pthread_create(&print_th, NULL, print_thread, &interrupt); getchar(); interrupt = 1; return 0; }
-
he 0xdeadbeef
er hat die aufgabe, es zu "schieben"
<ot>wieso glaubt elise eigentlich immer, dass solche fragen meist von männern gestellt werden, die frauennamen nutzen...</ot>
RenateD: schau dir einfach mal die schiebeoperatoren genau an. da gibt es ein system

-
RenateD schrieb:
eine Eingabe gibt es nicht, sondern die Nullen sollen eben wie ein blinkendes Licht von rechts nach links über den Schirm laufen.
Also sowas:
#include <stdio.h> // printf #include <windows.h> // Sleep void warteEtwas() { // in Abhängigkeit des Betriebssystems anzupassen Sleep( 200 ); // Windows-Implementierung } int main() { for( int i = 2; ; i? --i: i=2 ) // von rechts nach links { for( int j=0; j<i; ++j ) printf( " " ); // (Ver-)Schiebe-Spaces printf( "O O O O O O O O \r" ); warteEtwas(); } return 0; }Das 'Sleep( 200 )' musst Du durch irgendeinen anderen Warte-Aufruf ersetzen, falls es den bei Dir nicht gibt.
Gruß
Werner
-
Ich kriegs einfach nich auf die Reihe?!!
-
Hallo Renate,
versuche bitte Deine Fragen zu päzisieren; dann kann Dir auch geholfen werden

Welche Entwicklungsumgebung benutzt Du? (Betriebssystemn, Compiler)
Kannst Du ein Programm schreiben und generieren, welches einen Text ausgibt - also ein sogenanntes Hello-World-Programm?
Was ist Dein konkretes Problem?Fragt Werner
-
@elise: Ich seh da kein Problem. Meinen Code kann man so eh nicht als Hausaufgabe abgeben - so wies aussieht, ist der Unterricht, für den diese Aufgabe ist, auf Windows zugeschnitten, das heißt, ohne zu verstehen, was ich da mache, kann sie damit eh nichts anfangen. Und wenn sie das rafft, ist doch alles in bester Ordnung.
Ich hab nochmal ne Ecke dran rumgefeilt - ich hatte ein bisschen Langeweile. Ta da:
#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <termios.h> #include <unistd.h> static unsigned long const ticker_usecs = 100000UL; static char const default_message[] = "Das ist ein Text."; static size_t const default_message_length = sizeof(default_message) - 1; struct print_thread_info { int interrupt; char const *message; size_t message_length; }; static unsigned get_screenwidth(void) { int columns = 80; char const *cols_env = getenv("COLUMNS"); if(cols_env != NULL) { int i = atoi(cols_env); if(i > 0) columns = i; } return columns; } static void *print_thread(void *p) { unsigned cols = get_screenwidth() - 1; char *buf = malloc(cols + 2); int textpos; struct print_thread_info *info = p; buf[0] = '\r'; memset(&buf[1], ' ', cols); buf[cols + 1] = '\0'; for(textpos = 1; !info->interrupt; textpos = textpos % cols + 1) { int cols_left = cols - textpos + 1; if(cols_left <= info->message_length) { memcpy(&buf[textpos], info->message, cols_left); memcpy(&buf[1], info->message + cols_left, info->message_length - cols_left); } else { memcpy(&buf[textpos], info->message, info->message_length); } printf(buf); fflush(stdout); buf[textpos] = ' '; usleep(ticker_usecs); } free(buf); return NULL; } int main(int argc, char *argv[]) { pthread_t print_th; struct print_thread_info pth_info = { 0, default_message, default_message_length }; struct termios old_settings, new_settings; if(argc > 1) { size_t len = strlen(argv[1]); if(len < get_screenwidth()) { pth_info.message = argv[1]; pth_info.message_length = strlen(pth_info.message); } else { puts("Text zu lang."); return -1; } } pthread_create(&print_th, NULL, print_thread, &pth_info); tcgetattr(0, &old_settings); new_settings = old_settings; new_settings.c_lflag &= ~ICANON; new_settings.c_cc[VTIME] = 0; new_settings.c_cc[VMIN] = 1; tcsetattr(0, TCSANOW, &new_settings); getchar(); pth_info.interrupt = 1; pthread_join(print_th, NULL); tcsetattr(0, TCSANOW, &old_settings); putchar('\n'); return 0; }
-
Werner Salomon schrieb:
Hallo Renate,
versuche bitte Deine Fragen zu päzisieren; dann kann Dir auch geholfen werden

Welche Entwicklungsumgebung benutzt Du? (Betriebssystemn, Compiler)
Kannst Du ein Programm schreiben und generieren, welches einen Text ausgibt - also ein sogenanntes Hello-World-Programm?
Was ist Dein konkretes Problem?Fragt Werner
Ich bin wirkich am verzweifeln.
Betriebssystem ist XP und Watcom der Compiler.
Also, ich habe vorliegenden einfachen Code(Zitat Lehrer), wenn ich dieses Programm ablaufen lasse, erscheint auf dem Bildschirm eine Art Lauflicht.
Ich soll nun die Geschwindigkeiten in den Zeilen: for(i=1; i<=5000000; i++)
durch Ändern der Schleifendurchläufe so anpassen, daß sie für ??? meinen PC paßt???
Es soll ein Programm anhand der Vorlage erstellt werden, daß diese O' von rechts nach links über den Bildschirm laufen lässt (ähnlich wie ein Lauflicht).
Die nötigen Daten sollen aus einem Array od.einer struct geholt werden. Eine hexadezimale Ausgangszahl soll festgelegt werden,und mit Schiebeoperatoren das Laufen der O' bewirkt werden.Hello World bring ich zamm!!!
-
Renate schrieb:
Also, ich habe vorliegenden einfachen Code(Zitat Lehrer), wenn ich dieses Programm ablaufen lasse, erscheint auf dem Bildschirm eine Art Lauflicht.
Ich soll nun die Geschwindigkeiten in den Zeilen: for(i=1; i<=5000000; i++)
durch Ändern der Schleifendurchläufe so anpassen, daß sie für ??? meinen PC paßt???Hallo Renate,
das hört sich schon ganz anders an
. Welche Konstante in dem Code bestimmt denn die Pausenlänge zwischen den 'printf'-Aufrufen?Renate schrieb:
Es soll ein Programm anhand der Vorlage erstellt werden, daß diese O' von rechts nach links über den Bildschirm laufen lässt (ähnlich wie ein Lauflicht).
Dein Code besteht aus 2 Bildern:
O O O O O O O O O O O O O O O O O O O OMan kann an Hand dieser beiden Bilder nicht sehen, ob sich das Lauflicht von rechts nach links oder links nach rechts beweht! Entweder musst Du eines der Lichter markieren, welches dann durch das Bild hindurchläuft oder drei Bilder benutzen (s. mein Vorschlag oben).
Wie genau sollen denn die Bilder aussehen? Mal unabhängig von irgendeinem Programm-Code.Renate schrieb:
Die nötigen Daten sollen aus einem Array od.einer struct geholt werden. Eine hexadezimale Ausgangszahl soll festgelegt werden,und mit Schiebeoperatoren das Laufen der O' bewirkt werden.
Was sind die 'nötigen Daten'? kannst Du die Frage präzisieren.
Ich wiederhole es noch mal:
Wie genau sollen die Bilder aussehen, die das Lauflicht erzeugen? Mal's einfach mal auf.Gruß
Werner
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Hallo Werner,
meine O's laufen auf folgende Weise in einer Reihe in der Blackbox im fullscreen:
<---- (ohne Pfeil) O O O O O O O
Hast Du meine Code gesehen? Die vielen printf's sollen ersetzt werden.
Vielen Dank im Vorraus
-
wenn der lehrer schiebeoperationen verlangt, will er welche.
ihr hattet SICHER dezimal zu binär.
ebenso hattet ihr schiebeoperatoren im unterricht.na ja, egal. wenn das alles nix wird hier..
#include <stdio.h> #include <math.h> int main(){ int attrib = 0x1; //00000001 /* Bitmuster: 0x1 00000001 (2 hoch 0 = 1 ) 0x2 00000010 (2 hoch 1 = 2 ) 0x4 00000100 (2 hoch 2 = 4 ) 0x8 00001000 (2 hoch 3 = 8 ) 0x10 00010000 (2 hoch 4 = 16) 0x20 00100000 (2 hoch 5 = 32) 0x40 01000000 (2 hoch 6 = 64) 0x80 10000000 (2 hoch 7 = 128)*/ double wert=0, zaehler=0; for(int j=0;j<=7;j++) { wert=pow(2,j); for ( int i = 7 ; i >= 0 ; i--) { if ( (int)wert&(1<<i)) printf ("1"); else printf ("0"); } printf("\n"); zaehler=0.0; while (zaehler<10000000.0) //doofe zählschleife zaehler++; } }je nach c version ggf. die variablen als block oben deklarieren, und nicht im code, wenn du weißt, was ich meine.
-
RenateD schrieb:
meine O's laufen auf folgende Weise in einer Reihe in der Blackbox im fullscreen:
<---- (ohne Pfeil) O O O O O O O
.. ich hatte Deine Antwort nicht gleich gesehen, da Hume sie nach WinApi verschoben hat - aber egal - ich versuche mal folgendes. Kannst Du folgenden Code bei Dir übersetzen und zum Laufen bringen
#include <iostream> // cout #include <cstring> // strlen #include <string> // std::string #include <windows.h> // Sleep #include <conio.h> // kbhit() #include <graph.h> using namespace std; #define BIL _clearscreen(_GCLEARSCREEN) void warteEtwas() { Sleep( 200 ); } int main() { const char* text = " 0 0 0 0 0 0 0 "; const char* textEnd = text + strlen( text ); BIL; for( const char* p = text; !kbhit(); ++p ) { if( p == textEnd ) p = text; cout << string( p, textEnd ) << string( text, p ) << '\r'; warteEtwas(); } return 0; }so was ähnliches hatte ich Dir schon mal vorgeschlagen, aber Du hast nur 'verzweifelt' darauf reagiert. Falls es nicht gehen sollte, beschreibe bitte möglichst genau warum nicht.
RenateD schrieb:
Hast Du meine Code gesehen?
Ja , den Code am Anfang dieses Threads.
RenateD schrieb:
Die vielen printf's sollen ersetzt werden.
gut - das ist kein Problem (s.o.)
Ansonsten hat Elise sicher recht
elise schrieb:
wenn der lehrer schiebeoperationen verlangt, will er welche..
aber dann musst Du schon genauer werden, wie diese Schiebeoperationen mit "den nötigen Daten" ablaufen sollen. Elise hat ja bereits einen Vorschlag gemacht.
Für eine Lauftext allein benötigt man keine Schiebeoperationen.Gruß
Werner
-
da ich genau so eine aufgabe auch stellen würde..
denke ich, der herr lehrer will einfach sehen, ob die schülerInnen/studierenden/auszubildenden bits 'in dualform' verstanden haben.
wen interessiert irgendwelche farbe oder betriebssystemabhäniges zeugs?
der lehrer bietet eine schlechte zeitschleife, damit die lernenden ein programm "unabhängig" von zusatzbibliotheken herstellen können.ich würde das auf jeden so tun.

/me findet die aufgabe echt nicht schlecht, und reiht sie ein in ihre unterlagen.. zum stressen weiterer lernender..
