porównywanie sumy liczb pod określonymi warunkami

0

Witam. Chyba jeszcze nie mam wystarczającej wiedzy żeby napisać ten program może ktoś napisać co trzeba umieć żeby go napisać nie chcę rozwiązania
https://adventofcode.com/2022/day/1 link do zadania

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int liczba_elfow;
    cout << "podaj liczbe elfow ";
    cin >> liczba_elfow;
    while (liczba_elfow != 0) {

        cout << "elfow jest " << liczba_elfow;

        int pakiety;
        cout << "podaj pakiety kalorii ";
        cin >> pakiety;
        int kalorie;
        int suma;
        while (pakiety >= 1) {

            cin >> kalorie;

            cout << " kalorii " << kalorie;
            if (pakiety != 0)

                cout << "suma" << suma;
            pakiety--;
        }

        liczba_elfow--;
    }
}
6

185 postów, 3 lata rejestracji, ciężko uwierzyć że masz problem z takim zadaniem.
A jak byś to rozwiązał na kartce bez kodu? Rozrysuj sobie algorytm na kartce, może schemat blokowy pomoże. Sprawdź ile potrzebujesz przechowywać informacji, w najprostszym do wymyślenia rozwiązaniu przydadzą się tablice, ale nie są tu potrzebne.

0
obscurity napisał(a):

185 postów, 3 lata rejestracji, ciężko uwierzyć że masz problem z takim zadaniem.
A jak byś to rozwiązał na kartce bez kodu? Rozrysuj sobie algorytm na kartce, może schemat blokowy pomoże. Sprawdź ile potrzebujesz przechowywać informacji, w najprostszym do wymyślenia rozwiązaniu przydadzą się tablice, ale nie są tu potrzebne.

Dzięki spróbuję.

1

co trzeba umieć żeby go napisać

  1. Umieć obsługiwać wejście/wyjście.
  2. Umieć dodawać i porównywać wartości.

Tyle. Dosłownie nic więcej.

0
Althorion napisał(a):

co trzeba umieć żeby go napisać

  1. Umieć obsługiwać wejście/wyjście.
  2. Umieć dodawać i porównywać wartości.

Tyle. Dosłownie nic więcej.

Do dodawania i porównywania wartości potrzebuję jakieś pętle albo coś?😏

1

Do przelecenia przez wejście będzie potrzebna pętla. Do dodawania — a tym bardziej porównywania — jako takiego już nie.

Przykładowe rozwiązanie można naszkicować tak: trzymasz sobie zmienną na aktualną sumę i zmienną na ilość jedzenia niesioną przez rekordowego do tej pory elfa. Obie zmienne zaczynają jako 0. Przelatujesz (w pętli) przez wejście, linijka po linijce. Jak w tej linijce jest liczba, to dodajesz ją do aktualnej sumy. Jak linijka jest pusta (albo skończył się plik), to oznacza to koniec wartości dla danego elfa; zatem porównujesz, czy aktualna suma jest większa od największej znanej — jak jest, to masz nową największą znaną, po czym, tak czy owak, zerujesz aktualną sumę (bo będziesz rozważać kolejnego elfa).

Na końcu wypisujesz największą znaną sumę, i fajrant.

1

Gdzie w tym zadaniu jest napisane, że mas wypisywać zachęty: podaj liczbe elfow elfow jest ... ?
Gdzie w zadaniu jest napisane, że wejście zawiera liczbę opisującą liczbę elfów?

Przykładowe wejście to:

1000
2000
3000

4000

5000
6000

7000
8000
9000

10000

A odpowiedzią ma być tylko:

24000
0
Althorion napisał(a):

Do przelecenia przez wejście będzie potrzebna pętla. Do dodawania — a tym bardziej porównywania — jako takiego już nie.

