c++
frustracja: C++
Napisz funkcje, do której zostanie przekazana jako argument tablica 2d typu int oraz jej
rozmiar.
Funkcja ma znaleźć oraz zwrócić minimum oraz jego indeks.
Pytanie jak zwrócić dwie wartości, pewnie trzeba użyć wskaźników,
ale ja ich jeszcze niezbyt rozumiem :<
5 gru 12:00
Kamil: int zwroc(int tab[], int rozmiar){
int min=tab[0];
int indeks=0;
for(int i=0;i<rozmiar;i++){
if(tab[i]<min){
min=tab[i];
}
}
int wynik[2];
wynik[0]=min;
wynik[1]=indeks;
return wynik;
5 gru 12:12
Maciess: Można raczej bez wskaznikow. Algorytm na minimum jest bardzo latwy. Spróbuj zrobić na for'rze i
żeby za forem następowało wyświetlanie indeksu a funkcja zwracała ogólnie wartość tej komórki.
Już nie pamiętam dokładnie c++ ale powinno zadzialac. Wrócę do domu to odpalę code blocksa i
spróbuje to napisać. Odśwież temat popołudniu jak nikt nie pomoze
5 gru 12:16
Maciess: Oo kolega już napisał
5 gru 12:17
Kamil: można jeszcze na struktury:
typedef struct{
int min;
int indeks;
} wynik;
wynik nazwa(int tab[], int rozmiar){
wynik zmienna;
zmienna.min=tab[0];
for(int i=0;i<rozmiar;i++){
if(tab[i]<zmienna.min){
zmienna.min=tab[i];
zmienna.indeks=i;
}
}
return zmienna;
}
5 gru 12:20
frustracja: Okej, dziękuję, jak znaleźć minimum wiedziałem,
nie wiedziałem jak te wartości przekazać, zrobienie
tablicy z wynikami nie przyszło mi do głowy
5 gru 12:23
frustracja: Jeszcze jedno pytanie,
jak przekazać tablicę dwuwymiarową do funkcji?
5 gru 12:36
xy: tak samo ino rozmiar podaj np. int funkcja(int tablica[10][20])
5 gru 12:45
frustracja: A jak tablica jest alokowana dynamicznie?
5 gru 12:47
Kamil: tablicę 2 wymiarową podajesz tak:
typ nazwa(typ tab[][K])
gdzie K to ilość kolumn
5 gru 13:03
frustracja: Dziękuję!
5 gru 13:13
sata: Mariuszek zaraz by Ci wkleił pseudokod z Cormena i zrobił wywód( bełkot) nt algorytmów o
których nie ma pojęcia
5 gru 13:27
Alky: Czy 12:12 jest dobrze ? Z tego co wiem nie można w ten sposób od tak zwracać tablicy. Jeśli już
kompilator mógłby to potraktować jako wskaźnik na 1 element, ale to chyba nic nie daje.
5 gru 14:09
jc: Alky, masz rację.
Funkcja przekaże adres tablicy, która może już nie istnieć (tablica była utworzona lokalnie).
5 gru 14:55
Pytający:
@Alky, tak, tam jest źle. Jeśli zmienić by zwracany typ na int*, wszystko byłoby ok dla
kompilatora, jednak zwracalibyśmy wskaźnik do zmiennej lokalnej (wynik), więc wciąż nie byłoby
dobrze.
5 gru 14:55
Pytający:
5 gru 14:56
frustracja: Hmmm, czyli podsumowując, jak mogę zwrócić dwie wartości z funkcji?
5 gru 15:20
Dziadek Mróz:
https://repl.it/repls/StudiousJuniorBats
#include <iostream>
#include <cstdlib>
#include <ctime>
void zwroc(int *tab, size_t rozmiar, int &min, size_t &indeks) {
min = tab[0];
indeks = 0;
for (size_t i=1; i<rozmiar; i++) {
if (tab[i]<min) {
min = tab[i];
indeks = i;
}
}
}
int main() {
srand(time(NULL));
#define ROZMIAR 4
int *tab = new int[ROZMIAR];
for (size_t i=0; i<ROZMIAR; i++) {
tab[i] = rand()%100;
std::cout << " " << tab[i];
}
std::cout << std::endl;
int min;
size_t indeks;
zwroc(tab, ROZMIAR, min, indeks);
std::cout << "Minimum " << min << " na pozycji " << indeks << std::endl;
}
5 gru 15:20
Dziadek Mróz:
Używasz referencji, czyli int &zmienna. Referencja to inna nazwa dla danej zmiennej:
int a= 1;
int &ref_a= zmienna;
W tym przypadku a oraz ref_a to dwie nazwy odnoszące się do tego samego obiektu w pamięci,
czyli liczby 1
5 gru 15:28
Mariusz:
"
Pytanie jak zwrócić dwie wartości, pewnie trzeba użyć wskaźników,"
W C była to chyba jedyna możliwość tutaj jak Dziadek wspomniał jest jeszcze referencja
W swoim przykładzie nie zwolniłeś pamięci
Lepiej aby frustracja się do tego nie przyzwyczajał
Nie ma nikogo kto usuwałby wpisy sata
Zaśmiecają one wątki
9 gru 03:57
Dziadek Mróz:
int *ptr = new int(10);
...
delete ptr;
−−−−−−−−−−−−−−−−−−−−
int *tab1 = new int[10];
...
delete[] tab;
−−−−−−−−−−−−−−−−−−−−
int **tab2 = new int*[10];
for (size_t i=0; i<10; i++) {
tab2[i] = new int[10];
}
...
for (size_t i=0; i<10; i++) {
delete[] tab[i];
}
delete[] tab;
Gdy robisz operatorem new to zwalniasz operatorem delete, jak robisz operatorem new[] to
zwalniasz operatorem delete[]
9 gru 05:14
sata: Nie ma nikogo kto usuwałby wpisy Mariusza? zaśmiecają one wątki.
9 gru 09:50
Mariusz:
sata nudzi ci się co ?
Dostałeś odpowiedzi na swoje pytania np te o zespolonych czy te o reszcie to się ciesz
i przestań spamować
Do tego zadania o reszcie dorzuciłem ci kilka zadań bonusowych aby ci się nie nudziło
9 gru 13:47
Sat: To tobie sie nudzi napij sie melisy bo bredzisz o jakis zadaniach ktore nie ja wstawialem
udowodnilbym ci to w bardzo prosty sposób ze to nie ja ale mi sie nie chce
9 gru 19:12