Pomoc w zadaniu mauralnym c++.

0

Temperatury
Dostępna pamięć: 256MB
Bajtek na lekcji przyrody uczy się określać różne zjawiska pogodowe. Jednym z zadań, które
otrzymał, jest codzienne notowanie temperatury. Bajtek rzetelnie zapisywał liczby na karteczce
każdego dnia. Teraz przygląda się uzyskanym wynikom i zastanawia, ile razy i w które dni
uzyskał określoną temperaturę. Pomożesz mu?
Wejście
W pierwszej linii wejścia znajduje się jedna liczba całkowita n (1 ≤ n ≤ 103
), oznaczająca liczbę
dni pomiarowych. W drugiej linii wejścia znajduje się n liczb całkowitych - zanotowanych
w kolejnych dniach temperatur ti (-50 ≤ ti ≤100). W trzeciej linii znajduje się jedna liczba x
(-50 ≤ x ≤ 100) - szukana temperatura.
Wyjście
Na wyjściu w jednej linii powinna znaleźć się liczba dni k, w które została zmierzona
temperatura x, oraz k liczb oznaczających numery dni, w które zmierzono temperaturę x.
Liczby należy podać w kolejności rosnącej i oddzielić pojedynczymi spacjami.
Przykład
Wejście
5
-2 0 1 -2 3
-2
Wyjście
2 1 4

Prosze o pomoc w rozwiazaniu zadania.
Z góry dziękuje.

0

na razie mam takie coś
#include <bits/stdc++.h>
using namespace std;

int temperatury[1007];

int main ()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, x, k=0;
cin >> n;
cin >> temperatury[n];
cin >> x;

if(x=temperatury[1,2,3,4,5]) k++;

cout << k;

return 0;
}

0

Kliknij </> i wybierz C++. Tam wklejaj swój kod.

Naucz się podstaw... Co Twoim zdaniem robi kod if(x=temperatury[1,2,3,4,5])?
A żeby wczytać wszystkie temperatury, przyda Ci się pętla for.


Mogłem coś zgrzeszyć, bo dawno nie pisałem w C++ i nie znam nowego C++...
Ale zawsze coś:

#include <iostream>
using namespace std;

int main ()
{
    // wczytuje ilosc dni pomiarowych
    int n;
    cin >> n;

    // wczytuje temperatury
    int *temperatury = new int[n];

    for (int i = 0; i < n; i++)
    {
        cin >> temperatury[i];
    }

    // wczytuje szukana temperature
    int x;
    cin >> x;

    // liczba dni, w ktore została zmierzona temperatura x
    int k = 0;
    // numery dni, w ktore została zmierzona temperatura x
    int *dni = new int[n];

    for (int i = 0, j = 0; i < n; i++)
    {
        if (temperatury[i] == x)
        {
            k++;
            dni[j++] = i + 1;
        }
    }

    // wypisanie wynikow
    cout << k;
    for (int j = 0; j < k; j++)
    {
        cout << " " << dni[j];
    }

    delete []temperatury;
    delete []dni;

    return 0;
}

https://ideone.com/dPdgIE - z przykładowymi danymi wejściowymi.


Skoro jeszcze nie znasz dobrze C++, to lepiej zmień język na Pythona i w nim pisz maturę.
Po co sobie utrudniać...

0

@Spine może zrozumiesz inaczej, wystarczy 1 tablica oraz 18 wierszy kodu:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;

int main ()
{
    istream_iterator<int> iin(cin);
    int count=*iin;
    vector<int> data(count);
    copy_n(++iin,count,begin(data));
    int x=*iin,eqcount=0;
    for(int t:data) if(t==x) ++eqcount;
    cout<<eqcount;
    for(int i=0;i<count;++i) if(data[i]==x) cout<<' '<<(i+1);
    return 0;
}

@_13th_Dragon: Wow, ludzki obfuskator... — Spine
@Spine: Łódzki? — PerlMonk
@PerlMonk: Dobrze, że nie z Warszawski :P ;)

Specjalnie dla was kod "nie obfuskowany" - doprawdy tak piszecie kody?

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;

int main ()
{
    istream_iterator<int> cin_int_iterator_for_read_input(cin);
    int input_data_list_size=*cin_int_iterator_for_read_input;
    vector<int> temperature_data_list_for_analize(input_data_list_size);
    copy_n(++cin_int_iterator_for_read_input,input_data_list_size,begin(temperature_data_list_for_analize));
    int temperature_for_find_in_data_list=*cin_int_iterator_for_read_input,founded_temperature_count=0;
    for(int current_temperature_from_data_list:temperature_data_list_for_analize) if(current_temperature_from_data_list==temperature_for_find_in_data_list) ++founded_temperature_count;
    cout<<founded_temperature_count;
    for(int input_data_list_index=0;input_data_list_index<input_data_list_size;++input_data_list_index) if(temperature_data_list_for_analize[input_data_list_index]==temperature_for_find_in_data_list) cout<<' '<<(input_data_list_index+1);
    return 0;
}

