Wyświetlenie komunikatu, jeśli wpisano wartość pierwszy raz

0

Jesli wartosc wpisana jest pierwszy raz to ma sie pojawic komunikat, ze liczba ta sie jeszcze nie powtorzyla, jak to zrobic?

kod:

 #include <iostream>

using namespace std;

int main()
{
int n, liczba;
int t[100];
	
cout<<"Podaj liczbe n z zakresu <0;999>: ";
cin>>n;	

if(n<0 || n>999)
{
cout<<"Liczba spoza zakresu.";
cout<<"Podaj inna liczbe n:";
cin>>n;
}
else
{
}

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

	
}
0

nie, tak jak napisalem.

Podaje np. pierwszy raz 3, pokazuje "3 sie jeszcze nie wyswietlilo"

0
szczurekgdynia napisał(a):

nie, tak jak napisalem.

Podaje np. pierwszy raz 3, pokazuje "3 sie jeszcze nie wyswietlilo"

To znaczy "3 sie jeszcze wczesniej nie wyswietlilo".

0

W sumie można byłoby przy każdej próbie dodania, sprawdzałoby tablicę czy już taka była dodana. Jeśli nie była, to dodaj do tablicy i wypisz, że nie było, jeśli już jest to wiesz co zrobić.

0

Nie mam zielonego pojecia dalej jak to ruszyć.

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

Po tym fragmencie kodu mam dac jakies ify ?

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

int main()
{
    vector<int> numbers = { 1, 2, 3, 4, 5 };
    char quitChar = ' ';
    int number = 0;
    do
    {
        cout << "Enter number: " ; cin >> number;
        cout << "Value " << (find(numbers.begin(), numbers.end(), number) != numbers.end() ? "exists" : "doesn't exists") << endl;
        cout << "Again? "; cin >> quitChar;
    }
    while(quitChar != 'n');

    return 0;
}
0

Ucze sie 3 tydzien programowania i to nasz pierwszy test. Vector, quitchar..? W ogole nie mielismy takich rzeczy, nie da sie jakos prosciej?

0

Da się. Tak bardziej tradycyjnie:


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

int main()
{
    int numbers[] = { 1, 2, 3, 4, 5 };
    size_t array_size = sizeof(numbers) / sizeof(numbers[0]);
    char quitChar = ' ';
    int number = 0;
    do
    {
        cout << "Enter number: " ; cin >> number;
        cout << "Value " << (find(numbers, numbers + array_size, number) != numbers + array_size ? "exists" : "doesn't exists") << endl;
        cout << "Again? "; cin >> quitChar;
    }
    while(quitChar != 'n');

    return 0;
}

A quitChar to zwykła zmienna przechowująca odpowiedź na pytanie czy program ma lecieć dalej czy się zakończyć.
Możesz również napisać własną funkcję, która leci w pętli całą tablicę i jeżeli napotka wprowadzony przez użytkownika numer to zwróci true. Inaczej zwróci false.

0

Program ogolnie ma pobrac od usera liczbe od 0 do 999, i ma wczytywac w petli liczby calkowite z podanego zakresu. jesli wczytana liczba jest spoza zakresu powinien wyswietlic info ze jest spoza zakresu...

I teraz jak to czytam to chyba jest zle w ogole ten kod od poczatku prawda?

0

Po prostu weź np mój kod i dodaj wewnątrz pętli warunek, który napisałeś w swoim kodzie.

0

Weźmy Twój kod:

for(int i=0; i<n; i++)
{
    cin>>liczba;
    //sprawdź czy `liczba` istnieje w `t`
    //jeżeli istnieje:
        //nic nie rób
    //w przeciwnym razie:
        //dodaj `liczba` do tablicy
        //wyswietl wiadomosc
} 

Rozbij teraz te komentarze na jeszcze mniejsze kroki, przynajmniej tam gdzie się da. Napisz, proszę, jak byś sprawdził czy dana liczba z zakresu <0;999> była już wcześniej podana? Pomyśl - jak to zrobić w sposób naiwny? Może jakaś... pętla?
A jak to zrobić za pomocą tylko jednego ifa, bez żadnej pętli?

0

poprawilem kod:

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

using namespace std;

int main()
{
int n, liczba;
int t[100];
	
cout<<"Podaj liczbe n z zakresu <0;999>: ";
cin>>n;	
for(int i=0; i<n ;i++){

if(n<0 || n>999)
{
cout<<"Liczba spoza zakresu.";
cout<<"Podaj inna liczbe n:";
cin>>n;
}
else
{
cout<<"Podaj liczbe n z zakresu <0;999>: ";	
cin>>n;
}
}

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

	
} 

Czy teraz dopiero jest on zgodny z tym poleceniem ktore napisalem wczesniej?

0
szczurekgdynia napisał(a):

poprawilem kod:

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

using namespace std;

int main()
{
int n, liczba;
int t[100];
	
cout<<"Podaj liczbe n z zakresu <0;999>: ";
cin>>n;	
for(int i=0; i<n ;i++){

if(n<0 || n>999)
{
cout<<"Liczba spoza zakresu.";
cout<<"Podaj inna liczbe n:";
cin>>n;
}
else
{
cout<<"Podaj liczbe n z zakresu <0;999>: ";	
cin>>n;
}
}

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

	
} 

Czy teraz dopiero jest on zgodny z tym poleceniem ktore napisalem wczesniej?

Program ogolnie ma pobrac od usera liczbe od 0 do 999, i ma wczytywac w petli liczby calkowite z podanego zakresu. jesli wczytana liczba jest spoza zakresu powinien wyswietlic info ze jest spoza zakresu...

0

Ten kod jest nieprawidłowy:

  • zamiast for lepiej zrobić do...while;
  • kiedy prosisz o podanie liczby to robisz cin >> liczba; , a nie cin >> n; ;
  • powtarzasz pytanie w kodzie dwa razy, bez sensu; Popatrz jak ja to zrobiłem u siebie;
  • jeżeli liczba się nie powtórzyła to, na której pozycji mam ją zapisać w tej tablicy?

Popatrz. Ten kod dba, żeby podana liczba była z zakresu od 0 do 500. Kiedy wpisana liczba jest poza zakresem to należy olać resztę pętli (instrukcja continue) i zacząć ją od nowa.

#include<iostream>
using namespace std;

bool contains(int number, int numbers[], size_t size){
    for(size_t i = 0; i < size; ++i)
        if(numbers[i] == number) return true;
    return false;
}

int main()
{
    int numbers[] = { 1, 2, 3, 4, 5 };
    size_t array_size = sizeof(numbers) / sizeof(numbers[0]);
    char quitChar = ' ';
    int number = 0;
    do
    {
        cout << "Enter number: " ; cin >> number;
        if(number < 0 || number > 500) continue;
        cout << "Value " << (contains(number, numbers, array_size) ? "exists" : "doesn't exists") << endl;
        cout << "Again? "; cin >> quitChar;
    }
    while(quitChar != 'n');

    return 0;
}
0

czy zmienna n jest totalnie niepotrzebna?

0

n jest niepotrzebne. Obie pętle for są niepotrzebne.

0

Jak masz sformatowane dane na wejściu? N liczb gdzie N masz nieznane? Czy najpierw masz przeczytać N, a potem przeczytać N liczb?

0

podalem liczbe 435 i napisalo komunikat "value doesn't exist" dlaczego, skoro mial dbac o to aby liczba byla z <0;500>

0

Przecież dobrze pokazało :) Szukamy ze zbioru { 1, 2, 3, 4, 5 }

0

Nic juz nie rozumiem, 435 jest chyba wieksze od 0 i mniejsze od 500 tak?
I dlaczego akurat z { 1, 2, 3, 4, 5 } tych liczb szukamy?

1

Musisz sobie zdać sprawę, że kod Grześka nie jest napisany po to, żebyś go mógł skopiować, zapisać i zapomnieć. ;P Żeby go przerobić na coś co odpowiada wymaganiom Twojego zadania musisz się trochę postarać i zrozumieć jak działa. ;)

0

rozumiem, ze skoro w moim zadaniu ma przyjmowac liczby od 0 wlacznie do 999 wlacznie to mam szukac wsrod numbers {0,1,2,3,4,5,6,7,8,9} tak?

0

Masz szukać spośród jakiegokolwiek podzbioru zbioru <0, 999>, a zbiór { 1, 2, 3, 4, 5 } jest właśnie takim podzbiorem liczb więc mój kod jest jak najbardziej prawidłowy. Przecież musisz mieć z czego szukać :)

0

Dodam jeszcze raz całą, poprawna tresc, bo poki co to mi sie nic nie zgadza.

  1. Program powinien wyswietlic info aby podal liczbe z zakresu od 0 do 999. Program w petli ma wczytywac liczby calkowite z podanego zakresu. Kiedy wczytana liczba jest spoza zakresu ma wyswietlic info, ze jest nieprawidlowa i czekac na podanie ponowne innej liczby.
    2.jesli wartosc wczytywana jest po raz pierwszy program drukuje info ze ta liczba sie jeszcze nie powtorzyla. w przeciwnym wypadku konczy prace napisem THE END.

czyli ja sobie wyobrazam to tak ze podaje liczbe np 435, jest okej? jest, to pyta o nastepna, podaje 320, jest okej, pyta znow, podaje 2345, i wtedy komunikat ze jest spoza zakresu i musze podac nastepna...

Czy ja to wszystko zle totalnie rozumuje?

0

Tylko tyle jest treści zadania? Czyli na wejściu masz po prostu N liczb z zakresu <0,999> gdzie N nie ma górnego limitu?

A nie, mój błąd, wygląda na to, że masz N liczb, bez zakresu, bez limitu. :P

0

tylko tyle, nic wiecej

0

Dobra. Do tego wręcz stworzony jest vector. To jest taka tablica, do której możesz dodawać elementy. Bardzo wygodne, bo wielkość normalnej tablicy jest sztywna. Tutaj dodajemy elementy, które jeszcze w tablicy nie wystąpiły czyli te, których jeszcze nie wpisano z klawiatury. Jeżeli coś wpisanego przez usera istnieje w zbiorze w tablicy to znaczy, że wartość została powtórzona.

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

int main()
{
    vector<int> numbers;
    char quitChar = ' ';
    int number = 0;
    do
    {
        cout << "Enter number: " ; cin >> number;
        if(number < 0 || number > 500) continue;
        if(find(numbers.begin(), numbers.end(), number) != numbers.end()) cout << "Value exists" << endl;
        else numbers.push_back(number);
        cout << "Again? "; cin >> quitChar;
    }
    while(quitChar != 'n');

    return 0;
}

Jeżeli to działa źle to nie rozumiem treści zadania :)

1

std::vector... z wyszukiwaniem linearnym - do rozwiązania naiwnym sposoben owszem.
Jeszcze lepiej std::unordered_set, bo mamy sprawdzanie na zamortyzowanym O(1) (w najgorszym przypadku linearne). Albo znowu std::vector ale z gwarantowanym sprawdzaniem zawsze O(1), tylko może nam bardzo szybko bardzo spuchnąć - przychodzi tu do głowy sparse vector, jeśli byłby szybszy od std::unordered_set.

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