Advertisement
cmiN

abonati

Nov 6th, 2012
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.54 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h> // pentru a verifica tipul caracterului
  4.  
  5.  
  6. #define DBG 0 // pentru debug
  7. #define DIMT 16 // dimensiune maxima telefon
  8. #define DIMN 32 // dimensiune maxima nume + prenume
  9. // e recomandat sa folosesti mereu puteri ale lui 2
  10.  
  11.  
  12. void parse(const char* buffer, int* numar, int* numLen, char* nume)
  13. {
  14.     const char* p = buffer; // cu p ne deplasam in sir
  15.     // cat timp citim cifre stocam in numar
  16.     while (isdigit(*p)) // cat timp avem cifre (de aia am inlcus ctype.h)
  17.         numar[(*numLen)++] = *p++ - '0';
  18.     // daca s-a ajuns aici e clar ca avem spatiu
  19.     strcpy(nume, p + 1); // copiem ce este dupa spatiu in nume
  20.     // verificam daca exista new line
  21.     int len = -1;
  22.     while (nume[++len]); // incrementam len pana ajungem la NULL
  23.     if (nume[len - 1] == '\n') // avem new line, deci il scoatem
  24.         nume[--len] = 0; // punand NULLul un pas in spate
  25. }
  26.  
  27.  
  28. int premiat(int* numar, int numLen)
  29. {
  30.     // verificam daca prima si ultima sunt proportionale
  31.     if (numar[0] % numar[numLen - 1] &&
  32.         numar[numLen - 1] % numar[0])
  33.         return 0; // daca ambele au restul diferit de 0
  34.     // acum verificam daca e vreo cifra impara
  35.     for (int i = 0; i < numLen; ++i)
  36.         if (numar[i] % 2)
  37.             return 0;
  38.     return 1;
  39. }
  40.  
  41.  
  42. int main()
  43. {
  44.     /* citim de la tastatura numele/locatia fisierului
  45.        si o/il deschidem  */
  46.     char fname[16];
  47.     printf("Nume lista: ");
  48.     scanf("%s%*c", fname); // citim un sir ignorand ultimul caracter
  49.     #if DBG                // astfel eliminand NL din buffer
  50.     fprintf(stderr, "fname: %s\n", fname);
  51.     fprintf(stderr,"getchar(): %d\n", (int)getchar());
  52.     #endif
  53.     FILE* fin = fopen(fname, "r");
  54.     if (!fin) {
  55.         fprintf(stderr, "Eroare: fisierul nu a putut fi deschis\n");
  56.         return 1;
  57.     }
  58.     /* acum citim fiecare linie intr-un buffer
  59.        pana dam de EOF si separam telefonul de nume*/
  60.     char buffer[DIMT + DIMN];
  61.     do {
  62.         char* ret = fgets(buffer, DIMT + DIMN, fin);
  63.         if (!ret)  // daca am ajuns la capatul fisierului
  64.             break; // SI daca nu am apucat sa citim vreo linie
  65.                    // atunci iesim din bucla
  66.         int numar[DIMT], numLen = 0;
  67.         char nume[DIMN];
  68.         // completam variabilele cu date din buffer
  69.         parse(buffer, numar, &numLen, nume);
  70.         if (premiat(numar, numLen))
  71.             printf("%s\n", nume);
  72.     } while (!feof(fin)); // cat timp nu am ajuns la capatul fisierului
  73.     fclose(fin);
  74.     return 0;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement