Maksymalna liczba z tablicy

Odpowiedz Nowy wątek
2019-04-14 18:05
0

Cześć.
Problem wygląda następująco: program nie wykonuje tego, co mu każę, a mianowicie zamiast elementu max wyświetla element pierwszy tablicy. I to dziwne, bo patrzę na swój kod i wydaje mi się, że dobrze zaimplementowałem algorytm na wyszukanie elementu max.
Kod wygląda następująco:
plik Max.c

#include<Math.h>

double Max(double* tab, int n) {

    double max = tab[0];
    int i = 0;

    for (i = 0;i < n;i++)
        if (tab[i] > max)
            max = tab[i];

    return max;

}

plik Main.c

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

double Max(double* tab, int n);

void main() {
    int n;
    int j = 0;
    double* tab[20];
    double wynik;
    int x;
    printf("Program ma za zadanie wyznaczenie max tablicy, w tym celu wprowadz rozmiar tablicy: \n");
    scanf("%i", &n);

    while (j < n) {
        printf("Podaj element tablicy: ");
        scanf("%i", &x);
        tab[j] = x;

        j++;

    }

    wynik = Max(tab, n);
    printf("Maximum tablicy wynosi: %d", wynik);

}

Z góry dziękuję za wszelkie wskazówki. Niestety, jeszcze nie za bardzo kumam tych wskaźników, a ma być to zadanie zrobione w oparciu o właśnie wskaźniki.

Pozostało 580 znaków

2019-04-14 18:18
3
  1. Mieszasz double z intami - Twoja zmienna x prawdopodobnie powinna być typu double (bo i taką masz tablicę) + powinieneś odpowiednio dostosować format (%lf zamiast %d).
  2. double* tab[20]; tworzy tablicę, której elementem są wskaźniki (tzn. tab[i] ma typ double* a samo tab to double**) - na pewno taki efekt chciałeś osiągnąć? IMO powinieneś mieć albo double tab[20];, albo double *tab = malloc(...);.

edytowany 4x, ostatnio: Patryk27, 2019-04-14 18:19
Poprawiłem tak jak piszesz, jednak nie wiem czemu zamiast max wypisuje minimum tablicy. - TheLiner 2019-04-14 22:45

Pozostało 580 znaków

2019-04-14 19:27
0
#include <iostream>
#include <cfloat>
float max(float * array, int size) {
    float max = array[0];
    for (int i  = 0; i < size; i++) {
        if (array[i] >= max)
            max = array[i];
    }
    return max;
}
int main() {
    float a [] = {-1, -2, -3};
    std::cout << max(a, 3); 
    return 0;
}

edytowany 2x, ostatnio: lion137, 2019-04-15 07:14
Takie rozwiązanie nie sprawdzi się w sytuacji, kiedy w tablicy będą same liczby ujemne. max = array[0]; (przy założeniu size > 0) jest najbardziej bezpiecznym podejściem. - Patryk27 2019-04-14 19:31
Edycja postu, rzeczywiście, racja. - lion137 2019-04-14 19:48
Dlaczego tak bardzo kombinujesz z FLT_MIN_EXP zamiast zrobić np. max = array[0] i pętlę od i = 1? :-P - Patryk27 2019-04-14 19:56
Twój kod jest w C++ a kod op jest w C :P - au7h 2019-04-14 20:36
Znowu mnie tagi biją:)) - lion137 2019-04-14 21:05
@Patryk27: ano, szczerze mówiąc, nie wiem co to było:) zedytowałem post. - lion137 2019-04-15 07:13

Pozostało 580 znaków

2019-04-14 21:11
0
#include <stdio.h>
#include <stdlib.h>

double Max(double* tab, unsigned size);

int main() {
    double result = 0.0;
    double* tab = malloc(sizeof(double)*10);
    double tmp = 0.0;
    for(int i=0;i<10;i++){
        scanf("%lf", &tmp);
        *(tab+i) = tmp;
    }
    result = Max(tab, 10);
    printf("Maximum tablicy wynosi: %.2lf\n", result);
    free(tab);
    return 0;
}

double Max(double* tab, unsigned size)
{
    double max = tab[0];
    for(int i=0;i<size;i++)
        if(tab[i]>max)
            max = tab[i];
    return max;
}
edytowany 2x, ostatnio: au7h, 2019-04-14 22:14
Btw, w przypadku C nie jest potrzebne dodatkowe castowanie na double*. - Patryk27 2019-04-14 22:13
spoko, edited - au7h 2019-04-14 22:14

Pozostało 580 znaków

2019-04-14 22:13
0
#include <stdio.h>
#include <float.h>
#include <stdlib.h>

void inputTable(double * table, size_t size) {
    double * ptr = table + size;
    while(ptr-->table) {
        scanf("%lf", ptr);
    }
}

double Max(double * table, size_t size) {
    double max = DBL_MIN;
    double * ptr = table + size;
    while(ptr-->table) {
        max = *ptr > max ? *ptr: max;
    }
    return max;
}

int main(void) {
    size_t n;
    double * table;
    puts("Program ma za zadanie wyznaczenie max tablicy, w tym celu wprowadz rozmiar tablicy: ");
    scanf("%zu", &n);
    table = malloc(sizeof(table[0]) * n);
    if(table == NULL) goto fail;
    inputTable(table, n);
    printf("Maksimum w tablicy wynosi: %lf\n", Max(table, n));
    free(table);
    return EXIT_SUCCESS;
fail:
    return EXIT_FAILURE;
}

Każdy problem w informatyce można rozwiązać, dodając kolejny poziom pośredniości,z wyjątkiem problemu zbyt dużej liczby warstw pośredniości — David J. Wheeler
edytowany 1x, ostatnio: Mokrowski, 2019-04-14 22:15
Pokaż pozostałe 3 komentarze
dokładnie, o to mi chodziło :P - au7h 2019-04-14 23:06
@Patryk27: Biorę pod uwagę kontekst pytania. 1. Pyta początkujący 2. Dostał już wiele odpowiedzi "szkolnych" 3. Miałem ochotę pokazać idiom często używany w C i rozwiązanie miało być "trochę inne" 4. Tak wiem co to jest if ... BTW w mojej ocenie (i nie tylko mojej) w funkcjach w C jest to czytelniejsze przy zajmowaniu i zwalnianiu zasobów - Mokrowski 2019-04-14 23:06
myślę, że częściej jest to używane w plikach wsadowych *.bat :) - au7h 2019-04-14 23:09
@au7h: tak .. a na drugim miejscu jest jądro GNU/Linux, później systemy wbudowane, telco także... do pewnego momentu edukacji obrzydza się goto (i dobrze), a później zawodowo trzeba je "racjonalizować". Dostałeś źródła to choć zajrzyj masz tu następne: https://embeddedgurus.com/bar[...]-should-we-use-it-or-lose-it/ - Mokrowski 2019-04-14 23:16
spokojnie, bez nerwów, zajrzę :) - au7h 2019-04-14 23:19

Pozostało 580 znaków

2019-04-14 23:18
0

No dobra, zrobiłem tak jak @Patryk27 tu pisał, no i zamiast max wyszukuje minimum z tablicy. W plik Max.c dałem w instrukcji warunkowej zamieniłem warunek w drugą stronę i, co dziwne, teraz działa, jak miało działać, czyli wyszukuje maximum. Dziwne...

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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