Program liczący wartość min i max w wierszach tablicy.

0

Jest to jeden z podpunktów zadania więc np. funkcję są troche bardziej rozbudowane.
Musze, pracować na wskaźnikach.

Problem leży w odnajdywaniu wartości najmniejsze i największej w wierszach.

Ten kod w teorii coś liczy, jednak rzadko te wyniki są poprawne, czy mógłby mi ktoś podpowiedzieć gdzie myślę źle?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int row_statistics(const int *ptr, int width, int height, int row_id, int* max,
                   int* min, float *avg);
int column_statistics(const int *ptr, int width, int height, int column_id,
                      int* max, int* min, float *avg);



int main(int argc, const char * argv[])
{
    
    
    srand((unsigned)time(0));
    int i,j;
    int max=0, min=0;
    int* p_max=&max;
    int* p_min=&min;
    float avg=0;
    float* p_avg=&avg;
    int a[5][5];
    int (*p_a)[5];
    p_a=a;
 
    
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
        {
            *(*(p_a+i)+j)=rand()%100;
        }
    }
    
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
        {
            printf("%2d ", *(*(p_a+i)+j));
        }
        printf("\n");
        
    }
    printf("\n");
    row_statistics(*p_a, 5, 5, 5,p_max, p_min, p_avg);
    
    
    //printf("%d",*(*(p_a+3)+4));
    return 0;
}




int row_statistics(const int *ptr, int width, int height, int row_id, int* max,
                   int* min, float *avg)
{
    int i,j;
    
   
    if(!ptr||!width||!height||!row_id||!max||!min||!avg)
    {
        return 0;
    }
    else
    {
        for(i=0;i<width;i++)
        {
            for(j=0;j<height;j++)
            {
                if(i==0 &&j==0)
                   {
                       *max=*ptr;
                       *min=*ptr;
                     printf("%d %d       ",*max,*min);
                   }
                else
                    {
                        if((*(ptr+i*5+j))>*max)
                            {
                                *max=(*(ptr+i*5+j));
                            }
                                else if((*(ptr+i*5+j))<*min)
                                {
                                    *min=(*(ptr+i*5+j));
                                }
                    
                    if(j==4)
                    {
                        printf("%d %d       ",*max,*min);
                       *max=(*(ptr+i*5));
                       *min=(*(ptr+i*5));
                      
                    }
                
                    }
                }
            }
        }

   
    return 1;
}

0

Może ktoś jednak? :\

Tu mam troszeczkę lepszą wersje lecz nadal ma problemy z 5 wierszem

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int row_statistics(const int *ptr, int width, int height, int row_id, int* max,
                   int* min, float *avg);
int column_statistics(const int *ptr, int width, int height, int column_id,
                      int* max, int* min, float *avg);



int main(int argc, const char * argv[])
{
    
    
    srand((unsigned)time(0));
    int i,j;
    int max=0, min=0;
    int* p_max=&max;
    int* p_min=&min;
    float avg=0;
    float* p_avg=&avg;
    int a[5][5];
    int (*p_a)[5];
    p_a=a;
 
    
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
        {
            *(*(p_a+i)+j)=rand()%100;
        }
    }
    
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
        {
            printf("%2d ", *(*(p_a+i)+j));
        }
        printf("\n");
        
    }
    printf("\n");
   row_statistics(*p_a, 5, 5, 5,p_max, p_min, p_avg);
   //column_statistics(*p_a, 5, 5, 5, p_max, p_min, p_avg);
    
  //  printf("%d",*(*(p_a+4)));
    return 0;
}




int row_statistics(const int *ptr, int width, int height, int row_id, int* max,
                   int* min, float *avg)
{
    int i,j;
    int suma=0;
   
    if(!ptr||!width||!height||!row_id||!max||!min||!avg)
    {
        return 0;
    }
    else
    {
        for(i=0;i<width;++i)
        {
            for(j=0;j<height;++j)
            {
                if(i==0 &&j==0)
                   {
                       *max=*ptr;
                       *min=*ptr;
                    // printf("%d %d       ",*max,*min);
                       suma=suma+ *(ptr+i*5+j);
                   }
                else
                    {
                        suma=suma+ *(ptr+i*5+j);
                        if((*(ptr+i*5+j))>*max)
                            {
                                *max=(*(ptr+i*5+j));
                                
                            }
                                else if((*(ptr+i*5+j))<*min)
                                {
                                    *min=(*(ptr+i*5+j));
                                    
                                }
                    
                    if(j==4 && i<=3)
                    {
                        
                            printf("%2d %2d  ",*max,*min);
                            *max=(*(ptr+i*5));
                            *min=(*(ptr+i*5));
                        *avg=suma/5.0;
                        printf("%2.2f        ",*avg);
                        printf("\n");
                        suma=0;
                        }
                            else if(i==4 &&j==4)
                                
                            {
                                printf("%2d %2d ",*max,*min);
                                 *avg=suma/5;
                                  printf("%2.2f       ",*avg);
                                printf("\n");
                               break;
                               // *max=*(ptr+i*5);
                              //  *min=*(ptr+i*5);
                                
                            }
                        }
                      
                      
                    }
                
                    }
                }
    
    
    printf("\n");
   
    return 1;
}




1

Dlaczego piszesz *(*(p_a+i)+j) zamiast p_a[i][j] (i tak dalej)? Możesz to wyjaśnić? Chodzi o czytelność...

0
koszalek-opalek napisał(a):

Dlaczego piszesz *(*(p_a+i)+j) zamiast p_a[i][j] (i tak dalej)? Możesz to wyjaśnić? Chodzi o czytelność...

Bez wskaźników wszystko działa, ze wskaźnikami mam problem.

0

Problem leży w odnajdywaniu wartości najmniejsze i największej w wierszach.

Hmm... powiem szczerze, że jak patrzę na kody powyżej to są tam jakieś straszne czary w tych funkcjach, a przecież chodzi o proste rzeczy, czyli odnalezienie min i max w podtablicach. Funkcje wyżej przedstawione robią o wiele za dużo i należałoby je rozbić.

#include<stdio.h>

int max(int tab[4])
{
    int max = *tab;
    for (size_t i = 1; i < 4; ++i)
    {
        if (*(tab + i) > max)
            max = *(tab + i);
    }
    return max;
}

int min(int tab[4])
{
    int min = *tab;
    for (size_t i = 1; i < 4; ++i)
    {
        if (*(tab + i) < min)
            min = *(tab + i);
    }
    return min;
}

void show_stats(int tab[][4], size_t size)
{
    for (size_t i = 0; i < size; ++i)
    {
        printf("[%d] - Max: %d, Min: %d\n", i, max(*(tab + i)), min(*(tab + i)));
    }
}

int main()
{
    int numbers[][4] =
    {
        { 1, 7, -4, 3 },
        { 2, 0, -3, 9 },
        { 8, 5, -2, 5 },
    };

    show_stats(numbers, sizeof(numbers) / sizeof(numbers[0]));

    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1