Friday, November 20, 2015

Limbajul C. Mai multe probleme cu tablouri

Urmatoarele enunturi figureaza in cursul predat la University College Cork.

1. Se cere un program care citeste de la tastatura numere reale dubla precizie intr-un cuantum n specificat de utilizator, le stocheaza intr-un tablou de maximum 100 de elemente, calculeaza suma si media lor. La final se elimina din suma valorile extreme introduse, adica maximul si minimul. Se afiseaza tabloul initial apoi se realizeaza inversarea elementelor stocate in tablou, astfel incat primul devine ultimul etc.


Evident, se vor folosi functii definite de utilizator pentru fiecare sarcina specificata.
Codul si printscreen-ul: 


#include <stdio.h>

void FeedArray(double *tab, int n);

void SumAndAverage(double *tab, double *sum, double *average, int n, int flag);

void ReverseArr(double *tab, int n);

void PrintArr(double *tab, int n);

int main()
{
            double tab[100] = {0}, sum, average; // toate elementele sunt initializate cu zero
            int n, flag = 0;
            printf("\nIntroduceti in tablou un numar de elemente reale n: ");
            scanf("%d", &n);
            FeedArray(tab, n);
            printf("\nVom afisa suma si media valorilor introduse.\n");
            SumAndAverage(tab, &sum, &average, n, flag);
            printf("Suma: %.2lf. Media: %.2lf.", sum, average);
            flag = 1;
            printf("\nVom afisa acum media dupa ce am eliminat din suma min si max: ");
            SumAndAverage(tab, &sum, &average, n, flag);
            printf("%.2lf.", average);
            printf("\nAfisam tabloul initial:\n");
            PrintArr(tab, n);
            printf("\nAfisam tabloul inversat:\n");
            ReverseArr(tab, n);
            PrintArr(tab, n);
            return 0;
}

void FeedArray(double *tab, int n)
{
            int i;
            for(i = 0; i < n; i++)
            {
                        printf("tab[%d]: ", i);
                        scanf("%lf", &tab[i]);
            }
}

void SumAndAverage(double *tab, double *sum, double *average, int n, int flag)
{
            *sum = 0;
            int i;
            double min, max;
            for(i = 0; i < n; i++) *sum += tab[i];
            if(!flag) *average = *sum/n;
            else
            {
                        min = max = tab[0];
                        for(i = 0; i < n; i++)
                        {
                                    if(tab[i] <= min) min = tab[i];
                                    if(tab[i] > max) max = tab[i];
                        }
            //          printf("\nMin: %.2lf. Max: %.2lf.", min, max);
                        *average = (*sum - min - max)/(n - 2);
            }
}

void PrintArr(double *tab, int n)
{
     int i;
     for(i = 0; i < n; printf("%.2lf ", tab[i++]));
}

void ReverseArr(double *tab, int n)
{
     int i;
     double temp;
     for(i = 0; i < n/2; i++)
     {
        temp = tab[i];
        tab[i] = tab[n - 1 - i];
        tab[n - 1 - i] = temp;
     }
}





2. Codul unei histograme. Un tablou monodimensional tab1 de 10 elemente este initializat cu valori intregi, cu observatia ca valorile mai mari sau egale cu 10 vor 'umple' o intreaga coloana cu simbolul '*'.

Histograma este implementata cu o matrice bi dimensionala 10 x 10 denumita tab.

Un element al tab1 avand indexul k, 0 <= k <=9,  va induce urmatorul comportament:

a) Daca tab1[k] == N, atunci orice element tab[i][k] cu 9 - i < N, cu i efectuand iteratii de la 0 la 9, va contine simbolul '*', cod ASCII 42.

De exemplu, daca tab1[3] = 6, atunci elementele tab[4][3], tab[5][3], tab[6][3], …, tab[9][3] vor contine '*' pentru ca 9 - 4 == 5 < 6, 9 - 5 < 6,…., 0 < 6.

b) Corespunzator, elemente tab[3][3], …, tab[0][3] vor fi initializate cu valoarea NULL (cod ASCII 0) pentru ca inegalitatea anterioara nu mai este respectata.

Matricea tab este declarata de tipul intreg dar elementele sale sunt afisate ca si caractere.

Codul si printscreen-ul:

#include <stdio.h>

void PrintMat(int tab[][10])
{
  int i, j;
  for(i = 0; i < 10; i++)
   for(j = 0; j < 10; j++)
   {
    printf("%c ", tab[i][j]);
    if(j%9 == 0 && j != 0) printf("\n");
   }
}

int main()
{
   int tab[10][10];
   int tab1[10];
   int k, i, j;
   printf("\nIntroduceti 10 valori intregi.\n");
   for(k = 0; k < 10; k++)
   {
         printf("Tab[%d]: ", k);
         scanf("%d", &tab1[k]);
         _flushall();
   }
   // pentru valori tab1[k] >= 0 coloana coresp. are TOATE elementele '*'
   for(j = 0; j < 10; j++)
    for(i = 0; i < 10; i++)
     {
       if(9 - i < tab1[j]) tab[i][j] = 42; // ASCII code for '*'
       else tab[i][j] = 0; // ASCII code for NULL
     }
   PrintMat(tab);
   for(i = 0; i < 10; i++) printf("%d ", tab1[i]);
   return 0;

}


No comments:

Post a Comment