Logo
IT Dienstleistungen

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;
}

Seiten-Werkzeuge