Maksymalna liczba z tablicy

Maksymalna liczba z tablicy
TheLiner
  • Rejestracja:około 8 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Rzeszów
  • Postów:97
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

Kopiuj
#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

Kopiuj
#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.

Patryk27
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
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
TheLiner
Poprawiłem tak jak piszesz, jednak nie wiem czemu zamiast max wypisuje minimum tablicy.
lion137
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 6 godzin
  • Postów:4946
0
Kopiuj
#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
Zobacz pozostały 1 komentarz
lion137
Edycja postu, rzeczywiście, racja.
Patryk27
Dlaczego tak bardzo kombinujesz z FLT_MIN_EXP zamiast zrobić np. max = array[0] i pętlę od i = 1? :-P
au7h
Twój kod jest w C++ a kod op jest w C :P
lion137
Znowu mnie tagi biją:))
lion137
@Patryk27: ano, szczerze mówiąc, nie wiem co to było:) zedytowałem post.
au7h
  • Rejestracja:ponad 11 lat
  • Ostatnio:około rok
  • Postów:215
0
Kopiuj
#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
Patryk27
Btw, w przypadku C nie jest potrzebne dodatkowe castowanie na double*.
au7h
spoko, edited
MO
  • Rejestracja:około 10 lat
  • Ostatnio:około 13 godzin
  • Lokalizacja:Tam gdzie jest (centy)metro...
0
Kopiuj
#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
Zobacz pozostałe 3 komentarze
au7h
dokładnie, o to mi chodziło :P
MO
@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
au7h
myślę, że częściej jest to używane w plikach wsadowych *.bat :)
MO
@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/barr-code/2018/06/cs-goto-keyword-should-we-use-it-or-lose-it/
au7h
spokojnie, bez nerwów, zajrzę :)
TheLiner
  • Rejestracja:około 8 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Rzeszów
  • Postów:97
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...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.