• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Nie działa if od przedziału.

Object Storage Arubacloud
0 głosów
249 wizyt
pytanie zadane 5 listopada 2019 w C i C++ przez KonDZIKs Bywalec (2,770 p.)
edycja 5 listopada 2019 przez KonDZIKs

Witam :)

Mam pewien problem. Napisałem program na wyszukiwanie największej liczby. Zrobiłem if'a z przedziałem od 1 do 100 lecz on wgl nie działa. Cały program działa poza tym jednym if'em.

Kod:

#include <iostream>

#include <cstdlib>
#include <ctime>
using namespace std;
int tab[1000], najwiekszy=tab[ 0 ];

int main(int argc, char** argv) {
		cout<<"Podaj liczby:";
		
        for(int i=1; i<=1000; i++)
        {
        	/* TUTAJ*/ if(tab[i]>=1 && tab[i]<=100)
			{
        	cin>>tab[i];
       		}
       		else
       		{
       		cout<<"Wartosc nie miesci sie w przedziale 1-100. Podaj inna: ";
		   	}
		   	//cin>>tab[i];
		   	if(tab[i]==0)
        	{
        		for (int i=1; i<=1000;i++){
        		if(tab[i] > najwiekszy){
        		najwiekszy=tab[i];
			}
		}
    	cout <<endl<<"Najwieksza liczba = "<<najwiekszy;	
			exit (0);
			}

        }
        for(int i=1; i<=1000; i++)
		{
			cout<<tab[i]<<endl;
    	}
        
        /*for (int i=1; i<=7;i++){
        	if(tab[i] > najwiekszy){
        		najwiekszy=tab[i];
			}
		}
    	cout <<endl<<"Najwieksza liczba = "<<najwiekszy;*/
    	
	return 0;
}

 

 

1 odpowiedź

0 głosów
odpowiedź 5 listopada 2019 przez DawidK Nałogowiec (37,910 p.)
Sprawdzasz ifa przed wpisaniem wartości. Do wpisywania przyda Ci się pętla do..while.
komentarz 6 listopada 2019 przez KonDZIKs Bywalec (2,770 p.)
do{
                    if(tab[i]>=1 && tab[i]<=100)
                        {
                            cout<<"Liczba nie miesci sie w przedziale od 1 do 100. \nPodaj liczbe z przedzialu: ";
                            cin>>tab[i];
                        }
            }while((tab[i]>=1) && (tab[i]<=100));

Dodałem coś takiego lecz przy takim ustawieniu znaków żadna liczba z przedziału nie jest poprawna wyrzuca komunikat chyba ,że dam poniżej 1 albo ponad 100 to wtedy jest git. Jak zmienię znaki to nie da sie nic wpisać wyrzuca komunikat. A jak zmienie operatora to wgl sie sypie.

komentarz 6 listopada 2019 przez DawidK Nałogowiec (37,910 p.)

Pętla do...while wykonuje się do momentu gdy warunek w while jest prawdziwy, czyli w tym wypadku podaj ponownie liczbę gdy prawdą jest, że nie mieści się w przedziale tzn. jest większa od 100 lub mniejsza od 1.

Poniżej przykład dla wpisywania 10 wartości z przedziału 1-100:

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int tab[10];

int main(int argc, char** argv) {

    for(int i=0; i<10; i++) {
        do {
            cout<<"Podaj " << i+1 << " liczbe:";
            cin>>tab[i];
        } while (tab[i] < 1 || tab[i] > 100);
    }

    return 0;
}

 

komentarz 6 listopada 2019 przez DawidK Nałogowiec (37,910 p.)

Ponżej jeszcze przykład z dodanym ifem (po próbie wpisania liczby do tablicy)

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int tab[10];

int main(int argc, char** argv) {

    for(int i=0; i<10; i++) {
        do {
            cout<<"Podaj " << i+1 << " liczbe:";
            cin>>tab[i];
            if(tab[i] > 100 || tab[i] < 1) {
                cout<<"Liczba nie miesci się w przedziale" << endl;
            }
        } while (tab[i] < 1 || tab[i] > 100);
    }

    return 0;
}

 

komentarz 6 listopada 2019 przez KonDZIKs Bywalec (2,770 p.)
edycja 6 listopada 2019 przez KonDZIKs

