Skocz do zawartości
Bartcislaw

[C] Dynamiczna alokacja pamięci, tablica dwuwymiarowa.

Rekomendowane odpowiedzi

Cześć, mój problem polega na tym że po wczytaniu do tablic liczb ma wypisać największą wartość tyle że wypisuję jakąś liczbę 100 tysięcy razy większą nić powinna być. 

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

int main ()
{
    int ilosc, i, j, wynik, zapamietaj;
    int** tab;
    printf ("Ile elementowa chcesz otrzymac tablice?\n");
    scanf ("%d", &ilosc);
    tab = (int**) malloc (ilosc * sizeof(int*));
    for (i=0; i<ilosc; i++)
    {
        tab[i] = (int*) malloc (ilosc * sizeof(int));
        for (j=0; j<ilosc; j++)
        {
            scanf ("%d", &tab[i][j]);
            zapamietaj = tab[i][j];
            if (zapamietaj > tab[i][j])
            {
                wynik = zapamietaj;
            }
            zapamietaj = 0;
        }
    }
    printf ("Najwieksza wartosc to %d, w wierszu: %d w kolumnie: %d !", wynik, i, j);
    return 0;
}

ew. http://wklej.org/id/1538261/

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Try this:

#include <stdio.h>
#include <stdlib.h>
 
int main ()
{
    int ilosc, i, j,wynik, ii, jj;
    int** tab;
    printf ("Ile elementowa chcesz otrzymac tablice?\n");
    scanf ("%d", &ilosc);
    tab = (int**) malloc (ilosc * sizeof(int*));
    for (i=0; i<ilosc; i++)
    {
        tab[i] = (int*) malloc (ilosc * sizeof(int));
        for (j=0; j<ilosc; j++)
        {
            scanf ("%d", &tab[i][j]);
            if(i == 0 && j == 0) { wynik= tab[i][j]; ii=i; jj=j; }
            if (wynik < tab[i][j])
            {
                wynik = tab[i][j];
                ii=i;
                jj=j;
            }
            
        }
    }
    printf ("Najwieksza wartosc to %d, w wierszu: %d w kolumnie: %d !", wynik, ii, jj);
    return 0;
}


@down: Wiem że powinno się usuwać dynamicznie zaalokowaną pamięć, ale tutaj nie na tym się skupiłem. Chciałem tylko pokazać koledze co ma źle w swoim kodzie. 

Edytowane przez Maciej

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

I moja wersja, co prawda pisana w c++(stare funkcje do alokacji i dealokacji), ale tak, że powinno ci pójść i na c...cokolwiek to znaczy xd

#include <iostream>

int main ()
{
	int ilosc = 0,
		wynik[3];

	for(int i = 0; i < 3; i++)
		wynik[i] = 0;

	do {
		std::cout << "Ile elementow ma miec kazdy wymiar tablicy?" << std::endl;
		std::cin >> ilosc;
	} while (ilosc <= 0);
	int** tab = 0;	
	tab = (int**) malloc(ilosc * sizeof(int*));
	if(!tab) abort();

	for(int i = 0; i < ilosc; ++i) {
		tab[i] = (int*) malloc(ilosc * sizeof(int));
		for (int j = 0; j < ilosc; ++j) {
			std::cout << "Podaj wartosc " << i << " wiersza " << j << " kolumny" << std::endl;
			std::cin >> tab[i][j];
			if(tab[i][j] > wynik[0]) {
				wynik[0] = tab[i][j];
				wynik[1] = i;
				wynik[2] = j;
			}
		}
	}
	std::cout << "Najwieksza wartosc to " << wynik[0] << ", w wierszu: " << wynik[1] << "  w kolumnie: " << wynik[2] << " !" << std::endl;
	for (int i = 0; i < ilosc; i++) {
		free (tab[i]);
	}
	free (tab);
	system("pause");
	return 0;
}

@Up dużo zmiennych, nie sprzątasz po sobie :).

Edytowane przez _l0stfake7

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

if (zapamietaj > tab[i][j])

zapamietajtab[j] wiec to zawsze będzie fałsz, powinno tam być wynik a na dodatek powinno być < bo chcesz sprawdzić czy wynik jest MNIEJSZY niż obecna liczba.

 

mój problem polega na tym że po wczytaniu do tablic liczb ma wypisać największą wartość tyle że wypisuję jakąś liczbę 100 tysięcy razy większą nić powinna być. 

Ponieważ nie inicjalizujesz zmiennych więc zawierają losowe dane z pamięci. ZAWSZE inicjalizuj zmienne!

 

Dodatkowym problemem w tym kodzie jest j w końcowym printf bo zawsze będą to ostatnie wartości, nie te znalezionej wartości.

 

======

 

I moja wersja, co prawda pisana w c++(stare funkcje do alokacji i dealokacji), ale tak, że powinno ci pójść i na c...cokolwiek to znaczy xd

iostream nie jest wspierane przez C. Jeżeli kolega chce kod napisany w czystym C to ma być w C, nie w C++! Inna sprawa że kolega nie powiedział nam co to za C ma być aczkolwiek domyślam się że GNU C90.

Edytowane przez eider

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

iostream nie jest wspierane przez C. Jeżeli kolega chce kod napisany w czystym C to ma być w C, nie w C++! Inna sprawa że kolega nie powiedział nam co to za C ma być aczkolwiek domyślam się że GNU C90.

 

Obstawiam, że ma być to C kompilowane przez Dev-C++ :D

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×