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

Słowo jako liczba

Object Storage Arubacloud
0 głosów
318 wizyt
pytanie zadane 20 lipca 2015 w C i C++ przez Sinnley Stary wyjadacz (12,810 p.)
Witam, zastanawiam się jak mógłbym skontruować kod w taki sposób, aby konkretną instukcje wpisaną jako słowo, liczba lub znak konsola interpretowała jako konkretną liczbę.

Aby to zobrazować wyobraźcie sobie program symulujący dziennik szkolny, do którego nauczyciel wpisuje oceny. To co mam na mysli to skonstruowanie takiego kodu, aby ten nauczyciel nie musiał wpisywać oceny jako np. 3.5, albo 2.75, ale np. jako "3+", albo "3-".

7 odpowiedzi

0 głosów
odpowiedź 20 lipca 2015 przez Patrycjerz Mędrzec (192,320 p.)
A nie można zrobić tego jako ciąg if-ów?
0 głosów
odpowiedź 20 lipca 2015 przez Dorion300 Szeryf (90,250 p.)
Tak, mógłbyś tak zrobić.

Ale błagam nie rób masę if'ów.
komentarz 20 lipca 2015 przez Patrycjerz Mędrzec (192,320 p.)
Nie wiem, ale jakbyś mógł to zrobić poza wykorzystaniem instrukcji if? Na makrach się nie znam, ale można by je tutaj wykorzystać?
komentarz 20 lipca 2015 przez Wiktor Stary wyjadacz (11,120 p.)

Switch-e to takie usprawnione if. Także próbuj.smiley

komentarz 20 lipca 2015 przez Dorion300 Szeryf (90,250 p.)

Można zrobić tablicę double i tablice string.

Jeśli string się równa elemencie w tablice to zwraca w drugiej tablicy cyfrę double.

Przez co wystarczy pętla i jeden if

Ale to jest trochę bezsensu.

Lepszym pomysłem jest wsięcie cyfry który występuje w string

A nastepnie znak.

Potem sprawdzić if'em czy to jest minus czy to jest plus a następnie dodać lub odiąc z cyfry.

Kod jest bardziej skoplikowany ale także bardziej łatwiejszy w edycji.

Gdyż jeśli chcemy dodać np. 7.

To wystarczy powiększyć maksymalną cyfrę którą można wprowadzić.

0 głosów
odpowiedź 20 lipca 2015 przez katolik6 Dyskutant (8,140 p.)

eee.. chyba jakoś tak, o ile dobrze rozumiem:

#include <iostream>
string input;
double liczba=0;

int str2int(string str)
{
    stringstream ss;
    int temp;
    ss << str;
    ss >> temp;
    return temp;
}//źródło: http://sadi.ovh.org/arty/cppkonw.php      nie testowałem, ale chyba działa


int main(){
cin>>input;
if(input[0]="-") liczba-=0.25;
liczba+=str2int(input);
}

 

0 głosów
odpowiedź 20 lipca 2015 przez Krawiec91 Pasjonat (19,600 p.)
Witam
Zarzuciłeś tutaj przykład z tym dziennikiem szkolnym. Można by dane z klawiatury, np. te 3+  zapisywać do tablicy char. Pewnie na tych danych jakieś obliczenia będą wykonywane, że potrzebna by była postać liczbowa. W tym celu napisałbym funkcję, która:
- jako argument przyjmuje tablice typu char
- zwraca wartość typu całkowitego albo zmiennoprzecinkowego.
Co do przetwarzania danych i działania funkcji:
Funkcja przeszukuje tablicę:
- sprawdza czy dany element jest liczbą, jeśli tak zapisuje to do jakieś zmiennej liczbowej, która powiedzmy że sumuje wartości.
- sprawdza czy dany element jest jakimś znakiem, jeśli jest załóżmy to znak '-' to odpowiada to liczbie np. -0.25. I ta liczba jest dodawana do zmiennej sumującej.

Albo pisałbym samemu funkcję do zamiany znaków na liczby, to akurat proste w przypadku liczby kod ascii liczby to 30h, więc żeby z tego mieć inta to tylko odejmujesz 30h. Albo próbowałbym użyć gotowych funkcji z bibliotek cstring albo cstdlib.
http://www.cplusplus.com/reference/cstring/
http://www.cplusplus.com/reference/cstdlib/
0 głosów
odpowiedź 22 lipca 2015 przez Szykem2 Nałogowiec (29,510 p.)
Myślę, że chodzi Ci o coś tego typu:

