Aquädukt Splitted (Empfänger)
Sender und Emppfänger in unterschiedlichen Programmen, müssen nacheinander auf zwei unterschiedlichen Konsolen gestartet werden (Araber, Römer).
/**************************************************************** * Aquaedukt - Roemische Zahlen durch Pipe uebersetzen * * (c) 2009 Manuel Krischer fuer das Betriebssystempraktikum * * Hier der Empfaenger * ****************************************************************/ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <ctype.h> #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> /* Pipe Name und Berechtigung festlegen */ #define PIPEFILE "aquaedukt" #define PIPEPERM 0777 /*zuordnung roemische/arabische ziffern festlegen*/ #define M 1000 #define D 500 #define C 100 #define L 50 #define X 10 #define V 5 #define I 1 /*anzahl roemische zahlzeichen*/ #define zeichen 7 int roman[zeichen] = { M, 0, C, 0, X, 0, I }; char show_roman[zeichen]= { 'M', 'D', 'C', 'L', 'X', 'V', 'I' }; int count[zeichen] = { 0, 0, 0, 0, 0, 0, 0}; int roemer() { int wert, auslesen, o=0, e=0, i=0, j=0, k=0, tmp_zahl; char tmp_wort[128]; FILE *input; /* Datei/Named Pipe oeffnen */ printf("Warte auf die Arabischen Zahlenkompanie...\n"); if ((input = fopen(PIPEFILE, "r")) != NULL) { while (!feof(input)) { /*arabische zahlen aus pipe lesen*/ fscanf(input, "%i", &tmp_zahl); /*bei ner 0 programm beenden*/ if (tmp_zahl == 0) { printf("\nEingabe wurde beendet...\n"); return 0; } /*aktuelle arabische zahl sichern*/ wert = tmp_zahl; /*anzahl der roemischen zahlwerte ermitteln, achtung nicht durch die 0-werte teilen, deswegen +2*/ for (o=0; o<zeichen; o=o+2) { if (tmp_zahl >= roman[o]) { count[o] = tmp_zahl / roman[o]; tmp_zahl = tmp_zahl - roman[o] * count[o]; } else { count[o] = 0; } } /*in dem array count steckt jetzt die anzahl der jeweiligen buchstaben, die benoetigt werden*/ /*ermittelte roemische werte als buchstaben in chararray schreiben*/ for (k=0; k<zeichen; k++) { /*solange noch zeichen da sind, pruefen*/ while (count[k] != 0 ) { /*bei einer anzahl von 9, darf 1, 10 und 100 von der jeweils 2 stellen groesseren einheit abgezogen werden*/ if (count[k] == 9 ) { tmp_wort[e++] = show_roman[k]; tmp_wort[e++] = show_roman[k-2]; count[k] = 0; } /*bei 4 gilt das ganze fuer die naechstgroessere*/ else if (count[k] == 4 ) { tmp_wort[e++] = show_roman[k]; tmp_wort[e++] = show_roman[k-1]; count[k] = 0; } /*wenn 5 gezahelt wurden, wird durch die naechstgroessere einheit ersetzt*/ else if (count[k] > 4 && count[k] < 9) { tmp_wort[e++] = show_roman[k-1]; count[k] -= 5; } else { /*ansonsten ein zeichen hinzufuegen und weiterprobieren*/ tmp_wort[e++] = show_roman[k]; count[k] -= 1; } } } /*nullbyte anhaengen*/ tmp_wort[e] = '\0'; e=0; /*aktuelles wort in wortarray kopieren*/ printf("Arabisch: %i \t\tRoemisch: %s\n",wert, tmp_wort); j++; } fclose(input); } else { printf("nix pipe gefunden!\n"); return 1; } return; } /*Hauptprogramm*/ int main(int argc,char *argv[]) { roemer(); unlink(PIPEFILE); return; }