C/max liczby

Wątek zablokowany 2020-05-21 16:44 przez ŁF.

Agnieszka Zielińska
  • Rejestracja:prawie 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:13
0

Witam. Mam problem, otóż mam wyznaczyć max liczbę a mi wyświetla min liczbę i nie wiem gdzie jest źle. Mój kod:

Kopiuj
#include <math.h>
#include <stdio.h>
#include <conio.h>

int main()
{	

	
	int const n=5;
	int max,pom;
	for(int i=1;i<=n;i++){
		printf("Podaj liczbe %d :",i);
		scanf("%d",&pom);
		
if (max>pom)
max=pom;		
	}

	printf("Najwieksza wartosc wynosi: %d",max);
}

Dodatkowo mam wyświetlić wiersz w którym jest maksymalna liczba i nie wiem jak... Dziękuję za pomoc.

edytowany 1x, ostatnio: Agnieszka Zielińska
plx211
  • Rejestracja:ponad 11 lat
  • Ostatnio:3 miesiące
  • Postów:181
2

Opisz poniższy kod słowami

Kopiuj
if (max>pom)
  max=pom; 

Dodatkowo mam wyświetlić wiersz w którym jest maksymalna liczba i nie wiem jak...

Zamiast tylko największej liczby przechowuj dodatkowo w jakiejś zmiennej jej numer (możesz użyć zmiennej i z twojej pętli ;))

Kopiuj
if (warunek) {
  max = pom;
  index_max = i; // oczywiście musisz stworzyć gdzieś zmienną
}
edytowany 2x, ostatnio: plx211
Agnieszka Zielińska
zwraca mi wartosc wiersza ale niestety w dalszym ciagu mam minimum a chce miec maksimum
plx211
opisz słowami (jeśli ... to wykonaj ...) to co podałem ;)
plx211
Oczywiście nie w komentarzu jak możesz
Agnieszka Zielińska
mam : if (max>pom) { max = pom; index_max = i; } } printf("Najwieksza wartosc wynosi: %d i znajduje sie w wierszu %d",max,indeks_max); }
Agnieszka Zielińska
ale niestety dalej mam min
Agnieszka Zielińska
  • Rejestracja:prawie 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:13
0
Kopiuj
#include <math.h>
#include <stdio.h>
#include <conio.h>

int main()
{	
	
	int const n=5;
	int max,liczba,wiersz;
	for(int i=1;i<=n;i++){
		printf("Podaj liczbe %d :",i);
		scanf("%d",&liczba);
		
if (max>liczba) {
  max = liczba;
  wiersz = i; 
}

	
}
	printf("Najwieksza wartosc wynosi: %d i znajduje sie w wierszu %d",max,wiersz);
}
plx211
  • Rejestracja:ponad 11 lat
  • Ostatnio:3 miesiące
  • Postów:181
1

Opisz to słowami:

Kopiuj
if (max>liczba) {
  max = liczba;
  wiersz = i; 
}

Tak jak byś chciała komuś kto nie nie umie programować dosłownie opisać co to robi

np.

Kopiuj
if (a < b) {
  // x
}

Jeśli a jest mniejsze od b to wykonaj // x