Przykładowe rozwiązanie można naszkicować tak: trzymasz sobie zmienną na aktualną sumę i zmienną na ilość jedzenia niesioną przez rekordowego do tej pory elfa. Obie zmienne zaczynają jako 0. Przelatujesz (w pętli) przez wejście, linijka po linijce. Jak w tej linijce jest liczba, to dodajesz ją do aktualnej sumy. Jak linijka jest pusta (albo skończył się plik), to oznacza to koniec wartości dla danego elfa; zatem porównujesz, czy aktualna suma jest większa od największej znanej — jak jest, to masz nową największą znaną, po czym, tak czy owak, zerujesz aktualną sumę (bo będziesz rozważać kolejnego elfa).

Na końcu wypisujesz największą znaną sumę, i fajrant.

Przeczytałam tylko początek posta żeby się nie sugerować najpierw i wiedziałam że mam mieć jedną pętlę i czy coś bez wielkich zmian da się zrobić z moim kodem? Proszę jak najmniej podpowiadać.

#include <iostream>
using namespace std;
main()
{
    int elfy;
    int pakiety;
    int kalorie;
    int suma;
    cout << "podaj liczbe elfow";
    cin >> elfy;
    cout << elfy;
    cout << "podaj liczbe pakietow dla elfa";
    cin >> pakiety;
    while (pakiety != 0) {

        cout << "podaj kalorie";
        cin >> kalorie;
        cout << kalorie;
        kalorie = suma + kalorie;
        suma = kalorie;
        cout << kalorie;
        pakiety--;
    }
}

1

Emm… OK… Więc najmniejszą podpowiedzią, którą umiem wymyślić na tak postawione pytanie, jest „tak, da się coś zrobić z Twoim kodem”.

3

Ogólnie rozwiązanie z std::cin jest w pewnym stopniu problematyczne gdyż, wczytujesz liczby z stdin (standard input), a standard input ustawiasz w ten sposób, że jak masz twój program np. aplikacja.exe, a plik z danymi txt masz w input.txt, to możesz go z konsoli przekierować na ten stdin tak: aplikacja.exe < input.txt, to sprawi że nie będziesz musiała wpisywać ręcznie tych danych.

Druga opcja to otwarcie po prostu pliku i czytanie, we wcześniejszym przykładzie po prostu przekierowujesz strumień plik na wejście aplikacji.

Druga sprawa, to robiąc std::cin wczytujesz liczbę, ale automatycznie pomijasz wszystkie inne znaki np. nową linię, czy pustą linię.

Możesz użyć std::getline(std::cin, line); żeby wczytać całą linię i sobie w pętli iterować, gdzie line to std::string line.

Jak już możesz wczytać cały plik to jakoś trzeba zdecydować jak kontrolować przebieg operacji.
std::getline zwraca wartość, różną od zera to udało się wczytać linię i równe zero jeśli jest koniec pliku, możesz to wykorzystać żeby wiedzieć kiedy już cały plik wczytałaś.
Jak chcesz wynik std::getline zapisać do zmiennej to musisz zrobić konwersję na boola lub użyć w warunku if / while, żeby przestało wczytywać itp. (gdzie konwersja do boola to możesz !std::getline dodać po prostu wykrzynik lub dwa, bo po pierwszym zaneguje się wartość logiczna).

Teraz jak pobierzesz linię to np. za pomocą line.size() możesz sprawdzić ile ma znaków linia, jak jest zero to jest to pusta, a jak więcej to są liczby jakieś, ale zapisane jako tekst, więc wcześniej musisz skonwertować na liczbę text, żeby stringa, czyli tekst zamienić na liczbę możesz użyć std::stoi(line) skrót od string to integer.

Więc możesz sobie tak wczytywać linia po linii, sumować i jak dojdziesz do pustej linii, to tą sumę możesz sprawdzić czy jest większa od tej w zmiennej maximum jeśli tak to ustawiasz jako nowy najlepszy wynik i skumulowaną sumę znowu zerujesz, bo pusta linia oznacza przejście do kolejnego elfa.

No i biblioteki jakie potrzebujesz to

#include <iostream>
#include <string>
0
Althorion napisał(a):

Emm… OK… Więc najmniejszą podpowiedzią, którą umiem wymyślić na tak postawione pytanie, jest „tak, da się coś zrobić z Twoim kodem”.

A też korzystając tylko z pętli i wejścia i wyjścia?

0

Mam pytanie zmodyfikowałam kod z 2023-08-22 17:05 ale nic się nie zmieniło czy tak powinno być czy mam jakiś błąd nie w kodzie.Nie ma zmiany w wyświetlanym oknie oprócz tego że nie da się wyłączyć za pomocą kliknięcia dowolnego przycisku

#include <iostream>
using namespace std;
main()
{
    int elfy;
    int pakiety;
    int kalorie;
    int suma;
    cout << "podaj liczbe elfow";
    cin >> elfy;
    cout << elfy;
    cout << "podaj liczbe pakietow dla elfa";
    cin >> pakiety;
    while (elfy != 0)
        while (pakiety != 0) {
            {

                cout << "podaj kalorie";
                cin >> kalorie;
                cout << kalorie;
                kalorie = suma + kalorie;
                suma = kalorie;
                cout << kalorie;
                pakiety--;
            }
            elfy--;
        }
}

0

@Nikto0:

A też korzystając tylko z pętli i wejścia i wyjścia?

Jeszcze potrzebujesz dodawać i porównywać elementy. Co w sumie, jak ktoś się bardzo uprze, można zrobić pętlą, ale… nie.

nic się nie zmieniło

Gdzie się nic nie zmieniło? Co oczekiwałaś, że się zmieni?

czy mam jakiś błąd nie w kodzie

Jaki błąd? Gdzie?

Musisz pytać bardziej konkretnie. My nie siedzimy w Twojej głowie, nie widzimy Twojego monitora…

A co do samego kodu:

  • nie ma potrzeby pytać użytkownika o to, ile będzie elfów; program może — i powinien — radzić sobie bez tej informacji. Która mu, zresztą, nie jest do niczego potrzebna.
  • liczba pakietów na elfa jest różna w zależności od elfa, a Twój program ją przyjmuje raz
  • zmienną pakiety tylko zmniejszasz; jak już dojdzie do zera (wczytasz zadaną liczbę pakietów pierwszego elfa), to pętla wewnętrzna nie będzie już nigdy wykonywana, więc więcej elfów nie ogarniesz.
0
Althorion napisał(a):

@Nikto0:

A też korzystając tylko z pętli i wejścia i wyjścia?

Jeszcze potrzebujesz dodawać i porównywać elementy. Co w sumie, jak ktoś się bardzo uprze, można zrobić pętlą, ale… nie.

nic się nie zmieniło

Gdzie się nic nie zmieniło? Co oczekiwałaś, że się zmieni?

czy mam jakiś błąd nie w kodzie

Jaki błąd? Gdzie?

Musisz pytać bardziej konkretnie. My nie siedzimy w Twojej głowie, nie widzimy Twojego monitora…

A co do samego kodu:

  • nie ma potrzeby pytać użytkownika o to, ile będzie elfów; program może — i powinien — radzić sobie bez tej informacji. Która mu, zresztą, nie jest do niczego potrzebna.
  • liczba pakietów na elfa jest różna w zależności od elfa, a Twój program ją przyjmuje raz
  • zmienną pakiety tylko zmniejszasz; jak już dojdzie do zera (wczytasz zadaną liczbę pakietów pierwszego elfa), to pętla wewnętrzna nie będzie już nigdy wykonywana, więc więcej elfów nie ogarniesz.

To z czego mam jeszcze skorzystać? Że nic się nie zmieniło to znaczy w wyświetlanym oknie poleceń.

1

To z czego mam jeszcze skorzystać?

Już Ci napisałem wyżej, krok po kroku, jak wygląda rozwiązanie. Jedno z możliwych — jest mnóstwo możliwości. Korzysta się z tych narzędzi, które wydają się sensowne do danego celu, nie bardzo się da rozplanowywać sobie pracę pod kątem narzędzi i tylko ich („do zrobienia tej szopy będę potrzebować miarki, kątownika, śrubokręta, krótkiej piły do drewna, sześćdziesięciu gwoździ i młotka” — a potem się okazuje, że trzeba coś wypoziomować, poziomicy na liście narzędzi nie było, i teraz trzeba się głowić, jak przy użyciu już posiadanych narzędzi to zrobić, zamiast po prostu pójść po poziomicę…).

Że nic się nie zmieniło to znaczy w wyświetlanym oknie poleceń.

W jakim oknie poleceń? Dlaczego uważasz, że coś się powinno zmienić? Co, Twoim zdaniem, się powinno zmienić?

Przekompilowałaś program? Uruchamiasz ten program?

3

Napisz sobie kod do wczytania pliku i go wyświetl na ekranie czy wszystko działa.

Ten plik, który jest na tej stronie on ma ponad 20 tysięcy linii czy więcej, musi wszystko odbywać się automatycznie.

Ten przykład z adventu zapisz do pliku, bo to jest demo tylko jako przykład, później jest do poprania prawdziwy plik z zadaniem, który tam jest bardzo duży.

0
Althorion napisał(a):

To z czego mam jeszcze skorzystać?

Już Ci napisałem wyżej, krok po kroku, jak wygląda rozwiązanie. Jedno z możliwych — jest mnóstwo możliwości. Korzysta się z tych narzędzi, które wydają się sensowne do danego celu, nie bardzo się da rozplanowywać sobie pracę pod kątem narzędzi i tylko ich („do zrobienia tej szopy będę potrzebować miarki, kątownika, śrubokręta, krótkiej piły do drewna, sześćdziesięciu gwoździ i młotka” — a potem się okazuje, że trzeba coś wypoziomować, poziomicy na liście narzędzi nie było, i teraz trzeba się głowić, jak przy użyciu już posiadanych narzędzi to zrobić, zamiast po prostu pójść po poziomicę…).

Że nic się nie zmieniło to znaczy w wyświetlanym oknie poleceń.

W jakim oknie poleceń? Dlaczego uważasz, że coś się powinno zmienić? Co, Twoim zdaniem, się powinno zmienić?

Przekompilowałaś program? Uruchamiasz ten program?

Myślę że powinien jeszcze dać wypisywać dla np. drugiego elfa i dodawać kalorie a potem dla kolejnego i czy co jeszcze mueszę wykorzystać oprócz wyjścia wejścia i pętli

1

Myślę że powinien jeszcze dać wypisywać dla np. drugiego elfa i dodawać kalorie a potem dla kolejnego