Działa tylko musiałem zmienić  while (tab[i] < 1 || tab[i] > 100);  na  while (tab[i] < 0 || tab[i] > 100); bo przy wpisywaniu 0 nie kończyło programu :D Dziękuję :D
Lecz miałbym do Ciebie pytanie robię zadanie na Spoju. I Spoj nie akceptuje tego rozwiązania wyświetla błędną odpowiedź. Jakbyś miał chęć sprawdzić gdzie leży błąd to był bym mega wdzięczny.

Treść zadania:

Dany jest ciąg nieujemnych liczb całkowitych zakończony zerem, przy czym zero nie jest elementem tego ciągu.

Należy znaleźć maksymalną liczbę w danym ciągu.

Wejście
Na wejściu znajduje się ciąg nieujemnych liczb całkowitych, z przedziału [1;100], zakończony zerem. Zero służy do określenia końca ciągu, w związku z czym wystąpi na wejściu dokładnie raz. Każdy element ciągu podany jest w osobnej linii.

Wyjście
Na wyjściu należy wypisać wartość maksymalnej liczby w danym ciągu.

Kod:

#include <iostream>

#include <cstdlib>
#include <ctime>
using namespace std;
int tab[1000], najwiekszy=tab[ 0 ];

int main(int argc, char** argv) {

		
        for(int i=1; i<=1000; i++)
        {
        	//cin>>tab[i];
			do {
            cout<<"Podaj " << i+1 << " liczbe:";
            cin>>tab[i];
            if(tab[i] > 100 || tab[i] < 1) {
                cout<<"Liczba nie miesci sie w przedziale" << endl;
            }
        } while (tab[i] < 0 || tab[i] > 100);
		   	//cin>>tab[i];
		   	if(tab[i]==0)
        	{
        		for (int i=1; i<=1000;i++){
        		if(tab[i] > najwiekszy){
        		najwiekszy=tab[i];
			}
		}
    	cout <<endl<<"Najwieksza liczba = "<<najwiekszy;	
			exit (0);
			}

        }
        for(int i=1; i<=1000; i++)
		{
			cout<<tab[i]<<endl;
    	}
        
        /*for (int i=1; i<=7;i++){
        	if(tab[i] > najwiekszy){
        		najwiekszy=tab[i];
			}
		}
    	cout <<endl<<"Najwieksza liczba = "<<najwiekszy;*/
    	
	return 0;
}

@Edit: Już rozwiązałem problem. Trzeba było usunąć wszystkie napisy typu podaj liczbę itd.

komentarz 6 listopada 2019 przez tkz Nałogowiec (42,000 p.)
Tak na marginesie, co do tablic, masz buffer overflow. Zauważ, że indexujesz od 1, do równych 1000. gdzie Twoja tablica ma "jedynie" 999.
komentarz 6 listopada 2019 przez KonDZIKs Bywalec (2,770 p.)
edycja 6 listopada 2019 przez KonDZIKs

tkz dzięki za wytłumaczenie.
Mam jeszcze pytanko bo mam analogiczny program tylko dla liczby minimalnej i jest jeszcze jeden kruczek aby wyświetlić numer tablicy tej liczby. Minimalną liczbę mam bo to był banał ale z tym znalezieniem jej numeru tablicy to mam problem.

Tak brzmi polecenie "Na wyjściu należy w osobnych liniach wypisać dwie liczby całkowite wartość najmniejszej liczby w danym ciągu oraz jej ostatnie położenie." 
Mam nadzieje ,że dobrze zrozumiałem. Bo na początku brałem liczbę poprzedzająca najmniejsza ale Spoj tego nie uznawał.

komentarz 6 listopada 2019 przez tkz Nałogowiec (42,000 p.)

By jak najmniej modyfikować cokolwiek, posłużę się kodem wyżej, w założeniu działa w 100%, z wyłączeniem wyświetlania indexu.


#include <iostream>
 
#include <cstdlib>
#include <ctime>
using namespace std;
int tab[1000], najwiekszy=tab[ 0 ];
int indexNajwiekszejLiczby = 0;
 
int main(int argc, char** argv) {
 
         
        for(int i=1; i<=1000; i++)
        {
            //cin>>tab[i];
            do {
            cout<<"Podaj " << i+1 << " liczbe:";
            cin>>tab[i];
            if(tab[i] > 100 || tab[i] < 1) {
                cout<<"Liczba nie miesci sie w przedziale" << endl;
            }
        } while (tab[i] < 0 || tab[i] > 100);
            //cin>>tab[i];
            if(tab[i]==0)
            {
                for (int i=1; i<=1000;i++){
                if(tab[i] > najwiekszy){
                najwiekszy=tab[i];
            }
        }
        cout <<endl<<"Najwieksza liczba = "<<najwiekszy;  
            exit (0);
            }
 
        }
        for(int i=1; i<=1000; i++)
        {
            cout<<tab[i]<<endl;
        }
         
        /*for (int i=1; i<=7;i++){
            if(tab[i] > najwiekszy){
                najwiekszy=tab[i];
                indexNajwiekszejLiczby = i;
            }
        }
        cout <<endl<<"Najwieksza liczba = "<<najwiekszy<<"index to "<< indexNajwiekszejLiczby ;
         
    return 0;
}

7, 43 i 46 linia. 

komentarz 6 listopada 2019 przez KonDZIKs Bywalec (2,770 p.)
#include <iostream>
  
#include <cstdlib>
#include <ctime>
using namespace std;
int tab[1000], najwiekszy=tab[ 0 ];
int indexNajwiekszejLiczby = 0;
  
int main(int argc, char** argv) {
  
          
        for(int i=1; i<=1000; i++)
        {
            //cin>>tab[i];
        	//cin>>tab[i];
			do {
            
            cin>>tab[i];
        } while (tab[i] < -101 || tab[i] > 100);
            //cin>>tab[i];
            if(tab[i]==0)
            {
                for (int i=1; i<=1000;i++){
                if(tab[i] < najwiekszy){
                najwiekszy=tab[i];
                indexNajwiekszejLiczby = i;
            }
        }
        cout <<endl<<najwiekszy<<endl<< indexNajwiekszejLiczby;  
            exit (0);
            }
  
        }
        for(int i=1; i<=1000; i++)
        {
            cout<<tab[i]<<endl;
        }
          
        /*for (int i=1; i<=7;i++){
            if(tab[i] > najwiekszy){
                najwiekszy=tab[i];
                indexNajwiekszejLiczby = i;
            }
        }
        cout <<endl<<"Najwieksza liczba = "<<najwiekszy<<"index to "<< indexNajwiekszejLiczby ;*/
          
    return 0;
}

Tutaj podam obecny kod. Z Twoimi zmianami. To jest dla liczby minimalnej. I niestety Spoj jej nie akceptuje. Nie mam pojęcia domyślam sie tylko ,że chodzi to o ,że jak podaje sie dwa razy tą samą najmniejszą liczbę przykładowo -2 i poda się ją znowu za jakiś czas to podany jest indeks tej 1 liczby a nie tej 2.

Wrzuce jeszcze całe zadanie:

komentarz 6 listopada 2019 przez tkz Nałogowiec (42,000 p.)
A co mówi Spoj? Bo jak dobrze pamiętam, to podaje powód nie przyjęcia zadania.

for (int i=1; i<=1000;i++) to nadal jest źle... Możliwe, że nie przyjmuję przez błędy w samym kodzie.
komentarz 6 listopada 2019 przez KonDZIKs Bywalec (2,770 p.)
Raczej to nie jest ten blad. Bo przy wczesniejszym zadaniu uzylem dokładnie tego samego kodu tylko zmieniłem znak przy (TAB[i] < największy). I spoj to zaakceptował. Sprawdziłem też spoj nic nie podał tylko ,że błędna odowiedz.
komentarz 6 listopada 2019 przez DawidK Nałogowiec (37,910 p.)
W 19 linijce warunek w petli while dopuszcza, liczbę -101 a jest ona poza przedziałem z zadania i tak jak pisze tkz - Twoja tablica ma 1000 elementów o indeksach od 0 do 999 w petli sprawdzasz 1000 indeksów od 1 do 1000 (którego nie ma w tablicy)

Podobne pytania

0 głosów
2 odpowiedzi 240 wizyt
pytanie zadane 8 maja 2018 w C i C++ przez aciorek Nowicjusz (150 p.)
0 głosów
1 odpowiedź 2,448 wizyt
0 głosów
4 odpowiedzi 10,115 wizyt

92,556 zapytań

141,404 odpowiedzi

319,561 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...