edytowany 1x, ostatnio: plx211
Agnieszka Zielińska
nie rozumiem, jak slowami?
plx211
dodałem przykład
Agnieszka Zielińska
ten warunek znam ale jezeli mialam pobierane a i b osobno, nie wiem jak zastosowac to w ciagu
plx211
to spróbuj opisać sam warunek
Agnieszka Zielińska
tylko te if(max>liczba) przychodzi mi do glowy
ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:7 dni
3
Kopiuj
if (max>liczba) {

Czyli jeśli maksimum jest większe od znalezionej liczby (inaczej: znaleziona liczba jest mniejsza od maksimum), to użyj znalezionej liczby od maksimum. Coś tu nie tak, nie sądzisz?


Agnieszka Zielińska
jezeli zmienie znak na przeciwny to wychodza jakies dziwne rzeczy
ŁF
Więc zmień nazwę min na max i tak tej zmiennej używaj...
plx211
  • Rejestracja:ponad 11 lat
  • Ostatnio:3 miesiące
  • Postów:181
0

@Agnieszka Zielińska:

jezeli zmienie znak na przeciwny to wychodza jakies dziwne rzeczy

Mogła byś podać te "dziwne rzeczy"?
@ŁF podał ci odpowiedź co jest nie tak że zamiast max dostajesz min

Agnieszka Zielińska
  • Rejestracja:prawie 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:13
0

screenshot-20200518102507.png

Zobacz pozostałe 6 komentarzy
Marooned
Tylko na lapku, który na stałe jest wpięty w rzutnik/wzmacniacz, czyli Winamp i Bestplayer, sporadycznie Firefox. Tydzień temu kupiłem nowego lapka, więc jeszcze nie wiem, co zrobić z dziadkiem ;-) Ale fakt, brak aktualizacji dla FF i Ch upierdliwy, bo np. animacje na imgur.com mi się nie ładują ;)
elwis
@furious programming: Jeszcze parę tygodni temu miałem kompa z Windowsem XP. Można, tylko net strasznie muli xD Frontendowcy, chyba nie umieją napisać wydajnego kodu.
flowCRANE
Taka moda. Strona kilkoma linijkami tekstu i kilkoma obrazkami, a waży 10MB, bo składa się z miliona bibliotek i innych śmieci, a jej responsywność jest taka, że renderuje się dobrze na najświeższej przeglądarce, a na tej kilkuletniej brakuje połowy danych. Webdev i jego ”standardy” to straszny syf.
Marooned
A, to fakt. Pisanie wiadomości w Messengerze na takim starym kompie sprawia wrażenie, jakby każdy znak przechodził przez TORa, rumuńskie proxy, VPN w Kazachstanie i wracał do nas testowym routingiem przez Starlinki zaliczając po drodze tajną bazę na dalekiej stronie Księżyca. A to przecież niby zwykły input (boję się spojrzeć na podpięte hooki).
enedil
@Marooned: w kwestii messengera, na aktualnym systemie nie jest wiele inaczej
plx211
  • Rejestracja:ponad 11 lat
  • Ostatnio:3 miesiące
  • Postów:181
1

max nie ma ustawionej wartości na początku przez co pod tą zmienną mogą znajdować się śmieci.
Rozwiązanie jest tutaj bardzo proste: Ustaw początkową wartość (np. int max = 0); zmiennej max :)

edytowany 2x, ostatnio: plx211
ŁF
A jaką wartość ma liczba przed wczytaniem tam wartości?
Maria Ulitzka
Myślę, że jako początkową wartość zmiennej max lepiej ustawić INT_MIN czyli int max = INT_MIN; nie zapomnieć o #include <limits.h>
plx211
osobiście ustawił bym 1 element, ale czułem że nie mam nerwów aby zasugerować i poprowadzić jak to zrobić
ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:7 dni
2

To może inaczej. Po pierwsze zainicjuj zmienną max, bo na starcie może ona mieć przypadkową wartość, np. INT_MAX. Przypisz INT_MIN albo chociaż 0.
Potem rozpisz sobie swój algorytm w krokach. Dla uproszczenia sprawy kroki są trzy, wartości to 2, 1, 3.

  1. pom=2, max=0, jeśli max>pom to do max przypisz pom, więc jeśli 0>2 to max=2. Ponieważ "nieprawda że" 0>2 to max pozostaje wartością 0.
  2. pom=1, max to nadal 0, jeśli max>pom to max=pom, więc jeśli 0>1 to max=1. Ponieważ "nieprawda że" 0>1 to max pozostaje wartością 0.
  3. pom=3, max to nadal 0, jeśli max>pom to max=pom, więc jeśli 0>3 to max=1. Ponieważ "nieprawda że" 0>3 to max pozostaje wartością 0.
    Na wyjściu masz max=0, czyli zawiera nieprawidłową liczbę, w dodatku nieistniejącą wśród szukanych.

Teraz rozpiszmy poprawny algorytm (czyli if (max < pom) max = pom).

  1. pom=2, max=0, jeśli max<pom to do max przypisz pom, więc jeśli 0<2 to max=2. Ponieważ spełnione jest 0<2 to max=2.
  2. pom=1, max 2, jeśli max<pom to max=pom, więc jeśli 2<1 to max=1. Ponieważ "nieprawda że" 2<1 to max pozostaje wartością 2.
  3. pom=3, max to nadal 2, jeśli max<pom to max=pom, więc jeśli 2<3 to max=3. Ponieważ spełnione jest 3>2 to max=3.
    Na wyjściu masz max=3, czyli zawiera prawidłową, najwiekszą liczbę.

