Jak skonwertować zmienną typu int na typ char?

0

Cześć! Zastanawiałem się jak skonwertować zmienną typu int na typ char i znalazłem odpowiedź, którą wpisałem w wierszu 21 mojego kodu. Tyle, że jak to działa? Lub czy jest na to jakiś inny sposób? Dodam, że bez użycia " + '0' " kod nie działa poprawnie.

#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <stdio.h>
#include <ctime>

int kod[4]; //tablica zawierajaca cyfry kodu;
char wp[4], n[4]; //wp- wprowadzonaliczba, n-zmienna służaca żeby przekonwertować zmienną typu int na char.

int main()
{
    std::cout<<"wylosowany kod: ";

    srand(time(NULL));
    
    for(int i=0; i<4; i++)
    {
    kod[i]=rand()%10;
    std::cout<<kod[i];

    n[i]=kod[i]+'0';

    }

    std::cout<<std::endl;
    std::cout<<"PODAJ WYGENEROWANY KOD PIN: ";
    for(int i=0; i<4; i++)
    {
        wp[i]=getch();
    }


    if((wp[0]==n[0])&&(wp[1]==n[1])&&(wp[2]==n[2])&&(wp[3]==n[3]))
    {
        std::cout<<std::endl<<"Udalo Ci się zalogowac!";
    }
    else
    {
        std::cout<<std::endl<<"Bledny kod";
    }

    getchar();

    return 0;
}

Kolejne pytanie pojawia się na końcu kodu. Dlaczego program się nie wyłącza przy pojedynczym użyciu instrukcji "getchar()"? Zauważyłem, że taki "problem" xd pojawia się w programach, w których użyłem wcześniej instrukcji "getch()", tak jak w moim kodzie.

2

Strasznie przekombinowałeś!

#include <iostream>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;
	
int main()
{
	const int pinsize=4;
	string genpin(pinsize,0),userpin(pinsize,0);
	srand(time(0));
	for(int i=0;i<pinsize;++i) genpin[i]='0'+rand()%('9'-'0'+1);
	cout<<"wylosowany pin: "<<genpin<<endl;
	cout<<"podaj pin: ";
	cin>>setw(4)>>userpin;
	cout<<(userpin==genpin?"Udalo Ci się zalogowac!":"Bledny kod");
	//getchar(); - zamiast tego użyj jakieś IDE z tego tysiąclecia.
	return 0;
}
4

PIN to po prostu (4 cyfrowa) liczba całkowita, czemu nie zrobisz tak ?

  int kod, pin;
  kod = rand() % 10000; 
  cin >> pin;

  if (pin == kod)
  {
    cout << "OK";
  }

A odpowiadając na Twoje pytania.

'0' to znak - taki sam jak np. 'A'. Komputer w pamięci przechowuje jednak tylko liczby. Programiści umówili się więc, że pewne wartości liczbowe będą (w konkretnych sytuacjach) reprezentować różne znaki na ekranie. To co widzisz na ekranie jako znaczek "zero", w pamięci większości komputerów jest pamiętane jako wartość 48 (*)

Jeśli z klawiatury wczytasz cyfrę (wartość typu int) i chcesz ją wyświetlić jako znak (wartość typu char), to musisz zamienić tą cyfrę na odpowiadający jej kod ASCII.
Możesz to zrobić dodając do tej liczby wartość 48, ale '0' jest czytelniejsze i lepiej oddaje intencję programisty.

Co do getch() - zapomnij o istnieniu pliku conio.h i wszystkich funkcjach które tam znajdziesz. To jest prehistoria. Prawdopodobnie jeszcze się nie urodziłeś a conio.h już było obsolete ;)

Jeszcze jeden drobiazg
Nie używaj zmiennych globalnych (deklarowanych poza funkcjami). To zły nawyk.

*)
oczywiście przy założeniu, że nie trafiłeś na kompletnie egzotyczny system, korzystający z kodowania innego niż ASCII

1

Już sam temat jest d/d, sam siebie wprowadzasz w błąd złym słownictwem.

Zmienna typu char[] to NIE JEST zmienna typu char, a w 90% będzie traktowana jako C-string (C ma wiele bardziej ułomną realizację stringa niż C++ i nowsze języki, stad tak mówimy)

4
Bartłomiej Golenko napisał(a):

PIN to po prostu (4 cyfrowa) liczba całkowita, czemu nie zrobisz tak ?

Nie!
Bo może istnieć PIN: 0007

0
_13th_Dragon napisał(a):
Bartłomiej Golenko napisał(a):

PIN to po prostu (4 cyfrowa) liczba całkowita, czemu nie zrobisz tak ?

Nie!
Bo może istnieć PIN: 0007

Jeśli PINy są zawsze czterocyfrowe to dlaczego 7 nie mogłoby reprezentować 0007?

0
_13th_Dragon napisał(a):

Strasznie przekombinowałeś!

#include <iostream>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;
	
int main()
{
	const int pinsize=4;
	string genpin(pinsize,0),userpin(pinsize,0);
	srand(time(0));
	for(int i=0;i<pinsize;++i) genpin[i]='0'+rand()%('9'-'0'+1);
	cout<<"wylosowany pin: "<<genpin<<endl;
	cout<<"podaj pin: ";
	cin>>setw(4)>>userpin;
	cout<<(userpin==genpin?"Udalo Ci się zalogowac!":"Bledny kod");
	//getchar(); - zamiast tego użyj jakieś IDE z tego tysiąclecia.
	return 0;
}

Dzięki za odpowiedź! Jako, że jeszcze jestem zielony to mam kilka pytań.

Co oznacza nawias (i to co się w nim znajduje) przy zmiennych typu string?
Co oznacza zapis ('9'-'0'+1) w wierszu 13? Czy te liczby w apostrofach to kod ASCII?

Czy w wierszu 17 zapis (userpin==genpin?"Udalo Ci się zalogowac!":"Bledny kod") działa jak instrukcja warunkowa If?

Jeżeli chodzi o IDE (zintegrowane środowisko programistyczne) to używam programu Visual Studio Code. Po uruchomieniu w VSC program bez getchar() się nie wyłącza wiec spoko. Jedynie po uruchomieniu z pliku .exe i dlatego dodałem getchar(). Jeżeli chodzi o tą instrukcję to zastanwia mnie, z jakiego powodu program uruchomiony z pliku .exe nie wyłącza się przy pojedynczym użyciu instrukcji "getchar()"?

0

@Bojomir:

Każdy podręcznik, pierwsze 10 kartek

0
Bartłomiej Golenko napisał(a):

PIN to po prostu (4 cyfrowa) liczba całkowita, czemu nie zrobisz tak ?

  int kod, pin;
  kod = rand() % 10000; 
  cin >> pin;

  if (pin == kod)
  {
    cout << "OK";
  }

A odpowiadając na Twoje pytania.

'0' to znak - taki sam jak np. 'A'. Komputer w pamięci przechowuje jednak tylko liczby. Programiści umówili się więc, że pewne wartości liczbowe będą (w konkretnych sytuacjach) reprezentować różne znaki na ekranie. To co widzisz na ekranie jako znaczek "zero", w pamięci większości komputerów jest pamiętane jako wartość 48 (*)

Jeśli z klawiatury wczytasz cyfrę (wartość typu int) i chcesz ją wyświetlić jako znak (wartość typu char), to musisz zamienić tą cyfrę na odpowiadający jej kod ASCII.
Możesz to zrobić dodając do tej liczby wartość 48, ale '0' jest czytelniejsze i lepiej oddaje intencję programisty.

Co do getch() - zapomnij o istnieniu pliku conio.h i wszystkich funkcjach które tam znajdziesz. To jest prehistoria. Prawdopodobnie jeszcze się nie urodziłeś a conio.h już było obsolete ;)

Jeszcze jeden drobiazg
Nie używaj zmiennych globalnych (deklarowanych poza funkcjami). To zły nawyk.

*)
oczywiście przy założeniu, że nie trafiłeś na kompletnie egzotyczny system, korzystający z kodowania innego niż ASCII

Również dziękuję za odpowiedź!

  1. Użyłem tutaj instrukcji getch(), żeby nie trzeba było klikać "enter" za każdym razem. Coś jak automatyczne logowanie od google :D

  2. Napisałeś żebym zapomniał o bibliotece conio.h. Serio nikt jej nie używa? Czy w takim razie jest jakiś zamiennik dla getch()?

  3. Jak na to spojrzeć to faktycznie chyba to zły nawyk robić zmienne globalne. Czyli lepiej po prostu wpisywać je w konkretnych funkcjach tak?

0
Bojomir napisał(a):
  1. Jak na to spojrzeć to faktycznie chyba to zły nawyk robić zmienne globalne. Czyli lepiej po prostu wpisywać je w konkretnych funkcjach tak?

Używasz "w zasadzie" C++, wiec równiez w klasach

2
Bojomir napisał(a):

Co oznacza nawias (i to co się w nim znajduje) przy zmiennych typu string?

Dokładnie to samo co przy każdym innym typie.

Bojomir napisał(a):

Co oznacza zapis ('9'-'0'+1) w wierszu 13? Czy te liczby w apostrofach to kod ASCII?

To kod znaku używany w danym systemie, przeważnie to kod ASCII.
Zaś jeżeli to nie ASCII to i tak zadziała ale pod warunkiem że wszystkie cyfry są po kolei i wzrastająco.

Bojomir napisał(a):

Czy w wierszu 17 zapis (userpin==genpin?"Udalo Ci się zalogowac!":"Bledny kod") działa jak instrukcja warunkowa If?

Hasło do gogle: Operator trójargumentowy

Bojomir napisał(a):

Jeżeli chodzi o IDE (zintegrowane środowisko programistyczne) to używam programu Visual Studio Code. Po uruchomieniu w VSC program bez getchar() się nie wyłącza wiec spoko. Jedynie po uruchomieniu z pliku .exe i dlatego dodałem getchar(). Jeżeli chodzi o tą instrukcję to zastanwia mnie, z jakiego powodu program uruchomiony z pliku .exe nie wyłącza się przy pojedynczym użyciu instrukcji "getchar()"?

Weź to w opcjach ustaw, chwila googlania + chwila ustawiania.

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