Ale tak się nie stanie, gdyż — jak pisałem — wszelkie wypisywanie i interakcję masz w pętli wewnętrznej (linijki 15. do 27. w Twojej poprzedniej wiadomości, a ta pętla się wykona tylko raz. Zauważ bowiem, że jej wykonanie zależy od pakiety, które tylko maleje. W końcu więc spadnie do zera… i koniec. Więcej się ta pętla nie wykona, ani razu. I nawet jak pętla zewnętrzna (ta „wyżej” — linijki 14. do 28.) zacznie kolejną iterację, to dalej pakiety będą zerowe, więc nie dostaniesz nawet jednego wykonania.

Możesz temu zapobiec „krótkoterminowo” (tzn. osiągniesz wymagany efekt, ale na dłuższą metę lepiej by było zamiast tego przerobić logikę programu — jak pisałem, nie ma żadnego powodu, by mieć liczone elfy, ani liczone te pakiety; tylko przelecieć przez wejście w jednej pętli i robić co trzeba) przekładając pytanie o pakiety (linijki 12. i 13.) do wnętrza tej pętli zewnętrznej, nad pętlę zewnętrzną, tak żeby pytało użytkownika przy każdym elfie o to, ile niesie on pakietów.

Podkreślę jednak raz jeszcze, że o ile jest to działające rozwiązanie, to jest to też złe rozwiązanie, bo — jak pisał GodOfCode. — masz w tym zadaniu kilka tysięcy elfów, i robienie tego ręcznie jest kolosalną stratą czasu. Po to masz komputer, żeby to on się męczył…

czy co jeszcze mueszę wykorzystać oprócz wyjścia wejścia i pętli

Nie musisz. Ale będziesz chcieć wykorzystać instrukcję warunkową if albo funkcję std::min.


Nawiasem mówiąc, źle się do tego zabierasz. Pierwszym etapem rozwiązywania problemu przy użyciu komputera powinno być tutaj — i właściwie prawie zawsze — rozwiązanie problemu, tzn. wymyślenie co i jak zrobić, a dopiero potem wytłumaczenie komputerowi, przy użyciu jakiegoś języka programowania, jak on powinien to zrobić. Więc powinnaś zacząć od właśnie rozwiązania tego problemu, tak by móc wytłumaczyć najpierw komuś słownie — nie w C++, ale po polsku — jak to zrobić, po kolei.

I jak już to będziesz mieć, to wtedy automatycznie będziesz wiedzieć, jakich narzędzi w C++ użyć, żeby komputer mógł to Twoje rozwiązanie zrealizować.

0
Althorion napisał(a):

Myślę że powinien jeszcze dać wypisywać dla np. drugiego elfa i dodawać kalorie a potem dla kolejnego

Ale tak się nie stanie, gdyż — jak pisałem — wszelkie wypisywanie i interakcję masz w pętli wewnętrznej (linijki 15. do 27. w Twojej poprzedniej wiadomości, a ta pętla się wykona tylko raz. Zauważ bowiem, że jej wykonanie zależy od pakiety, które tylko maleje. W końcu więc spadnie do zera… i koniec. Więcej się ta pętla nie wykona, ani razu. I nawet jak pętla zewnętrzna (ta „wyżej” — linijki 14. do 28.) zacznie kolejną iterację, to dalej pakiety będą zerowe, więc nie dostaniesz nawet jednego wykonania.

Możesz temu zapobiec „krótkoterminowo” (tzn. osiągniesz wymagany efekt, ale na dłuższą metę lepiej by było zamiast tego przerobić logikę programu — jak pisałem, nie ma żadnego powodu, by mieć liczone elfy, ani liczone te pakiety; tylko przelecieć przez wejście w jednej pętli i robić co trzeba) przekładając pytanie o pakiety (linijki 12. i 13.) do wnętrza tej pętli zewnętrznej, nad pętlę zewnętrzną, tak żeby pytało użytkownika przy każdym elfie o to, ile niesie on pakietów.

Podkreślę jednak raz jeszcze, że o ile jest to działające rozwiązanie, to jest to też złe rozwiązanie, bo — jak pisał GodOfCode. — masz w tym zadaniu kilka tysięcy elfów, i robienie tego ręcznie jest kolosalną stratą czasu. Po to masz komputer, żeby to on się męczył…

czy co jeszcze mueszę wykorzystać oprócz wyjścia wejścia i pętli

Nie musisz. Ale będziesz chcieć wykorzystać instrukcję warunkową if albo funkcję std::min.

A jak chcę zmienić logikę programu to co muszę użyć? Nie chcę czytać za dużo twoich opisów żeby się nie sugerować bo chcę sama coś zrobić

0

A jak chcę zmienić logikę programu to co muszę użyć? Nie chcę czytać za dużo twoich opisów żeby się nie sugerować bo chcę sama coś zrobić

Zależy, oczywiście, od tego, na jaką logikę chcesz zmienić… Ale sugerowałbym, tak czy owak, przeczytać jednak podręcznik do C++.

0
Nikto0 napisał(a):

A jak chcę zmienić logikę programu to co muszę użyć? Nie chcę czytać za dużo twoich opisów żeby się nie sugerować bo chcę sama coś zrobić

Wpadłem na chwilę do forumowej maskotki ... i [----] Nie będziesz wzywał imienia swojego Boga nadaremno

Althorion napisał(a):

Zależy, oczywiście, od tego, na jaką logikę chcesz zmienić… Ale sugerowałbym, tak czy owak, przeczytać jednak podręcznik do C++.

Wg zapewnień od dawna to robi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1