A tak przy okazji: PRZED dwukropkami, kropkami, średnikami, przecinkami i nawiasanu zamykającymi NIE stawia się spacji. Spacja tylko PRZED nawiasem otwierającym oraz PO dwukropkach, kropkach, srednikach, przecinkach i nawiasach zamykających.


edytowany 1x, ostatnio: ŁF
ZK
  • Rejestracja:około 19 lat
  • Ostatnio:4 miesiące
1

Może inaczej, masz tutaj napisaną funkcję MAX

Kopiuj
int max(QVector<int> tMax)
{
    int max=0;

    for(int i=0; i<tMax.size(); ++i){
        max = tMax.at(i);

        for(int j=0; j<i; ++j){
            if(tMax.at(j)>max){
                max = tMax.at(j);
            }
        }
    }
    return max;
}

Przeanalizuj ją sobie i zobacz co i gdzie możesz zmienić aby uzyskać funkcję MIN. Jak to zrozumiesz, to będziesz wiedzieć jak napisać swoją wersję.


bla
ŁF
Czy ja właśnie widzę funkcję do wyszukiwania ekstremum o złożoności n^2? oO
ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:7 dni
1
zkubinski napisał(a):

Może inaczej, masz tutaj napisaną funkcję MAX

Kopiuj
int max(QVector<int> tMax)
{
    int max=0;

    for(int i=0; i<tMax.size(); ++i){
        max = tMax.at(i);

        for(int j=0; j<i; ++j){
            if(tMax.at(j)>max){
                max = tMax.at(j);
            }
        }
    }
    return max;
}

Przeanalizuj ją sobie i zobacz co i gdzie możesz zmienić aby uzyskać funkcję MIN. Jak to zrozumiesz, to będziesz wiedzieć jak napisać swoją wersję.

Serio?

Kopiuj
int max(QVector<int> tMax)
{
    int max = 0;
    for (int i = 0; i < tMax.size(); ++i){
        if (tMax.at(i) > max)
            max = tMax.at(i);
    }
    return max;
}

edytowany 2x, ostatnio: ŁF
Zobacz pozostałe 8 komentarzy
stivens
Zdajesz sobie sprawe, ze on wrzucil Twoj kod ale pozbawiony zbednych operacji? I jest on (twoj kod) niepoprawny bo dla wektora ujemnych liczb zwroci zly wynik (0) ;)
ZK
ujemnych liczb nie brałem pod uwagę... także no... nie zastanawiałem się nad tym
stivens
int max(min) = vect[0]; i po problemie
ŁF
@stivens: jeśli chcesz to mieć ładnie, to warto najpierw sprawdzić, czy tablica zawiera jakikolwiek element, bo wyznaczanie min/max/avg itp z pustego zbioru powinno skończyć się rzuceniem jakiegoś ładnego wyjątku.
stivens
Pewnie poleci z automatu out of bound exception co jest zachowaniem lepszym niz zwrocenie jakiejs wartosci dostajac pusty vector :p a nizej opakowalem to w optional
ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:7 dni
0
[zkubinski napisał(a)]:

kurka, nie chce mi się walić przykładami bo myślę nad programem ale pokombinuj sobie na tym zoptymalizowanym kodzie i spróbuj z tego zrobić funkcję MIN

Kopiuj
int min(QVector<int> table)
{
    int min = INT_MAX;
    for (int i = 0; i < table.size(); ++i) {
        int value = table.at(i);
        if (value < min)
            min = value;
    }
    return min;
}

stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 11 godzin
0

@ŁF:

Kopiuj

#include <iostream>
#include <vector>
#include <optional>
    
std::optional<int> max(std::vector<int>& vect) {
  if (vect.size() == 0) {
    return {};
  }
  
  int _max = vect[0];
  
  for (auto val : vect) {
    if (val > _max) {
      _max = val;
    }
  }
  
  return {_max};
}
    
