Jak ograniczyć oceny w c++

Napisałem taki program używający tablic do wyświetlania ocen 5 uczniów, ale nie wiem jak ograniczyć by można było wpisywać liczby od 1 do 6, czy mógłby ktoś mi z tym pomóc?

#include <iostream>
using namespace std; 

int main() { 
int i;/*Numer Ucznia*/
int j;/*Numer Sprawdzianu*/
setlocale(LC_CTYPE, "Polish");
	float oceny[5][2];
	
	for(j=0;j<2;j++){
			cout<<"Wprowadź oceny z sprawdzianu "<<j+1<<" dla 5 uczniów "<<endl;
		for(i=0;i<5;i++)
		{
			cout<<"podaj ocene dla " << i+1 <<" ucznia"<<endl;
			cin>>oceny[i][j];
 		
		}}
		cout<<"Tablica wygląda następująco: "<<endl;
		cout<<"         Sprawdzian I          "<<"Sprawdzian II"<<endl;
		cout<<"Uczeń 1: "<<oceny[0][0]<<"                     "<<oceny[0][1]<<endl;
		cout<<"Uczeń 2: "<<oceny[1][0]<<"                     "<<oceny[1][1]<<endl;
		cout<<"Uczeń 3: "<<oceny[2][0]<<"                     "<<oceny[2][1]<<endl;
		cout<<"Uczeń 4: "<<oceny[3][0]<<"                     "<<oceny[3][1]<<endl;
		cout<<"Uczeń 5: "<<oceny[4][0]<<"                     "<<oceny[4][1]<<endl;
	
		
return 0; 
}

Przy pobieraniu danych zastosuj pętlę do…while z warunkiem dla wielkości zmiennej. Czyli zrób drugą pętlę w pętli for.

if(zmienna oceny>6)
{
cout << “Ocena nie moze byc wieksza niz celujaca”;
} else {
kod programu po wpisaniu poprawnej oceny
}

Stosując ifa przy błędnej odpowiedzi zakończy się program, zamiast poprosić o prawidłową.

Można zastosować instrukcję goto

można dać
if( zmienna oceny >6)
{
cout << “Ocena nie moze byc wieksza niz celujaca”;
i = i-1
}

a jeżeli coś wpisze co wykrzaczy pogram to można to sprawdzać używając try

Na przykład.

On się chce czegoś nauczyć, a wy mu jakieś dziwolągi podpowiadacie…
Ja c nie znam, ale to powinno być raczej coś takiego:

do {
     cout << "Podaj prawidłową ocenę (1-6) dla " << i+1 << " ucznia: ";
     cin >> oceny[i][j];
} while(oceny[i][j]<0 && oceny[i][j]>6);

Rozwiązanie @anon741072 jest najsensowniejsze. Goto się nie używa gdzieś od lat 90tych.

1 polubienie

Zrobiłem tak jak mówisz ale nadal nie działa

#include <iostream>
using namespace std; 

int main() { 
int i;/*Numer Ucznia*/
int j;/*Numer Sprawdzianu*/
setlocale(LC_CTYPE, "Polish");
	int oceny[5][2];
	
	for(j=0;j<2;j++){
			cout<<"Wprowadź oceny z sprawdzianu "<<j+1<<" dla 5 uczniów "<<endl;

		for(i=0;i<5;i++)
		{
		do{
			cout<<"podaj ocene dla " << i+1 <<" ucznia"<<endl;
			cin>>oceny[i][j];
		
		
		}while(oceny[i][j]<0 && oceny[i][j>6]);
		
		}}
		cout<<"Tablica wygląda następująco: "<<endl;
		cout<<"         Sprawdzian I          "<<"Sprawdzian II"<<endl;
		cout<<"Uczeń 1: "<<oceny[0][0]<<"                     "<<oceny[0][1]<<endl;
		cout<<"Uczeń 2: "<<oceny[1][0]<<"                     "<<oceny[1][1]<<endl;
		cout<<"Uczeń 3: "<<oceny[2][0]<<"                     "<<oceny[2][1]<<endl;
		cout<<"Uczeń 4: "<<oceny[3][0]<<"                     "<<oceny[3][1]<<endl;
		cout<<"Uczeń 5: "<<oceny[4][0]<<"                     "<<oceny[4][1]<<endl;
	
		
return 0; 
}

[j]>6

nawet po poprawie tego błędu jest ciągle jakby tej zmiennej w ogóle nie było

Witaj @Naian

Czy liczba uczniów i sprawdzianów będzie się zmieniać.
Wtedy zastanowiłbym się, aby użyć dwóch pętli do wypisania ocen uczniów, bo gdyby było ich 50, to musiałbyś “po Twojemu” zrobić kopiuj-wklej 50 razy ze zmianą numeru ucznia

Nie wiem czy masz ograniczenia co do wykorzystania dodatkowych funkcji
Ja zastosowałbym regex i string zamiast int
regex ograniczy wpisywanie ocen do zakresu 1 - 6, jak również nie wpiszesz liter, znaków, itd.
jeśli wpiszesz coś innego, to powtórzy pytanie

#include <iostream>
#include <string>
#include <regex>
using namespace std; 

int main() { 
int i;/*Numer Ucznia*/
int j;/*Numer Sprawdzianu*/
setlocale(LC_CTYPE, "Polish");
	string oceny[5][2];
    regex regex_pattern("[1-6]");
	
	for(j=0;j<2;j++){
			cout<<"Wprowadź oceny z sprawdzianu "<<j+1<<" dla 5 uczniów "<<endl;

		for(i=0;i<5;i++)
		{
		do{
			cout<<"podaj ocene dla " << i+1 <<" ucznia"<<endl;
			cin>>oceny[i][j];
		
		
		}while(!regex_match(oceny[i][j],regex_pattern));
		
		}}
		cout<<"Tablica wygląda następująco: "<<endl;
		cout<<"         Sprawdzian I          "<<"Sprawdzian II"<<endl;
		
		cout<<"Uczeń 1: "<<oceny[0][0]<<"                     "<<oceny[0][1]<<endl;
		cout<<"Uczeń 2: "<<oceny[1][0]<<"                     "<<oceny[1][1]<<endl;
		cout<<"Uczeń 3: "<<oceny[2][0]<<"                     "<<oceny[2][1]<<endl;
		cout<<"Uczeń 4: "<<oceny[3][0]<<"                     "<<oceny[3][1]<<endl;
		cout<<"Uczeń 5: "<<oceny[4][0]<<"                     "<<oceny[4][1]<<endl;
	
		
return 0; 
}

obraz

Robię ten program w dev c++ i może brakuje mi jakiejś biblioteki albo coś w tym stylu gdyż po odpaleniu tego kodu pokazuje mi error image
oraz otwiera się drugie okno z tą wiadomością:

// Copyright © 2007-2014 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.

// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.

// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
// http://www.gnu.org/licenses/.

/** @file bits/c++0x_warning.h

  • This is an internal header file, included by other library headers.
  • Do not attempt to use it directly. @headername{iosfwd}
    */

#ifndef _CXX0X_WARNING_H
#define _CXX0X_WARNING_H 1

#if __cplusplus < 201103L
#error This file requires compiler and library support for the
ISO C++ 2011 standard. This support is currently experimental, and must be
enabled with the -std=c++11 or -std=gnu++11 compiler options.
#endif

Zamień
while(oceny[i][j]<0 && oceny[i][j]>6);
na
while(oceny[i][j]<1 || oceny[i][j]>6);
czyli && (AND) na || (OR) w pętli while (bo np. chcesz wykluczyć 7 a ta liczba nie jest jednocześnie mniejsza od 1 i większa od 6 - wykluczane liczby są albo mniejsze od 1 albo większe od 6). Warunek z <0 zmień na <1 (żeby wykluczyć 0).

1 polubienie

Regex? :smiley: Ale przekombinowaliście… Od tego jest atoi - https://cpp0x.pl/dokumentacja/standard-C/atoi/239

Faktycznie postawiłem odwrotnie znaki większości/mniejszości :smiley: