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: /***********************************