Pytanie o wskaźniki.

0

Hej :) nie rozumiem wskaźników, jak to napisać, aby jedną wartość zwrócić return, a druga przez wskaźnik? (funkcja minMax)

Prosze o jakies wytlumaczenie...

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

void wczyt1D(int x[], int n)

{
    int i;

    for (i = 0; i < n; i++) {
        printf("\n Podaj element x[%d]:", i);
        scanf("%d", &x[i]);
        fflush(stdin);
    }
}

void druk1D(int x[], int n)

{
    int i;

    for (i = 0; i < n; i++)
        printf("\n Element x[%d]:%d", i, x[i]);
}

int minMax(int x[], int n, int* pMin)
{
    int i, min, max;
    min = max = x[0];

    for (i = 1; i < n; i++) {
        if (x[i] < min)
            min = x[i];
        if (x[i] > max)
            max = x[i];
    }

    *pMin = min;

    return max;

    getchar();
}

int main(int argc, char* argv[])
{
    int liczba1, liczba2;
    int minimum, maximum;
    int x;

    wczyt1D(x, 10);
    druk1D(x, 10);
    maximum = minMax(x, 10, &minimum);
    minimum = &min;
    getchar();

    return 0;
}
0
  1. W funkcji main deklarujesz x jako int, a powinno być "int x[10];". 10, bo taki rozmiar później podajesz do funkcji jako argument.
  2. Funkcja minMax - jesteś pewien, że chcesz to zrobić w jednej funkcji? Moim zdaniem lepiej rozbić tę funkcję na dwie:
    int min(int x[], int n)
    int max(int x[], int n).
0

Chcę, tak niestety prowadzący na zajęciach chciał, a ja tego nie rozumiem ;(

0
 minimum=&min;

Zastanawiałeś się nad sensem tej linijki? Przypomnij sobie zakresy ważności nazw.

0

Program poprawilam, teraz zwraca mi maksymalna wartosc, tablice rowniez.. juz wiem o co Ci chodzi z ta minimalna, ale da sie to jakos rozwiazac? by potem w main odczytac ten wskaznik?

teraz mam jedno ostrzezenie, tam gdzie ta wartoscii min...

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

void wczyt1D(int x[], int n)

{
    int i;

    for (i = 0; i < n; i++)
    {
        printf("\n Podaj element x[%d]:", i);
        scanf("%d", &x[i]);
        fflush(stdin);
    }
}

void druk1D(int x[], int n)

{
    int i;

    for (i = 0; i < n; i++)
        printf("\n Element x[%d]:%d", i, x[i]);
}

int minMax(int x[], int n, int* pMin)
{
    int i, min, max;
    min = max = x[0];

    for (i = 1; i < n; i++)
    {
        if (x[i] < min)
            min = x[i];
        if (x[i] > max)
            max = x[i];
    }
    *pMin = min;

    return max;

    getchar();
}

int main(int argc, char* argv[])
{

    int minimum, maximum, min;
    int x[10];

    wczyt1D(x, 10);
    druk1D(x, 10);
    maximum = minMax(x, 10, &minimum);
    min = &minimum;

    printf("Minimalna wartosc=%d", min);
    printf("Maksymalna wartosc=%d", maximum);
    getchar();

    return 0;
}
0

Ta Twoja funkcja minMax to jakiś wtf. Część wyniku zwracasz normalnie, jak człowiek, a drugą część zapisujesz do argumentu. Napraw to bo oczy bolą.

0

Dzięki za tak niemile slowa :) Jakbym to rozumiala to bym pewnie umiala to naprawić.:) Programuje od niedawna, a tyle ile czytalam w domu, to nie rozumiem tego.

Mialam zajecia z tego, prowadzacy kazal nam jedno zwrocic funkcją, jedno ze wskaznika i dokonczyć w domu.

0

Wersja poprawiona (zaznaczone linie ze zmianami):

void minMax(int x[], int n, int* pMin, int* pMax) // 4
{
    int a, i, min, max;

    min = max = x[0];
 
    for (i = 0; i < n; i++) // 1
    {
        a = x[i]; // 2
        
        if (a < min) {
            min = a;
        }
            
        if (a > max) {
            max = a;
        }
    }
    
    *pMin = min;
    *pMax = max; // 3
}

0

Funkcja minMax to rzeczywiście jakiś żart, ale skoro tak poinstruował prowadzący to trzeba zrobić.

  1. getchar(); w minMax jest niepotrzebny.
  2. Przeanalizuj tę linijkę:
 maximum = minMax(x, 10, &minimum);

Funkcja minMax zwraca jako wartość maximum z tablicy x. Jako ostatni argument wysyłasz zmienną minimum przez referencję (i to jest słowo klucz!), a to znaczy, że przed wykonaniem funkcji minMax nie wiadomo ile wynosi minimum, bo ta zmienna nie została zainicjowana, natomiast po wykonaniu minMax w zmiennej minimum będzie już konkretna wartość. Podmień swoją funkcję main na coś takiego i powinno trybić.

int main(int argc, char* argv[])
{ 
    int minimum, maximum;
    int x[10];
 
    wczyt1D(x, 10);
    druk1D(x, 10);
    maximum = minMax(x, 10, &minimum);
 
    printf("Minimalna wartosc=%d", minimum);
    printf("Maksymalna wartosc=%d", maximum);
    getchar();
 
    return 0;
}
0

Dzięki, już rozumiem :)
Fajne te i te rozwiązanie, już chyba dużo lepiej rozumiem wskaźniki

0

To jeszcze tutaj deadcode jest:

    return max;
 
    getchar();
0
vpiotr napisał(a):

Wersja poprawiona (zaznaczone linie ze zmianami):

void minMax(int x[], int n, int* pMin, int* pMax) // 4
{
    int a, i, min, max;

    min = max = x[0];
 
    for (i = 0; i < n; i++) // 1
    {
        a = x[i]; // 2
        
        if (a < min) {
            min = a;
        }
            
        if (a > max) {
            max = a;
        }
    }
    
    *pMin = min;
    *pMax = max; // 3
}

@vpiotr tak z ciekawości: czemu przypisujesz do a wartość tablicy zamiast od razu porównywać min/max z x[i]? tzn. zamiast if(a<min) dać if(x[i]<min)? Czy to jest w celach wydajnościowych czy może tak bez powodu? :)

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