Input: liczba poprzedzona znakiem +, - lub żadnym

Output: liczba powiększona/pomniejszona o zadaną wartość

#include <iostream>

#include <string>

#include <cstdio>

 

using namespace std;

int main()

{

    cout << "Podaj ocene: " << endl;

    string str;

    cin >> str;

    float val = atoi(str.c_str() + 1);            //napewno są lepsze rozwiązania ale nie chce mi się szukać a tą funkcję biblioteczną znam

    if (str[0] == '-')

    {

        val -= 0.25;

    }

    else if (str[0] == '+')

    {

        val += 0.5;

    }

    cout << val << endl;

    system("PAUSE");

    return 0;

}
0 głosów
odpowiedź 22 lipca 2015 przez nowyfolder Mądrala (7,250 p.)

Witam. Przyszedł mi do głowy pomysł skonstruowania prostych wyrażeń regularnych dla każdej oceny, oto kod do testów:
 

#include <iostream>
#include <regex>

std::regex ocenyR[11] = { std::regex("1|ndst|niedostateczny"), std::regex("2|dop|dopuszczajacy"),
						std::regex("2\\+|dop\\+|dopuszczajacy\\+"), std::regex("3\\-|dop\\-|dopuszczajacy\\-"),
						std::regex("3|dop|dostateczny"), std::regex("3\\+|dop\\+|dostateczny\\+"),
						std::regex("4\\-|db\\-|dobry\\-"), std::regex("4|db|dobry"),
						std::regex("4\\+|db\\+|dobry\\+"), std::regex("5\\-|brb\\-|bardzo dobry\\-"),
						std::regex("5|brb|bardzo dobry"), };
double oceny[11] = { 1, 2, 2.5, 2.75, 3, 3.5, 3.75, 4, 4.5, 4.75, 5 };

int main()
{
	std::string ocena;
	std::cout << "Podaj jaka chcesz ocene: ";
	std::getline(std::cin, ocena);
	for (int i = 0; i < 11; i++) {
		if (std::regex_match(ocena, ocenyR[i])) {
			std::cout << "Ocena to " << oceny[i];
			return 0;
		}
	}
	std::cout << "Zle znaki na wejsciu!";
	return 0;
}

Łatwo można ten kod rozszerzyć o inne sposoby podawania ocen, edytując tablicę regexów :P

 

Biblioteka <regex>:

http://www.cplusplus.com/reference/regex/
Zasady działania wyrażeń regularnych:

http://www.cplusplus.com/reference/regex/ECMAScript/

0 głosów
odpowiedź 22 lipca 2015 przez criss Mędrzec (172,590 p.)

Jesli chodzi o ten dziennik - niech input zapisuje sie do stringa i następnie poprzez if interpretujesz plus i minus w ocenie i zapisujesz do floata. 
Na takiej zasadzie:

      string str;
      float mark;
      cin>>str;
      if(str.length() >= 2 && str[1]=='+'){
         mark = str[0] - '0';
         mark += 0.25; }
      else if(str.length() >= 2 && str[1]=='-'){
         mark = str[0] - '0';
         mark -= 0.25; }
      cout<<mark<<endl;

Co do interpretowania slow jako liczbe:

string str = "slowo";
int suma = 0;

 for(auto i: str)
       suma += static_cast<int>(i);

cout<<suma;

Czyli po prstu dodawanie do siebie kolejno numerow znakow ascii z ktorych sklada sie slowo.

Jeśli nie rozumiesz jeszcze tego for z auto, to jest równoznaczny z tym:

for(short i; i < str.length(); i++)
        suma += static_cast<int>(str[i]);

 

Podobne pytania

0 głosów
1 odpowiedź 208 wizyt
pytanie zadane 1 września 2020 w C i C++ przez magda_19 Gaduła (3,080 p.)
0 głosów
3 odpowiedzi 260 wizyt
pytanie zadane 7 kwietnia 2020 w SPOJ przez milosz123 Użytkownik (720 p.)
0 głosów
2 odpowiedzi 582 wizyt
pytanie zadane 17 lutego 2020 w C i C++ przez Biedrzyk Nowicjusz (180 p.)

92,615 zapytań

141,465 odpowiedzi

319,782 komentarzy

61,997 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!

...