1 / 45

Programiranje 2 programski jezik c

Programiranje 2 programski jezik c. Staša Vujičić. Datoteke – zadatak 1 Kopiranje fajlova. #include <stdio.h> #define MAX_IME 1024 /* U C-u se sa fajlovima barata na slede ć i način: - u standardnoj biblioteci postoji definisana struktura: typedef struct { .... } FILE;

ellis
Download Presentation

Programiranje 2 programski jezik c

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programiranje 2 programski jezik c Staša Vujičić

  2. Datoteke – zadatak 1Kopiranje fajlova #include <stdio.h> #define MAX_IME 1024 /* U C-u se sa fajlovima barata na sledeći način: - u standardnoj biblioteci postoji definisana struktura: typedef struct { .... } FILE; koja sadrži sve informacije vezane za otvoreni fajl. Oveinformacije su platformski zavisne i nama nisu od značaja. Njima barataju funkcije standardne biblioteke.

  3. Fajl se otvara funkcijom: FILE * fopen(char *ime, char *nacin); Ova funkcija prihvata string sa putanjom do fajla, kaoi string koji definise način rada sa fajlom. Može biti: "r" -- fajl se otvara za čitanje (mora da postoji) "w" -- fajl se otvara za pisanje (kreira se ako ne postoji, a ako postoji, njegov sadržaj se briše) "a" -- fajl se otvara za dopisivanje (kreira se ako ne postoji. Prilikom svakog pisanja sadržaj se dodaje na kraj fajla).

  4. Funkcija fopen() vraća pokazivač na FILE strukturu koja je povezana sa otvorenim fajlom. Od tog trenutka se baratanje saotvorenim fajlom sastoji u tome da se funkcijama standardne biblioteke prosledi ovaj pokazivač kao argument. Ostalo obavljabiblioteka za nas. • Ako fajl nije uspešno otvoren, povratna vrednost je NULL. Ova konstanta je definisana u stdio.h zaglavlju na sledeći način: #define NULL 0Dakle, u pitanju je nula.

  5. Prilikom svakog otvaranja fajla, treba proveriti da li je nastupila greška. • Nakon završetka rada sa fajlom, treba ga zatvoriti: fclose(f); gde je f FILE pokazivač. • Prilikom završetka rada programa, svi fajlovise automatski zatvaraju.

  6. int main() { FILE *in, *out; char ime_fajla[MAX_IME]; int c; /* Ucitavamo ime ulaznog fajla */ printf("Uneti ime ulaznog fajla: "); scanf("%s", ime_fajla);

  7. /* Otvaramo ulazni fajl za citanje */ in = fopen(ime_fajla, "r"); /* Ako je nastupila greska (fajl ne postoji ili nemamo pravo citanja) prekidamo program. */ if(in == NULL) { printf("Greska prilikom otvaranja fajla\n"); return 1; }

  8. /* Ucitavamo ime izlaznog fajla */ printf("Uneti ime izlaznog fajla: "); scanf("%s", ime_fajla); /* Otvaramo izlazni fajl za pisanje */ out = fopen(ime_fajla, "w"); /* Ako je nastupila greska (nemamo pravo pisanja, ili ne mozemo da kreiramo fajl) prekidamo program */ if(out == NULL) { printf("Greska prilikom otvaranja fajla\n"); return 1; }

  9. /* Funkcija: int fgetc(FILE *f); učitava jedan karakter iz fajla na koji pokazuje f, i vraća njegov ASCII kod kaopovratnu vrednost. Ako je nastupio kraj fajla, vraća EOF. Funkcija: int fputc(int c, FILE *f); upisuje karakter c u fajl na koji pokazuje f. Vraća c. */

  10. /* Prepisujemo ulazni fajl u izlazni */ while((c = fgetc(in)) != EOF) fputc(c, out); /* Zatvaramo fajlove */ fclose(in); fclose(out); }

  11. Zadatak 2 • U datoteku ”podaci.txt” upisati prvih 10 prirodnih brojeva, a zatim iz iste datoteke učitati brojeve dok se ne stigne do kraja i ispisati ih na standardni izlaz.

  12. #include <stdio.h> #include <stdlib.h> /* Zbog funkcije exit */ main() { int i; int br; /* Otvaramo datoteku sa imenom "podaci.txt" za pisanje */ FILE* f = fopen("podaci.txt", "w");

  13. /* Funkcije fprintf() i fscanf() su potpuno ekvivalentne funkcijama printf() i scanf(), osim sto umesto standardnog izlaza (ulaza) koriste fajl čiji se pokazivač predaje kao prvi argument: fscanf(FILE *in, char *format, ...); fprintf(FILE *out, char *format, ...); */

  14. /* Ukoliko otvaranje nije uspelo, fopen vraca NULL. U tom slucaju,prijavljujemo gresku i zavrsavamo program */ if (f == NULL) { printf("Greska prilikom otvaranja datoteke podaci.txt za pisanje\n"); exit(1); }

  15. /* Upisujemo u datoteku prvih 10 prirodnih brojeva (svaki u posebnom redu) */ for (i = 0; i<10; i++) fprintf(f, "%d\n", i); /* Zatvaramo datoteku */ fclose(f);

  16. /* Otvaramo datoteku sa imenom podaci.txt za citanje */ f = fopen("podaci.txt", "r"); /* Ukoliko otvaranje nije uspelo, fopen vraca NULL. U tom slucaju,prijavljujemo gresku i zavrsavamo program */ if (f == NULL) { printf("Greska prilikom otvaranja datoteke podaci.txt za citanje\n"); exit(1); }

  17. /* Citamo brojeve iz datoteke dok ne stignemo do kraja i ispisujemo ihna standardni izlaz */ /* Pokusavamo da procitamo broj */ while(fscanf(f, "%d", &br) == 1) /* Ispisujemo procitani broj */ printf("Procitano : %d\n", br); /* Zatvaramo datoteku */ fclose(f); }

  18. Zadatak 3 • Na sadržaj već postojeće datoteke ”dat.txt”, dopisati ”Zdravo svima”.

  19. #include <stdio.h> main() { FILE* datoteka; /* Otvaramo datoteku za nadovezivanje i proveravamo da li je doslo do greske */ if ( (datoteka=fopen("dat.txt","a"))==NULL) { /*Prijavljuje se greska na izlazu za greske*/ fprintf(stderr,"Greska : nisam uspeo da otvorim dat.txt\n"); /*Zavrsava se rad programa*/ return 1; }

  20. /* Upisujemo sadrzaj u datoteku */ fprintf(datoteka,"Zdravo svima\n"); /* Zatvaramo datoteku */ fclose(datoteka); }

  21. Zadatak 4Argumenti komandne linije • /* Program prikazuje na izlazu argumente komandne linije koristeći najpre nizovsku, a zatim i pokazivačku sintaksu. */ • #include <stdio.h> /* Prilikom pozivanja programa iz komandne linije moguće je navesti određene opcije i argumente, koje program koristi u svom radu.

  22. Na primer, možemo pozvati program na sledeći način: ./primer ulaz.txt izlaz.txt želeci da program iskopira fajl ulaz.txt u fajl izlaz.txt. Potrebno je da postoji mehanizam da program iznutra pristupi stringovima koje je korisnik naveo prilikom poziva programa.

  23. U C-u se to ostvaruje na sledeći način. • Definisemo parametre funkcije main: • int argc - ovaj parametar prilikom pokretanja programa dobija vrednost broja argumenata koje je korisnik prilikom poziva naveo. Pri tom se i ime programa broji kao argument komandne linije. U gornjem primeru ce argc biti postavljeno na 3. • char **argv - pokazivač na pokazivač na char koji sadrži adresu prvog u nizu pokazivača na karaktere. Svaki od tih pokazivača na karaktere sadrži adresu odgovarajućeg stringa koji sadrži argument komandne linije.

  24. Na primer, u gornjem primeru • argv[0] će nam pokazivati na string "./primer“ • argv[1] će nam pokazivati na string "ulaz.txt“ • argv[2] će nam pokazivati na string "izlaz.txt". • Dakle, niz pokazivača na čiji prvi član pokazuje argv je dužine upravo argc. */

  25. int main(int argc, char **argv) { int i; /* Koriscenje nizovske sintakse */ for(i = 0; i < argc; i++) printf("argv[%d]: %s\n", i, argv[i]); /* Koriscenje pokazivacke sintakse */ for(; argc ; argc--) printf("%s ", *argv++); putchar('\n'); }

  26. Zadatak 5 • /* Program vrsi kopiranje jednog fajla u drugi. Imena ulaznog i izlaznog fajla se zadaju na komandnoj liniji. */ • #include <stdio.h> #include <stdlib.h> int main(int argc, char ** argv) { FILE *in, *out; int c;

  27. /* Proveravamo da li je korisnik uneo sve argumente komandne linije */ if(argc < 3) { printf("Koriscenje programa: %s ulazni_fajl izlazni_fajl\n", argv[0]); return 1; }

  28. /* Otvaramo ulazni fajl za citanje */ in = fopen(argv[1], "r"); /* Ako je nastupila greska (fajl ne postoji ili nemamo pravo citanja) prekidamo program. */ if(in == NULL) { printf("Greska prilikom otvaranja fajla\n"); return 1; }

  29. /* Otvaramo izlazni fajl za pisanje */ out = fopen(argv[2], "w"); /* Ako je nastupila greska (nemamo pravo pisanja, ili ne mozemo da kreiramo fajl) prekidamo program */ if(out == NULL) { printf("Greska prilikom otvaranja fajla\n"); return 1; }

  30. /* Prepisujemo ulazni fajl u izlazni */ while((c = fgetc(in)) != EOF) fputc(c, out); /* Zatvaramo fajlove */ fclose(in); fclose(out); }

  31. Zadatak 6 • /* Zadatak učitava informacije o studentima iz datoteke čije se ime zadaje sa komandne linije i koja je u formatu: n prezime1 ime1 smer1 prosek1 prezime2 ime2 smer2 prosek2 ... prezimen imen smern prosekn Studenti se sortiraju leksikografski po prezimenima i imenima, a zatim se njihovi podaci tako sortirani ispisuju na izlaz, ili u izlazni fajl, ako je njegovo ime zadato na komandnoj liniji. */

  32. #include <stdio.h> #include <string.h> #define MAX_IME 20 #define MAX_PREZIME 30 #define MAX_SMER 10 #define MAX_STUDENATA 100

  33. /* Struktura koja predstavlja informacije o studentu */ typedef struct student { char ime[MAX_IME]; char prezime[MAX_PREZIME]; char smer[MAX_SMER]; double prosek; } Student;

  34. /* Funkcija upoređuje dva studenta po leksikografskom poretku njihovih imena i prezimena. Funkcija vraća vrednost manju od nule ako je prvi student "manji" od drugog, vrednost veću od nule ako je prvi student "veći" od drugog, dok nulu vraća ako se studenti zovu isto. */

  35. int uporedi(Student *s, Student *p) { int t; /* Najpre poredimo prezimena. Ako su prezimena ista, onda poredimo i imena. */ if((t = strcmp(s->prezime, p->prezime)) != 0) return t; else return strcmp(s->ime, p->ime); }

  36. /* Funkcija sortira niz studenata u leksikografskom poretku */ void sortiraj(Student studenti[], int n) { int i, j; int min; Student pom;

  37. /* Studenti se porede funkcijom uporedi(). Zamena elemenata niza se obavlja na uobičajen način, zato što je dodela struktura legitimna operacija. */ for (i = 0; i < n - 1; i++) { min = i; for (j = i + 1; j < n; j++) if (uporedi(&studenti[j], &studenti[min]) < 0) min = j;

  38. if (min != i) { pom = studenti[i]; studenti[i] = studenti[min]; studenti[min] = pom; } } }

  39. /* Funkcija ucitava podatke o studentu */ void ucitaj(FILE *in, Student *s) { fscanf(in, "%s", s->prezime); fscanf(in, "%s", s->ime); fscanf(in, "%s", s->smer); fscanf(in, "%lf", &s->prosek); }

  40. /* Ispisujemo informacije o studentu */ void ispisi(FILE *out, Student *s) { fprintf(out, "%s %s %s %f\n", s->prezime, s->ime, s->smer, s->prosek); }

  41. /* Funkcija main */ int main (int argc, char ** argv) { int n, i; FILE *in = stdin, *out = stdout; Student studenti[MAX_STUDENATA];

  42. /* Ako je korisnik uneo ime ulaznog fajla...*/ if(argc > 1) if((in = fopen(argv[1], "r")) == NULL) { fprintf(stderr, "Greska prilikom otvaranja fajla!\n"); return 1; }

  43. /* Ako je korisnik uneo i ime izlaznog fajla...*/ if(argc > 2) if((out = fopen(argv[2], "w")) == NULL) { fprintf(stderr, "Greska prilikom otvaranja fajla!\n"); return 1; }

  44. /* Ucitavamo broj studenata */ fscanf(in, "%d", &n); /* Ucitavamo informacije o studentima */ for(i = 0; i < n; i++) ucitaj(in, &studenti[i]);

  45. /* Sortiramo niz studenata */ sortiraj(studenti, n); /* Ispisujemo niz studenata */ for(i = 0; i < n; i++) ispisi(out, &studenti[i]); }

More Related