Word Editor with Trees

Source Code in C

 1: Word Editor with Trees
 2: 
 3: /*** Αρχειο wordedit.c - Word Editor Program.****************/
 4: /* ----------------------- *
 5:  * Κωνσταντίνος Χαλβαντζής & Μπερτζελέτος Αλέξανδρος *
 6:  * ----------------------- *
 7:  * Α.Μ. : 018200100093 & 018200100056 *
 8:  ************************************************************/
 9: /****************************************************
 10: /* Τρίτη 1 Ιουνίου 2004 *
 11: /* Εργασία 3.Στο μάθημα Δομές Δεδομένων *
 12: /* Χαλβαντζής Κωνσταντίνος *
 13: /* Α.Μ.:018200100093 *
 14: /* Μπερτζελέτος Αλέξανδρος *
 15: /* Α.Μ.:018200100056 *
 16: /****************************************************/
 17: /*Δηλώσεις βιβλιοθηκών*/
 18: #include <stdio.h>
 19: #include <stdlib.h>
 20: #include <string.h>
 21: #include "tr_pointer.c"
 22: /************************************************************************************/
 23: /*Δηλώσεις Καθολικών Μεταβλητών.*/
 24: char onoma_arxeiou[20];  //Το όνομα του αρχείου κειμένου που θα διαβαστεί.
 25: char onoma_neo[20];      //Το όνομα του αρχείου κειμένου που θα αποθηκευτούν οι αλλαγές.
 26: int megethos;            //Το μέγεθος του αρχείου κειμένου.
 27: /************************************************************************************/
 28: /*Πρωτότυπα συναρτήσεων*/
 29: int finterface();
 30: void open_arxeio(typos_deikti *pinakas,char *onomata);
 31: void edit_file(typos_deikti *pinakas,char *onomata);
 32: void help();
 33: long megethos_arxeiou(char onoma_arxeiou[20]);
 34: void diavasma_arxeiou(typos_deikti *pinakas,char onoma_arxeiou[20]);
 35: void diavasma_dentro(typos_deikti *pinakas,char onoma_arxeiou[20]);
 36: void kataxorisi_onomatwn(char *keimeno);
 37: int EIS(typos_deikti *pinakas,int megethos,char *keimeno);
 38: void ANAZ(typos_deikti *pinakas,char *onomata);
 39: void DIAG(typos_deikti *pinakas,int megethos,char *onomata);
 40: void DIOR(typos_deikti *pinakas,int megethos,char *onomata);
 41: void TYP(typos_deikti *pinakas,int megethos,char *onomata);
 42: void eisagwgh(void);
 43: void telos(void);
 44: /************************************************************************************/
 45: /*Η συνάρτηση main().*/
 46: /*********************/
 47: void main(void)
 48: {
 49:     char *onomata;                        
 50:     typos_deikti *pinakas;
 51:     onomata=malloc(1000*sizeof(char)); //Πίνακας 1000 θέσεων που θα αποθηκευτούν τα περιεχόμενα του αρχείου κειμένου.
 52:     pinakas=malloc(90*sizeof(typos_deikti)); //Ο πίνακας δεικτών ASCII A=65 ... Z=90. 
 53:     eisagwgh();
 54: 
 55: a:;    switch(finterface()) //Εξέταση της επιλογής του χρήστη.
 56:     {
 57:         case 1:
 58:             open_arxeio(pinakas,onomata); //Άνοιγμα του αρχείου κειμένου.
 59:             goto a;
 60:         case 2:
 61:             if(strcmp(onoma_arxeiou,"")==0) //Αν δεν έχει ανοιχτεί κάποιο αρχείο.
 62:             {
 63:                 printf("Keno Arxeio!Prepei na anoiksete ena arxeio keimenou prota!\n");
 64:                 goto a;
 65:             }
 66:             edit_file(pinakas,onomata); //Επεξεργασία του αρχείου κειμένου.
 67:             goto a;
 68:         case 3:
 69:             help(); //Εμφάνιση του Help του προγράμματος.
 70:             getchar();
 71:             goto a;
 72:         case 0:
 73:             telos();  //Τίτλοι τέλους.
 74:             exit(1);
 75:     }
 76: }
 77: /************************************************************************************/
 78: /**************************************************************************
 79: Η συνάρτηση diavasma_arxeiou() διαβάζει ένα αρχείο κειμένου και δημιουργεί 
 80: τα ΔΔΑ αποθηκεύοντας μαζί με τη λέξη και τους αριθμούς των γραμμών 
 81: του κειμένου, όπου εμφανίζεται η συγκεκριμένη λέξη.Τυπώνει τις λέξεις του κειμένου
 82: και τον αριθμό γραμμής που βρέθηκαν.
 83: /***************************************************************************/
 84: void diavasma_arxeiou(typos_deikti *pinakas,char onoma_arxeiou[20])
 85: {
 86:     FILE *arxeio;
 87:     int i,grammi;
 88:     char c,leksi[20];
 89:     grammi=1;
 90:     if((arxeio=fopen(onoma_arxeiou,"r"))==NULL)  //Άνοιγμα του αρχείου κειμένου.
 91:     {
 92:         fprintf(stderr,"Lathos sto anoigma tou arxeiou %s",onoma_arxeiou);
 93:         exit (-1);
 94:     }
 95:     for(i=65;i<=90;i++)
 96:         dhmiourgia(&pinakas[i]);    //Δημιουργία των ΔΔΑ.
 97:     while(!feof(arxeio))
 98:     {
 99:         fscanf(arxeio,"%s",leksi);        //Διαβάζουμε μία-μία τις λέξεις του αρχείου.
 100:         printf("%s,%d\n",leksi,grammi);   //Τυπώνει την λέξη και τον αριθμό γραμμής.
 101:         eisagogi_dentro(&pinakas[leksi[0]],leksi,grammi); //Εισαγωγή στο δέντρο της λέξης και της γραμμής.
 102:         c=fgetc(arxeio);        //Διαβάζουμε τον επόμενο χαρακτήρα.
 103:         while(c==' ')    //Όσο οι χαρακτήρες είναι κενοί προχωράμε στον επόμενο.
 104:             c=fgetc(arxeio);
 105:         if(c<0)
 106:             break;
 107:         if(c=='\n')  //Αν βρεθεί ο χαρακτήρας νέας γραμμής αυξάνουμε τον αριθμό γραμμών.
 108:             grammi++;
 109:         else
 110:             fseek(arxeio,-1,SEEK_CUR);
 111:     }
 112:     fclose(arxeio);
 113: }
 114: /************************************************************************************/
 115: /**************************************************************************
 116: Η συνάρτηση diavasma_lista() διαβάζει ένα αρχείο κειμένου και δημιουργεί 
 117: τα ΔΔΑ αποθηκεύοντας μαζί με τη λέξη και τους αριθμούς των γραμμών 
 118: του κειμένου, όπου εμφανίζεται η συγκεκριμένη λέξη.
 119: /***************************************************************************/
 120: void diavasma_dentro(typos_deikti *pinakas,char onoma_arxeiou[20])
 121: {
 122:     FILE *arxeio;
 123:     int i,grammi;
 124:     char c,leksi[20];
 125:     grammi=1;
 126:     if((arxeio=fopen(onoma_arxeiou,"r"))==NULL)  //Άνοιγμα του αρχείου κειμένου.
 127:     {
 128:         fprintf(stderr,"Lathos sto anoigma tou arxeiou %s",onoma_arxeiou);
 129:         exit (-1);
 130:     }
 131:     for(i=65;i<=90;i++)
 132:         dhmiourgia(&pinakas[i]);    //Δημιουργία των ΔΔΑ.
 133:     while(!feof(arxeio))
 134:     {
 135:         fscanf(arxeio,"%s",leksi);    //Διαβάζουμε μία-μία τις λέξεις του αρχείου.
 136:         eisagogi_dentro(&pinakas[leksi[0]],leksi,grammi);  //Εισαγωγή στο δέντρο της λέξης και της γραμμής.
 137:         c=fgetc(arxeio);  //Διαβάζουμε τον επόμενο χαρακτήρα.
 138:         while(c==' ')    //Όσο οι χαρακτήρες είναι κενοί προχωράμε στον επόμενο.
 139:             c=fgetc(arxeio);
 140:         if(c<0)
 141:             break;
 142:         if(c=='\n')  //Αν βρεθεί ο χαρακτήρας νέας γραμμής αυξάνουμε τον αριθμό γραμμών.
 143:             grammi++;
 144:         else
 145:             fseek(arxeio,-1,SEEK_CUR);
 146:     }
 147:     fclose(arxeio);
 148: }
 149:  
 150: /************************************************************************************/
 151: /**************************************************************************
 152: Η συνάρτηση kataxorisi_onomatwn() διαβάζει ένα αρχείο κειμένου και αποθηκεύει
 153: τα περιεχόμενα του στον πίνακα χαρακτήρων onomata.
 154: /***************************************************************************/
 155: void kataxorisi_onomatwn(char *onomata)
 156: {
 157:     FILE *arxeio;
 158:     int i;
 159:     if((arxeio=fopen(onoma_arxeiou,"r"))==NULL)
 160:         {
 161:             fprintf(stderr,"Lathos sto anoigma tou arxeiou %s",onoma_arxeiou);
 162:             exit (-1);
 163:         }
 164:         i=0;
 165:     while(!feof(arxeio))
 166:         {
 167:             fscanf(arxeio,"%c",&onomata[i]);
 168:             i++;
 169:         }
 170:     fclose(arxeio);
 171: }
 172: 
 173: /************************************************************************************/
 174: /**************************************************************************
 175: Η συνάρτηση ANAZ() τυπώνει όλες τις γραμμές του κειμένου που εμφανίζεται 
 176: μία δεδομένη λέξη,διαφορετικά τυπώνει: η λέξη δε βρέθηκε.
 177: /***************************************************************************/
 178: void ANAZ(typos_deikti *pinakas,char *onomata)
 179: {
 180:     int i,grammi,j;
 181:     char leksi[20];
 182:     typos_deikti deiktis;
 183:     printf("Dwste th leksi pou anaziteitai: ");
 184:     scanf("%s",leksi);  //Εισάγουμε την λέξη που θέλουμε να αναζητήσουμε.
 185:     deiktis=anazitisi_dentro(&pinakas[leksi[0]],leksi); //Αναζήτηση της λέξης στο ΔΔΑ.
 186:     if(deiktis==NULL)  //Αν δεν βρέθηκε.
 187:         printf("H leksi den vrethike\n");
 188:     else //Αν βρέθηκε.
 189:     {
 190:         printf("H leksi brethike stis e3hs grammes: \n");
 191:         for(i=0;i<4;i++)
 192:         {
 193:             if (periexomeno_grammis(&deiktis,i)>0)
 194:             {
 195:                 printf("Grammi: %d",periexomeno_grammis(&deiktis,i));//Τυπώνουμε τον αριθμό γραμμής που βρέθηκε η λέξη.
 196:                 printf("\n");
 197:                 j=0;
 198:                 grammi=1;
 199:                 while(grammi!=periexomeno_grammis(&deiktis,i))
 200:                 {
 201:                     while(onomata[j]!='\n') 
 202:                     {
 203:                         j++;  //Υπολογίζουμε την θέση στο κείμενο που βρίσκετε η συγκεκριμένη γραμμή.
 204:                     }
 205:                     grammi++; 
 206:                     j++;
 207:                 }
 208:                 while(onomata[j]!='\n' && onomata[j]>=0)
 209:                 {
 210:                     printf("%c",onomata[j]); //Τυπώνουμε ολόκληρη την γραμμή στην οποία βρέθηκε η λέξη.
 211:                     j++;
 212:                 }
 213:                 printf("\n");
 214:             }
 215:         }
 216:     }
 217: }
 218: 
 219: /************************************************************************************/
 220: /**************************************************************************
 221: Η συνάρτηση DIAG() διαγράφει μια δεδομένη λέξη από όλο το κείμενο. 
 222: Για τη διαγραφή αντικαταστεί τα γράμματα της λέξης με κενά.
 223: /***************************************************************************/
 224: void DIAG(typos_deikti *pinakas,int megethos,char *onomata)
 225: {
 226:     FILE *arxeio;
 227:     int d,i,k,j;
 228:     char leksi[20];
 229:     typos_deikti deiktis;
 230:     char *neo;
 231:     neo=malloc(1000*sizeof(char));
 232:     printf("Dwste th leksi pou thelete na diagrapsete: ");
 233:     scanf("%s",leksi);  //Εισάγουμε την λέξη που θέλουμε να διαγράψουμε.
 234:     deiktis=anazitisi_dentro(&pinakas[leksi[0]],leksi);  //Αναζήτηση της λέξης στο ΔΔΑ.
 235:     if(deiktis==NULL)
 236:     {
 237:         printf("H leksi auth den uparxei sto arxeio.\n");
 238:     }
 239:     if((arxeio=fopen(onoma_neo,"w"))==NULL)  //Ανοίγουμε το νέο αρχείο για απόθηκευση των αλλαγών.
 240:     {
 241:         fprintf(stderr,"Lathos sto anoigma tou arxeiou %s",onoma_arxeiou);
 242:         exit (-1);
 243:     }
 244:     for(i=0;i<megethos;i++)
 245:     {
 246:         d=1;
 247:         k=strlen(leksi);  //Μήκος της λέξης.
 248:         for(j=i;j<(i+k);j++)  //Εξετάζουμε έναν-έναν τους χαρακτήρες του πίνακα περιεχομένων με τους
 249:             if(onomata[j]!=leksi[j-i])   // χαρακτήρες της λέξης μέχρι να βρούμε την λέξη.
 250:                 d=0;
 251:         if(d==1)
 252:         {
 253:             for(j=i;j<(i+k);j++)        //Στις θέσεις που βρέθηκε η λέξη αντικαθιστούμε
 254:                 onomata[j]=' ';            //τους χαρακτήρες της με τους κενούς χαρακτήρες.
 255:         }
 256:     }
 257:     for(i=0;i<megethos;i++)
 258:     {
 259:         if(onomata[i]>=0)   //Γράφουμε στο νέο αρχείο τα περιεχόμενα του πίνακα μετά τις αλλαγές.
 260:             fprintf(arxeio,"%c",onomata[i]);
 261:         else
 262:             i=megethos-1;
 263:     }
 264:     fclose(arxeio);
 265:     diagrafi_dentro(&pinakas[leksi[0]],leksi); //Διαγράφουμε από τo ΔΔΑ την λέξη.
 266:     kataxorisi_onomatwn(neo);
 267: }
 268: 
 269: /************************************************************************************/
 270: /**************************************************************************
 271: Η συνάρτηση DIOR() διορθώνει μία δεδομένη λέξη σε όλο το κείμενο, 
 272: εφόσον είναι δυνατόν.
 273: /***************************************************************************/
 274: void DIOR(typos_deikti *pinakas,int megethos,char *onomata)
 275: {
 276:     FILE *arxeio;
 277:     int i,j,d,k,grammi[5];
 278:     char leksi[20],leksi2[20];
 279:     typos_deikti deiktis;
 280:     char *neo;
 281:     neo=malloc(1000*sizeof(char));
 282:     printf("Dwste th leksi pou epithumeite na diorthosete: ");
 283:     scanf("%s",leksi);//Εισάγουμε την λέξη που θέλουμε να διορθώσουμε.
 284:     if(anazitisi_dentro(&pinakas[leksi[0]],leksi)==NULL) //Αναζήτηση της λέξης στο ΔΔΑ.
 285:         printf("H leksi den uparxei sto keimeno\n");
 286:     else  //Αν βρέθηκε.
 287:     {
 288:         printf("Doste tin diorthomenh leksi (%d grammata): ",strlen(leksi));
 289:         scanf("%s",leksi2);  //Εισάγουμε την διορθωμένη λέξη.
 290:         if(strlen(leksi)!=strlen(leksi2))  //Αν έχουν διαφορετικό μήκος οι λέξεις.
 291:         {
 292:             printf("H diorthosi den einai efikth\n");
 293:             return;
 294:         }
 295:         if((arxeio=fopen(onoma_neo,"w"))==NULL)  //Ανοίγουμε το νέο αρχείο για απόθηκευση των αλλαγών.
 296:         {
 297:             fprintf(stderr,"Lathos sto anoigma tou arxeiou %s",onoma_neo);
 298:             exit (-1);
 299:         }
 300:         for(i=0;i<megethos;i++)
 301:         {
 302:             d=1;
 303:             k=strlen(leksi);  //Μήκος της λέξης.
 304:             for(j=i;j<(i+k);j++)  //Εξετάζουμε έναν-έναν τους χαρακτήρες του πίνακα περιεχομένων με τους
 305:                 if(onomata[j]!=leksi[j-i])  // χαρακτήρες της λέξης μέχρι να βρούμε την λέξη.
 306:                     d=0;
 307:             if(d==1)
 308:             {
 309:             for(j=i;j<(i+k);j++)//Εισαγωγή νέας λέξης στην θέση της παλιάς.
 310:                 onomata[j]=leksi2[j-i];
 311:             }
 312:         }
 313:         for(i=0;i<megethos;i++)
 314:         {
 315:             if(onomata[i]>=0)   //Γράφουμε στο νέο αρχείο τα περιεχόμενα του πίνακα μετά τις αλλαγές.
 316:                 fprintf(arxeio,"%c",onomata[i]);
 317:             else
 318:                 i=megethos-1;
 319:         }
 320:         fclose(arxeio);
 321:         deiktis=anazitisi_dentro(&pinakas[leksi[0]],leksi);  //Αναζήτηση της λέξης στο ΔΔΑ.
 322:         for(i=0;i<20;i++) //Αντικαθιστούμε την λέξη με την διορθωμένη στον κόμβο.
 323:              eisagogi_leksis(&deiktis,i,leksi2,i);
 324:         for(i=0;i<5;i++)
 325:             grammi[i]=periexomeno_grammis(&deiktis,i);  //Αποθηκεύουμε τις γραμμές της προηγούμενης λέξης.
 326:         eisagogi_dentro(&pinakas[leksi2[0]],periexomeno_leksis(&deiktis),0);//Εισάγουμε την διορθωμένη λέξη στο ΔΔΑ.
 327:         diagrafi_dentro(&pinakas[leksi[0]],leksi);//Διαγράφουμε από το ΔΔΑ την λέξη.
 328:         kataxorisi_onomatwn(neo);
 329:     }
 330: }
 331:  
 332: /************************************************************************************/
 333: /**************************************************************************
 334: Η συνάρτηση EIS() εισάγει μία δεδομένη λέξη σε δεδομένες γραμμές του κειμένου. 
 335: Η εισαγωγή της λέξης στη γραμμή γίνεται όπου επιθυμεί ο χρήστης(δίνεται η θέση).
 336: /***************************************************************************/
 337: int EIS(typos_deikti *pinakas,int megethos,char *onomata)
 338: {
 339:     FILE *arxeio;
 340:     char leksi[20];
 341:     char *neo;
 342:     int i,j,k,grammi,metritis,thesi,theseis;
 343:     neo=malloc(1000*sizeof(char));
 344:     metritis=1;
 345:     printf("Doste th leksi pou thelete na eisagete: ");
 346:     scanf("%s",leksi);  //Δίνουμε την λέξη που θέλουμε να εισάγουμε.
 347:     k=strlen(leksi);    //Μήκος της λέξης.
 348:     printf("Doste th grammi stin opoia thelete na eisagete th leksi: ");
 349:     scanf("%d",&grammi);  //Δίνουμε την γραμμή στην οποία θέλουμε να εισάγουμε την λέξη.
 350:     printf("Doste th thesi stin opoia thelete na eisagete th leksi: ");
 351:     scanf("%d",&thesi);  //Δίνουμε την θέση στην γραμμή που θα γίνει η εισαγωγή.
 352:     if(thesi<=0)
 353:     {
 354:         printf("Oi theseis ksekinane apo to 1.\n");
 355:         exit(0);
 356:     }
 357:     getchar();
 358:     if((arxeio=fopen(onoma_neo,"w"))==NULL) //Ανοίγουμε το νέο αρχείο για απόθηκευση των αλλαγών.
 359:     {
 360:         fprintf(stderr,"Lathos sto anoigma tou arxeiou %s",onoma_neo);
 361:         exit (-1);
 362:     }
 363:     for(i=k;i>=0;i--)  //Προσθέτουμε στην αρχή της λέξης τον κενό χαρακτήρα.
 364:     {
 365:         leksi[i]=leksi[i-1];
 366:     }
 367:     leksi[0]=' ';
 368:     k++;
 369:     for(i=0;i<megethos;i++)
 370:     {
 371:         if(metritis==grammi)  //Βρίσκουμε την θέση στον πίνακα των περιεχομένων που 
 372:         {                     //αντιστοιχεί η γραμμή που έδωσε ο χρήστης.
 373:             theseis=i;
 374:             while(onomata[theseis]!='\n')
 375:                 theseis++;
 376:             theseis=theseis-i;
 377:             if(thesi>theseis+1) //Υπολογίζουμε τις θέσεις στην συγκεκριμένη γραμμή.
 378:             {
 379:                 printf("Den yparxoun toses theseis stin grammi %d\n",grammi);
 380:                 break;
 381:             }    
 382:             i=i+thesi-1;
 383:             for(j=megethos;j>=i;j--)  //Μετατοπίζουμε τα περιεχόμενα του πίνακα.
 384:                 onomata[j+k+1]=onomata[j];
 385:             for(j=i;j<i+k;j++)
 386:                 onomata[j]=leksi[j-i];   //Εισάγουμε την καινούρια λέξη.
 387:                 onomata[i+k]=' ';        //Στο τέλος της εισάγουμε τον κενό χαρακτήρα.
 388:                 megethos+=k+1;
 389:             for(i=0;i<megethos;i++)
 390:             {
 391:                 if(onomata[i]>=0)   //Γράφουμε στο νέο αρχείο τα περιεχόμενα του πίνακα μετά τις αλλαγές.
 392:                     fprintf(arxeio,"%c",onomata[i]);
 393:                 else
 394:                     i=megethos-1;
 395:             }
 396:             fclose(arxeio);
 397:         }
 398:         if(onomata[i]=='\n')
 399:             metritis++;
 400:     }
 401:     megethos=megethos_arxeiou(onoma_neo);   //Υπολογίζουμε το μέγεθος του καινούριου αρχείου.
 402:     diavasma_dentro(pinakas,onoma_neo);        //Διαβάζουμε το καινούριο αρχείο με τις αλλαγές.
 403:     kataxorisi_onomatwn(neo);
 404:     return megethos;
 405: }
 406: 
 407: /************************************************************************************/
 408: /**************************************************************************
 409: Η συνάρτηση TYP() τυπώνει το λεξιλόγιο. 
 410: Η επιλογή αυτή έχει τις ακόλουθες υποεπιλογές:
 411:  Ο: Όλο το λεξιλόγιο.
 412:  G: Τις λέξεις που αρχίζουν από ένα δεδομένο γράμμα.
 413:  Κ: Τυπώνεται όλο το νέο κείμενο.
 414: /***************************************************************************/
 415: void TYP(typos_deikti *pinakas,int megethos,char *onomata)
 416: {
 417:     int i;
 418:     char xar,xar2,gramma;
 419:     xar='N';
 420:     while(xar=='N')
 421:     {
 422:         xar2='A';
 423:         while(xar2!='O' && xar2!='G' && xar2!='K')
 424:         {
 425:             printf("Ti thelete na ektupwthei apo ta parakatw? \n");
 426:             printf("(O)Olo to leksilogio\n");
 427:             printf("(G)To leksilogio enos grammatos\n");
 428:             printf("(K)Olo to neo keimeno\n");
 429:             scanf("\n%c",&xar2);
 430:             getchar();
 431:         }
 432:         switch(xar2)  //Εξετάζουμε την επιλογή του χρήστη.
 433:         {
 434:         case 'O':
 435:             for(i=65;i<=90;i++)
 436:             {
 437:                 if(keno_dentro(&pinakas[i])!=0)
 438:                 {
 439:                     printf("Gramma '%c'\n",i);//Τυπώνονται τα γράμματα και τα δεδομένα των συγκεκριμένων ΔΔΑ.
 440:                     ektyposi_dentro(&pinakas[i]);
 441:                     printf("\n");
 442:                 }
 443:             }
 444:             break;
 445:         case 'G':
 446:             printf("Dwste to gramma pou epithumeite : ");
 447:             scanf("%c",&gramma);
 448:             getchar();
 449:             ektyposi_dentro(&pinakas[gramma]);//Τυπώνεται το γράμμα που δίνει ο χρήστης και τα δεδομένα του συγκεκριμένου ΔΔΑ.
 450:             break;
 451:         case 'K':
 452:             printf("==========%s==========\n",onoma_neo);
 453:             for(i=0;i<megethos;i++)
 454:             {                                //Τυπώνονται τα περιεχόμενα του καινούριου κειμένου.
 455:                 if(onomata[i]>=0)
 456:                     printf("%c",onomata[i]);
 457:             }
 458:             printf("\n==============EOF==============\n");
 459:             break;
 460:         }
 461:     printf("\nThelete na ektelesete kapoia alli ektyposi: (N/O)");
 462:     scanf("%c",&xar);
 463:     getchar();
 464:     }
 465: }
 466: /************************************************************************************/
 467: /**************************************************************************
 468: Η συνάρτηση eisagwgh() είναι η εισαγωγή στο πρόγραμμα.
 469: /***************************************************************************/
 470: void eisagwgh(void)
 471: {
 472:     printf("\n\n\tKALWS HLTHATE STO PROGRAMMA MAS !!!!!!\n\n\n\n");
 473:     printf("\n\n\t*************************************************");
 474:     printf("\n\n\tElpizoume na euxaristithite thn perihghsh sas!!! ");
 475:     printf("\a\a\a\a\n\n\t*************************************************\n\n\n");    
 476:     printf("\n\n\n\n\n\n\n\n\tpathste ENTER gia na sunexeisete");
 477:     getchar(); 
 478:     system("cls");
 479: }
 480: /************************************************************************************/
 481: /**************************************************************************
 482: Η συνάρτηση telos() είναι οι τίτλοι τέλους του προγράμματος.
 483: /***************************************************************************/
 484: void telos(void)
 485: {
 486:     system("cls");
 487:     printf("\nEyxaristoume gia to xrono pou mas afierwsate!!!");
 488:     printf("\n\nETHNIKO KAI KAPODISTRIAKO PANEPISTHMIO ATHINWN");
 489:     printf("\nATHINA 01/06/2004");
 490:     printf("\n\nHtan mia ergasia twn:");
 491:     printf("\n\n\n\t XALBANTZHS KONSTANTINOS");
 492:     printf(" A.M:018200100093");
 493:     printf("\n\t------------------------");
 494:     printf("\n\n\t MPERTZELETOS ALEKSANDROS");
 495:     printf(" A.M:018200100056");
 496:     printf("\n\t------------------------\n\n\n\n\n\n\n\n");
 497:     getchar();
 498: }
 499: /************************************************************************************/
 500: /**************************************************************************
 501: Η συνάρτηση megethos_arxeiou() επιστρέφει το μέγεθος ενός αρχείου.
 502: /***************************************************************************/
 503: long megethos_arxeiou(char onoma_arxeiou[20])
 504: {
 505:     FILE *arxeio;
 506:     long megethos;
 507:     if((arxeio=fopen(onoma_arxeiou,"r"))==NULL)
 508:     {
 509:         fprintf(stderr,"Lathos sto anoigma tou arxeiou %s",onoma_arxeiou);
 510:         exit (-1);
 511:     }
 512:     fseek(arxeio,0,SEEK_END);
 513:     megethos=ftell(arxeio);
 514:     fclose(arxeio);
 515:     return megethos;
 516: }
 517: /************************************************************************************/
 518: /**************************************************************************
 519: Η συνάρτηση finterface() ειναι το interface του κύριου προγράμματος.
 520: /***************************************************************************/
 521: int finterface()
 522: {
 523:     int epilogi=0;
 524: 
 525:     printf("============================================================\n");
 526:     printf("| WORD EDITOR |\n");
 527:     printf("|----------------------------------------------------------|\n");
 528:     printf("| MADE BY |\n");
 529:     printf("| MPERTZELETOS ALEXANDROS AND CHALVATZIS KONSTANTINOS |\n");
 530:     printf("|----------------------------------------------------------|\n");
 531:     printf("| |\n");
 532:     printf("|Welcome To Word-Editor. |\n");
 533:     printf("| |\n");
 534:     printf("|Choose An Option. |\n");
 535:     printf("| |\n");
 536:     printf("| 1.Open File 2.Edit 3.Help 0.Exit |\n");
 537:     printf("|----------------------------------------------------------|\n");
 538: 
 539:     printf("->");
 540:     scanf("%d",&epilogi);  /*Επιλογή του χρήστη.*/
 541:     return epilogi;
 542: }
 543: /************************************************************************************/
 544: /**************************************************************************
 545: Η συνάρτηση open_arxeio() ανοίγει ένα αρχείο κειμένου το διαβάζει και δημιουργεί 
 546: τα ΔΔΑ.Δηλώνεται ακόμα από τον χρήστη το όνομα του αρχείου
 547: που θα αποθηκευτούν οι αλλαγές κατά τη επεξεργασία.
 548: /***************************************************************************/
 549: void open_arxeio(typos_deikti *pinakas,char *onomata)
 550: {
 551:     megethos=0;
 552:     printf("\n->Doste to onoma tou arxeiou keimenou:\n");
 553:     scanf("\n%s",onoma_arxeiou);
 554:     printf("\n->Doste to onoma_arxeiou tou arxeiou pou thelete na apothikeftoun oi allages:\n");
 555:     scanf("\n%s",onoma_neo);
 556:     megethos=megethos_arxeiou(onoma_arxeiou);
 557:     diavasma_dentro(pinakas,onoma_arxeiou);
 558:     kataxorisi_onomatwn(onomata);
 559: }
 560: /************************************************************************************/
 561: /**************************************************************************
 562: Η συνάρτηση edit_file() εκτελεί με την κατάλληλη συνάρτηση επεξεργασίας κειμένου
 563: την εντολή επεξεργασίας που θα δώσει ο χρήστης.
 564: /***************************************************************************/
 565: void edit_file(typos_deikti *pinakas,char *onomata)
 566: {
 567:     int epilogi;
 568: a:    printf("*************************WORD-EDITOR***********************************\n");
 569:     printf("* Ti thelete na ektelestei apo ta parakatw? *\n");
 570:     printf("* 1.Diabasma kai ektupwsh tou arxeiou keimenou *\n");
 571:     printf("* 2.Anazitisi leksis sto keimeno *\n");
 572:     printf("* 3.Diagrafi leksis apo to keimeno *\n");
 573:     printf("* 4.Diorthosi leksis sto keimeno *\n");
 574:     printf("* 5.Eisagogi leksis se dedomeni grammi tou keimenou *\n");
 575:     printf("* 6.Ektyposi tou leksilogiou *\n");
 576:     printf("* *\n");
 577:     printf("*-------------------7.Back to Main Menu------------------ *\n");
 578:     printf("* *\n");
 579:     printf("* PROSOXH!!! OI LEXEIS NA DWTHOYN ME ARXIKO KEFALAIO GRAMMA!!! *\n");
 580:     printf("***********************************************************************\n\n\n");
 581:     scanf("%d",&epilogi);
 582:     switch (epilogi)
 583:     {
 584:         case 1:
 585:             diavasma_arxeiou(pinakas,onoma_arxeiou);
 586:             kataxorisi_onomatwn(onomata);
 587:             break;
 588:         case 2:
 589:             ANAZ(pinakas,onomata);
 590:             break;
 591:         case 3:
 592:             DIAG(pinakas,megethos,onomata);
 593:             break;
 594:         case 4:
 595:             DIOR(pinakas,megethos,onomata);
 596:             break;
 597:         case 5:
 598:             megethos=EIS(pinakas,megethos,onomata);
 599:             break;
 600:         case 6:
 601:             TYP(pinakas,megethos,onomata);
 602:             break;
 603:         case 7:
 604:             goto b;
 605:         default:
 606:             printf("Lathos arithmos. Epilekste metaksi twn:1,2,3,4,5,6,7.\n\n\n\n");
 607:             break;
 608:     }
 609:     goto a;
 610: b:;
 611: }
 612: /************************************************************************************/
 613: /**************************************************************************
 614: Η συνάρτηση help() εμφανίζει το κείμενο βοήθειας του προγράμματος.
 615: /***************************************************************************/
 616: void help()
 617: {
 618:   printf("=========================WORD EDITOR=================================\n");
 619:   printf("-------HELP-------\n");
 620:   printf("1.Open File\n");
 621:   printf(" Doste 1 gia na anoiksete to arxeio keimenou pou thelete na\n\tdiabasete kai na epeksergasteite kathos");
 622:   printf(" kai na dosete to onoma\n\ttou arxeiou pou thelete na apothikeftoun oi allages sto keimeno.\n");
 623:   printf("2.Edit\n");
 624:   printf(" Doste 2 gia na epeksergasteite to arxeio pou anoiksate dinontas\n\tmia apo tis parakato entoles:\n\n");
 625:   printf(" 1.Diabasma kai ektupwsh tou arxeiou keimenou \n");
 626:   printf(" 2.Anazitisi leksis sto keimeno \n");
 627:   printf(" 3.Diagrafi leksis apo to keimeno \n");
 628:   printf(" 4.Diorthosi leksis sto keimeno \n");
 629:   printf(" 5.Eisagogi leksis se dedomeni grammi tou keimenou \n");
 630:   printf(" 6.Ektyposi tou leksilogiou \n");
 631:   printf("Doste ENTER gia synexeia......\n");
 632:   getchar();
 633:   getchar();
 634:   printf("3.Help\n");
 635:   printf(" Doste 3 gia na deite tin boithia(paron keimeno!).\n");
 636:   printf("0.Exit\n");
 637:   printf(" Doste 0 gia eksodo apo to programma.\n");
 638:   printf("========================================================================\n");
 639:   printf("Doste ENTER gia epistrofi sto WORD-EDITOR......\n");
 640: 
 641: }
 642: 
 643: /************************************************************************************/
 644: 
 645: /*** Αρχειο tr_pointer.c - Α.Τ.Δ Δυαδικό Δέντρο Αναζήτησης.******/
 646: /* ----------------------- *
 647:  * Κωνσταντίνος Χαλβαντζής & Μπερτζελέτος Αλέξανδρος *
 648:  * ----------------------- *
 649:  * Α.Μ. : 018200100093 & 018200100056 *
 650:  ****************************************************************/
 651: /***********************************************************************************************
 652: Αρχείο Υλoπoίησης : tr_pointer.c
 653: Συγγραφέας : Χαλβαντζής Κωνσταντίνος - Μπερτζελέτος Αλέξανδρος. 
 654: Σκοπός : Υλοποίηση με δείκτες Αφηρημένου Τύπου Δεδομένων, Δυαδικό Δέντρο Αναζήτησης
 655: ************************************************************************************************/
 656: /*Δηλώσεις βιβλιοθηκών*/
 657: #include <stdio.h>
 658: #include <stdlib.h>
 659: #include <string.h>
 660: /************************************************************************************/
 661: /*Δηλώσεις Καθολικών Μεταβλητών.*/
 662: char onoma_arxeiou[20];  //Το όνομα του αρχείου κειμένου που θα διαβαστεί.
 663: char onoma_neo[20];      //Το όνομα του αρχείου κειμένου που θα αποθηκευτούν οι αλλαγές.
 664: int megethos;            //Το μέγεθος του αρχείου κειμένου.
 665: /************************************************************************************/
 666: typedef int typos_akeraiou;
 667: typedef char xaraktiras;
 668: typedef struct typos_komvou *typos_deikti;
 669: typedef struct typos_komvou
 670: {
 671:     xaraktiras leksi[20];
 672:     typos_akeraiou x[5];
 673:     typos_deikti apaidi,dpaidi;
 674: };
 675: /************************************************************************************/
 676: /*Πρωτότυπα συναρτήσεων*/
 677: int keno_dentro(typos_deikti *riza);
 678: int sygkrisi(char a[20],char b[20]);
 679: typos_deikti anazitisi_dentro(typos_deikti *riza,xaraktiras stoixeio[20]);
 680: void dhmiourgia(typos_deikti *riza);
 681: void diagrafi_dentro(typos_deikti *riza,xaraktiras stoixeio[20]);
 682: void ektyposi_dentro(typos_deikti *riza);
 683: void eisagogi_dentro(typos_deikti *riza,char *dedomena,int grammi);
 684: void eisagogi_grammi(typos_deikti *deiktis,int grammi);
 685: int periexomeno_grammis(typos_deikti *deiktis,int emfanisi);
 686: void eisagogi_leksis(typos_deikti *deiktis,int emfanisi,char *leksi2,int emfanisi2);
 687: char* periexomeno_leksis(typos_deikti *deiktis);
 688: /************************************************************************************/
 689:  
 690: void dhmiourgia(typos_deikti *riza)
 691: {
 692: /* 
 693:  * Πρo: Kαμία
 694:  * Μέτά: Δημιoυργία κενού Δυαδικού Δέντρου Αναζήτησης
 695: */    
 696:     *riza=NULL;
 697: }
 698: 
 699: /************************************************************************************/
 700: 
 701: int keno_dentro(typos_deikti *riza)
 702: {
 703: /* 
 704:  * Πρo: Δημιoυργία ΔΔΑ
 705:  * Μέτά: επιστρέφει 0 αν το ΔΔΑ είναι κενό, διαφoρετικά 1
 706: */
 707:     if (*riza==NULL)
 708:         return 0;
 709:     return 1;
 710: }
 711:  
 712: /************************************************************************************/
 713: /*Η συνάρτηση eisagogi_dentro() εισάγει την λέξη και την γραμμή αυτής σε έναν κόμβο
 714: στο ΔΔΑ.*/
 715: void eisagogi_dentro(typos_deikti *riza,char *dedomena,int grammi)
 716: {
 717:     struct typos_komvou stoixeio;
 718:     int i;
 719:     for(i=0;i<20;i++)
 720:         stoixeio.leksi[i]=dedomena[i];
 721:     stoixeio.x[0]=grammi;
 722:     if(keno_dentro(riza)==0)
 723:     {
 724:         *riza=(typos_deikti)malloc(sizeof(struct typos_komvou));
 725:         for(i=0;i<20;i++)
 726:             (*riza)->leksi[i]=stoixeio.leksi[i];
 727:         (*riza)->x[0]=stoixeio.x[0];
 728:         (*riza)->apaidi=NULL;
 729:         (*riza)->dpaidi=NULL;
 730:     }
 731:     else if (sygkrisi(stoixeio.leksi,(*riza)->leksi)==1)
 732:         eisagogi_dentro(&((*riza)->apaidi),dedomena,grammi);
 733:     else if (sygkrisi(stoixeio.leksi,(*riza)->leksi)==0)
 734:         eisagogi_dentro(&((*riza)->dpaidi),dedomena,grammi);
 735:     else if (sygkrisi(stoixeio.leksi,(*riza)->leksi)==2)
 736:     {
 737:         eisagogi_grammi(riza,stoixeio.x[0]);
 738:     }
 739: }
 740: 
 741: /************************************************************************************/
 742: /*Η συνάρτηση sygkrisi συγκρίνει δύο λέξεις.*/
 743: int sygkrisi(char a[20],char b[20])
 744: {
 745:     int i=0;
 746:     while(a[i]!='\0' && b[i]!='\0')
 747:     {
 748:         if(a[i]<b[i])
 749:             return 1;
 750:         else if(a[i]>b[i])
 751:             return 0;
 752:         else
 753:             i++;
 754:     }
 755:     while(a[i]!='\0')
 756:         return 0;
 757:     while(b[i]!='\0')
 758:         return 1;
 759:     return 2;
 760: }
 761:  
 762: /***********************************