Advertisement
Guest User

Untitled

a guest
Mar 20th, 2019
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.94 KB | None | 0 0
  1. /*
  2. 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.
  3.  
  4. 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.
  5.  
  6. 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)).
  7. */
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <ctype.h>
  11. #include <string.h>
  12.  
  13. void greska(){
  14. fprintf(stderr,"-1");
  15. exit(EXIT_FAILURE);
  16. }
  17.  
  18. //ulazni argumenti su pokazivac na skup i datoteka na koju pokazuje pokazivac
  19. int unesiSkup(char **s, FILE* f){
  20. //pravimo odvojeni skup koji cemo koristiti smao u okviru ove funkcije
  21. //razlog za ovo je jer smo vec probali da direktno menjamo skup u kmoe treba da budu rezultati
  22. char* c = malloc(sizeof(char));
  23. if(c==NULL){
  24. greska();
  25. }
  26.  
  27. //ucitavamo i upisujemo dinamicno elemente iz fajla f u skup c sve dok ne naicjemo na element koji
  28. //nije nije niti broj niti slovo
  29. // i predstavlaja poziciju u nizu c
  30. int i = 0;
  31.  
  32.  
  33. /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  34. * PROMENILI da se fajl prosledjuje kao pokazivac
  35. pogledaj fscanf (mora &c[i], i nije vise &f, nego f)
  36. * char* c sad koristis kao nisku, pa ga dole zatvaras terminirajucom nulom
  37. i onda koristis funkcije iz string.h kao sto su strcpy, strlen, i tako to
  38. * for petlja zamenjena while petljom zbog provere za EOF
  39. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
  40.  
  41.  
  42. //for(fscanf(f,"%c", &c[i]); isdigit(c[i]) || isalpha(c[i]); fscanf(f,"%c", &c[i]))
  43. while(fscanf(f,"%c", &c[i]) != EOF && (isdigit(c[i]) || isalpha(c[i]))){
  44. printf("%c ", c[i]);
  45. i++;
  46. c = realloc(c,(i+1)*sizeof(char));
  47. if(c==NULL){
  48. greska();
  49. }
  50. }
  51. c[i] = '\0';
  52. printf("\n");
  53.  
  54. //alociramo i celija velicine char, i predstavlja poziciju poslednjeg elementa
  55. //u c, sto je ujedno ukupan broj korisnih elemenata u c
  56. if(i!=0){
  57. *s = realloc(*s, i*sizeof(char));
  58. if(*s==NULL){
  59. greska();
  60. }
  61. //ab+
  62. //a u c[0] i=1 b u c[1] i=2 + u c[2]
  63.  
  64. //kopiramo sve elemente sem poslednjeg iz c u s
  65. int k;
  66. strcpy(*s, c);
  67. for(k==0;k<i;k++){
  68. //*s[k] = c[k];
  69. //printf("%c ", *s[k]);
  70. }
  71. printf("%s\n", *s);
  72. printf("\n");
  73. }
  74. //oslobadjamo alociranu memoriju
  75. free(c);
  76. //povratna vrednost je zadata kao br elemenata skupa iako se nikad ne koristi
  77. return i;
  78. }
  79.  
  80. void prebroj(char* s, int *br_slova,int *br_cifara){
  81.  
  82. //n je velicina niza s
  83. int n = strlen(s);
  84.  
  85. *br_slova = 0;
  86. *br_cifara = 0;
  87.  
  88. //prolazimo kroz svaki elemetn u s i proveravamo da li je cifra ili slovo
  89. int i;
  90. for(i=0;i<n;i++){
  91. if(isalpha(s[i])){
  92. (*br_slova)++;
  93. }
  94. if(isdigit(s[i])){
  95. (*br_cifara)++;
  96. }
  97. }
  98.  
  99. }
  100.  
  101. int main(int argc, char** argv){
  102.  
  103. if(argc!=2){
  104. greska();
  105. }
  106.  
  107. FILE* f = NULL;
  108. f = fopen(argv[1],"r");
  109. if(f == NULL){
  110. greska();
  111. }
  112.  
  113. //inicijalna alokacija memorije za s
  114. char *s = malloc(sizeof(char));
  115. if(s == NULL){
  116. greska();
  117. }
  118.  
  119. int br_slova = 0, br_cifara = 0;
  120.  
  121. //pokretanje dve prethodno definisane funkcije
  122. //int n nije neophodno
  123. int n = unesiSkup(&s, f);
  124. prebroj(s,&br_slova,&br_cifara);
  125.  
  126. //ispisivanje rezultata prethodne dve funkcije
  127. fprintf(stdout,"broj slova: %d\nbroj cifara: %d\n",br_slova,br_cifara);
  128.  
  129. //oslobadjanje alocirane memorije
  130. free(s);
  131. fclose(f);
  132. return 0;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement