Word Editor with Trees

Standard
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: /***********************************
yeezy boost 350 ua yeezytrainer yeezy boost 350 ua yeezytrainer yeezytrainer yeezy boost 350 ua yeezy boost 350 ua yeezy shoes yeezy shoes yeezy boost online

yeezy 350 boost for sale yeezy boost online yeezy shoes yeezy 350 boost for sale yeezy boost online yeezy shoes yeezy 350 boost for sale yeezy boost online yeezy shoes yeezy 350 boost for sale yeezy boost online yeezy shoes