C/max liczby

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

Agnieszka Zielińska
  • Rejestracja: dni
  • Ostatnio: dni
  • 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.

plx211
  • Rejestracja: dni
  • Ostatnio: dni
  • 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ą
}
Agnieszka Zielińska
  • Rejestracja: dni
  • Ostatnio: dni
  • 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: dni
  • Ostatnio: dni
  • 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

ŁF
  • Rejestracja: dni
  • Ostatnio: 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?

plx211
  • Rejestracja: dni
  • Ostatnio: dni
  • 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: dni
  • Ostatnio: dni
  • Postów: 13
0

screenshot-20200518102507.png

plx211
  • Rejestracja: dni
  • Ostatnio: dni
  • 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 :)

ŁF
  • Rejestracja: dni
  • Ostatnio: 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.

ZK
  • Rejestracja: dni
  • Ostatnio: dni
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ę.

ŁF
  • Rejestracja: dni
  • Ostatnio: 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;
}
ŁF
  • Rejestracja: dni
  • Ostatnio: 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: dni
  • Ostatnio: dni
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;
}

elwis
  • Rejestracja: dni
  • Ostatnio: 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. :)

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.