std::optional<int> min(std::vector<int>& vect) {
  if (vect.size() == 0) {
    return {};
  }
  
  int _min = vect[0];
  
  for (auto val : vect) {
    if (val < _min) {
      _min = val;
    }
  }
  
  return {_min};
}
     
     
int main() {
  
  auto vect = std::vector<int>();
  vect.push_back(2);
  vect.push_back(-2);
  
  auto res = max(vect);
  
  if (res.has_value()) {
    std::cout << res.value() << "\n";
  } else {
    std::cout << "given empty vector";
  }
  
  auto empty_vect = std::vector<int>();
  
  auto res2 = min(empty_vect);
  
  if (res2.has_value()) {
    std::cout << res2.value() << "\n";
  } else {
    std::cout << "given empty vector\n";
  }
  
  return 0;
}


λλλ
Zobacz pozostałe 23 komentarze
ŁF
Bo mi to zasugerował? A co Ty, psycholog-amator?
stivens
https://4programmers.net/Forum/1680627 w ktorym momencie przed napisaniem tego posta Ci to zasugerowal? :D
ŁF
Myślałem, że mowa o moim ostatnim poście. Zobaczyłem kuriozalny, skrajnie nieoptymalny kod, w dodatku podany jako przykład do analizy. Ty byś tego nie poprawił? Myślisz, że to może mieć związek z tym, że jestem jedynakiem? A może to przez wpływ rówieśników?
stivens
@ŁF: Poprawilem jeszcze bardziej i zostalem za to zrugany. Zabawna sytuacja :p
ŁF
Więc się ciesz. Chodziło o zakończenie niepotrzebnej dyskusji pod postem, a same posty tylko posłużyły jako dodatkowy argument, niestety tylko wywołałem ciąg dalszy pisania o niczym. Chcesz zostać psychologiem, idź na psychologię, a nie będziesz się bawić w analizowanie motywów innych użytkowników forum. EOT
elwis
  • Rejestracja:ponad 18 lat
  • Ostatnio:4 dni
3

Pierwsza rada, jeśli kod ma ci coś porównywać i porównuje odwrotnie niż trzeba, pomyśl o odwróceniu warunku, często działa. Więc: if (pom>max) max=pom; — jeśli wartość pomierzona jest większa niż maksimum, staje się nowym maksimum.

Druga sprawa, że max jest intem. W tej sytuacji, istnieje duże prawdopodobieństwo, że będzie zainicjalizowane zerem, bo w mainie stos jest zwykle świeżutki i nieśmigany. Tak więc błąd zobaczysz dopiero jak wpiszesz same liczby ujemne. Znacznie gorzej będzie jeśli funkcję wydzielisz i użyjesz w większym programie, wtedy stanie się random :) Trzeba zainicjalizować stałą INT_MIN, żeby upewnić się, że to najmniejsza możliwa wartość.

Alternatywnie można wczytać pierwszą wartość oddzielnie i wstawić ją tam, ale to trochę bardziej złożone, zwłaszcza, jeśli istotnie masz wypisawać całe linie. No bo jeśli nie jest powiedziane, że w każdej linii może być po kilka liczb (a treść zadania zdaje się wskazywać, że tak), musiałoby być to coś takiego:

Kopiuj
    char buff[255]; // zakładam, że nie będzie linii dłuższej niż 255 bajtów
    char maxline[255];
    int max = INT_MIN;
    while (fgets(buff, 255, stdin)) {
       char *saveptr = NULL;
       char *next;
       bool is_max = false; // wymaga nagłówka stdbool.h w standardzie C99, inaczej int is_max = 0;
       while(next = strtok_r(buff, " \r\n\t", &saveptr)) {
           int nexti = atoi(next);
           if(nexti >= max) {
               max = nexti;
               is_max = true;
           }
       }
       if(is_max) {
           strcpy(maxline, buff);
       }
   }
   printf ("max = %d, in line:\n%s", max, maxline);

Nie sprawdzałem kodu. Na pewno będzie świrować, jeśli na wejściu pojawi się cokolwiek poza liczbami i wskazanymi białymi znakami (2 parametr strtok). Jeśli będzie kilka linijek z taką samą wartością miniamlną, będzie wypisana ostatnia. Musiałem dać warunek >= max, na wypadek gdyby pojawiła się tylko INT_MIN, wówczas maxline nigdy by nie zostało wypełnione. :)


edytowany 4x, ostatnio: elwis
CZ
To już wolę tamte kody z c++ xd

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.