Przestań używać zbędnych znaków w kodzie a zaczniesz widzieć takie rzeczy po spojrzeniu na treść zadania.

0

Wiem, że używasz mniej pamięci, ale wykonujesz takie same porównania dwa razy.

1

Ale mnie cos w klatce piersiowej zabolalo jak zobaczylem te dynamiczne tablice

Edit
W sumie to smiesznie, jak sie 13 smok obrazil za ten temat o nieczytelnym kodzie xD teraz uwazajcie, zapamietal wasze nicki i bedzie wysmiewal wasz kod. W piety wam pojdzie, cwaniaczki

1

@_13th_Dragon Twój kod nie zadziała poprawnie pod gcc lub clang. Problemem jest tutaj przesyłanie przez wartość istream_iterator<int> do funkcji copy_n(), co powoduje utworzenie jego kopii i w efekcie przypisanie do zmiennej x pierwszej liczby wczytanej przy jego użyciu. Dzieje się tak dlatego, gdyż wewnątrz funkcji tylko kopia iteratora ulega przesunięciu.

Poprawiona wersja:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>

using namespace std;

int main ()
{    
    auto it = [] { return istream_iterator<int>(cin); };
    int count=*it();    
    vector<int> data(count);   
    copy_n(it(),count,begin(data));
    int x=*it(),eqcount=0;   
    for(int t:data) if(t==x) ++eqcount;
    cout<<eqcount;
    for(int i=0;i<count;++i) if(data[i]==x) cout<<' '<<(i+1);
}

https://wandbox.org/permlink/NizkYgGpLqzDAq81

0
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>

int main ()
{
    std::istream_iterator<int> iin(std::cin);
    int count=*iin++;
    std::vector<int> data;
    data.reserve(count);
    std::copy_n(iin, count, std::back_inserter(data));
    int x=*++iin;
    std::cout<< std::count(data.begin(), data.end(), x) << '\n';

    std::copy(data.begin(), data.end(), std::ostream_iterator<int>{std::cout , ", "});
    return 0;
}

https://wandbox.org/permlink/iFSd2RwqBi2p9iLE

0

Update do wersji 2.0.

  • bez dodatkowej tablicy dni (dla @_13th_Dragon),
  • eliminacja zmiennej j (dla @vpiotr),
  • zakończenie linii wynikowej.
#include <iostream>
using namespace std;

int main ()
{
    // wczytuje ilosc dni pomiarowych
    int n;
    cin >> n;

    // wczytuje temperatury
    int *temperatury = new int[n];

    for (int i = 0; i < n; i++)
    {
        cin >> temperatury[i];
    }

    // wczytuje szukana temperature
    int x;
    cin >> x;

    // liczba dni, w ktore została zmierzona temperatura x
    int k = 0;

    for (int i = 0; i < n; i++)
    {
        if (temperatury[i] == x)
        {
            k++;
        }
    }

    // wypisanie ilosci dni, w ktore zostala zmierzona temperatura x
    cout << k;

    // wypisanie numerow dni, w ktore zostala zmierzona temperatura x
    for (int i = 0; i < n; i++)
    {
        if (temperatury[i] == x)
        {
            cout << " " << i + 1;
        }
    }

    cout << endl; // jesli trzeba zakonczyc linie wynikowa

    delete []temperatury;

    return 0;
}

https://ideone.com/ZSdeyW

0

Dodaję wersję edukacyjną C++98 (wprawka, żeby nie zapomnieć tego języka):

#include <iostream>
#include <sstream>
#include <vector>

using namespace std;

int main()
{
    int pt_count, search_value;
    cin >> pt_count;

    string data_text;
    cin >> ws;
    getline(cin, data_text);

    cin >> search_value;

    int day_no = 0;
    vector<int> result;

    stringstream istr(data_text);
    int value;

    while (day_no++ < pt_count) {
        istr >> value;
        if (value == search_value) {
            result.push_back(day_no);
        }
    }

    cout << result.size() << " ";
    for (int i=0; i < result.size(); i++) {
        cout << result[i] << " ";
    }
    cout << endl;

    return 0;
}

https://ideone.com/uYMER8

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