Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- a) Napisati funkciju int unesiSkup(char **s, FILE f) kojom se unosi skup elemenata iz datoteke f. Skup se predstavlja kao niz karaktera, pri čemu su dozvoljeni elementi skupa mala i velika slova abecede, kao i cifre. Unos se prekida kada se naiđe na znak za novi red ili nedozvoljeni karakter za skup. Maksimalan broj elemenata skupa nije poznat. Funkcija vraća broj elemenata skupa koji su uspešno učitani.
- b) Napisati funkciju void prebroj(char* s, int *br_slova,int *br_cifara) kojom se određuje broj slovnih elemenata skupa (velikih ili malih slova) kao i broj cifara u skupu.
- c) Napisati glavni program gde se unose podaci o skupu elemenata. Ime datoteke se zadaje kao argument komandne linije. Na stadardni izlaz ispisati informacije o broju slova i cifara (koristiti funkcije pod a) i b)).
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <ctype.h>
- #include <string.h>
- void greska(){
- fprintf(stderr,"-1");
- exit(EXIT_FAILURE);
- }
- //ulazni argumenti su pokazivac na skup i datoteka na koju pokazuje pokazivac
- int unesiSkup(char **s, FILE* f){
- //pravimo odvojeni skup koji cemo koristiti smao u okviru ove funkcije
- //razlog za ovo je jer smo vec probali da direktno menjamo skup u kmoe treba da budu rezultati
- char* c = malloc(sizeof(char));
- if(c==NULL){
- greska();
- }
- //ucitavamo i upisujemo dinamicno elemente iz fajla f u skup c sve dok ne naicjemo na element koji
- //nije nije niti broj niti slovo
- // i predstavlaja poziciju u nizu c
- int i = 0;
- /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- * PROMENILI da se fajl prosledjuje kao pokazivac
- pogledaj fscanf (mora &c[i], i nije vise &f, nego f)
- * char* c sad koristis kao nisku, pa ga dole zatvaras terminirajucom nulom
- i onda koristis funkcije iz string.h kao sto su strcpy, strlen, i tako to
- * for petlja zamenjena while petljom zbog provere za EOF
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
- //for(fscanf(f,"%c", &c[i]); isdigit(c[i]) || isalpha(c[i]); fscanf(f,"%c", &c[i]))
- while(fscanf(f,"%c", &c[i]) != EOF && (isdigit(c[i]) || isalpha(c[i]))){
- printf("%c ", c[i]);
- i++;
- c = realloc(c,(i+1)*sizeof(char));
- if(c==NULL){
- greska();
- }
- }
- c[i] = '\0';
- printf("\n");
- //alociramo i celija velicine char, i predstavlja poziciju poslednjeg elementa
- //u c, sto je ujedno ukupan broj korisnih elemenata u c
- if(i!=0){
- *s = realloc(*s, i*sizeof(char));
- if(*s==NULL){
- greska();
- }
- //ab+
- //a u c[0] i=1 b u c[1] i=2 + u c[2]
- //kopiramo sve elemente sem poslednjeg iz c u s
- int k;
- strcpy(*s, c);
- for(k==0;k<i;k++){
- //*s[k] = c[k];
- //printf("%c ", *s[k]);
- }
- printf("%s\n", *s);
- printf("\n");
- }
- //oslobadjamo alociranu memoriju
- free(c);
- //povratna vrednost je zadata kao br elemenata skupa iako se nikad ne koristi
- return i;
- }
- void prebroj(char* s, int *br_slova,int *br_cifara){
- //n je velicina niza s
- int n = strlen(s);
- *br_slova = 0;
- *br_cifara = 0;
- //prolazimo kroz svaki elemetn u s i proveravamo da li je cifra ili slovo
- int i;
- for(i=0;i<n;i++){
- if(isalpha(s[i])){
- (*br_slova)++;
- }
- if(isdigit(s[i])){
- (*br_cifara)++;
- }
- }
- }
- int main(int argc, char** argv){
- if(argc!=2){
- greska();
- }
- FILE* f = NULL;
- f = fopen(argv[1],"r");
- if(f == NULL){
- greska();
- }
- //inicijalna alokacija memorije za s
- char *s = malloc(sizeof(char));
- if(s == NULL){
- greska();
- }
- int br_slova = 0, br_cifara = 0;
- //pokretanje dve prethodno definisane funkcije
- //int n nije neophodno
- int n = unesiSkup(&s, f);
- prebroj(s,&br_slova,&br_cifara);
- //ispisivanje rezultata prethodne dve funkcije
- fprintf(stdout,"broj slova: %d\nbroj cifara: %d\n",br_slova,br_cifara);
- //oslobadjanje alocirane memorije
- free(s);
- fclose(f);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement