tablica char przepisana do tablicy int

0

Mam do wczytania z pliku elementy z których część to liczby a część litery.
Jeśli pojawiają się litery zamieniam je na odpowiednie liczby, które chcę później porównywać.
Wczytuję więc wszystko do tablicy char. Następnie sprawdzam czy jest literą i jeśli tak przypisuje mu odpowiednią wartość w analogicznej tablicy int. Jeśli nie chcę przepisać wartość do tablicy int i to już nie działa.
nie działa żaden z poniższych przykładów:

 tab1z[i] = (int)tab1z2[i];
int tab1z[i] = static_cast<int>(tab1z2[i]);
int tab1z[i] = atoi(tab1z2[i]);

ten pierwszy po prostu nie działa dwa kolejne chciałby const char. Jeśli zmienię typ tablicy na const char, to kompilator pisze "ambigous overload for 'operator>>'(operand types are std::fstream<char>}and 'const char')".
Tablica char przechodzi przez prostą petle:

for(int i=0;i<5;i++)  
{
				
				if(tab1z2[i]=='W'||tab1z2[i]=='w')
					tab1z[i]=11;
				else
					{
			
					if(tab1z2[i]=='Q'||tab1z2[i]=='w')
						tab1z[i]=12;
					else
						{
							if(tab1z2[i]=='K'||tab1z2[i]=='k')
							tab1z[i]=13;
						else
						{
						if(tab1z2[i]=='A'||tab1z2[i]=='a')
							tab1z[i]=14;
						else
						tab1z[i]=tab1z2[i];
				
						
						}
						
						}	
						
					}  
				
			} 

W załączniku jest zrzut z konsoli z efektami pracy tej pętli for .

1

Zainteresuj się ASCII.
No chyba, że ja coś źle zrozumiałem.

Ps. W 2 if masz literówkę, zamiast porównywania do 'w', najprawdopodobniej powinno być do 'q'.

3

Jeśli możesz, spróbuj sprecyzować do czego dążysz.

Na ten moment to jest snippet dla Ciebie:

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
#include <cctype>
using namespace std;

int main() {
	auto translate = [](char c) -> int{
		auto check = string("wqka");
		auto pos = check.find(c);
		return pos != string::npos?
			pos+11 : c;
	};
	
	transform(
		istreambuf_iterator<char>(cin),
		istreambuf_iterator<char>(),
		ostream_iterator<int>(cout, " "),
		[&](char c){ return translate(tolower(c)); }
	);
	return 0;
}

http://ideone.com/YKbvYi

Ew skupiając się na twoich tablicach:

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
#include <cctype>
#include <type_traits>
using namespace std;
 
int main() {
    auto translate = [](char c) -> int{
        auto check = string("wqka");
        auto pos = check.find(c);
        return pos != string::npos?
            pos+11 : c;
    };
 
    char source[] = "wQkacostenteges";
    int result[extent<decltype(source)>::value-1] = {0};
 	
    transform(
        begin(source),
        end(source)-1,
        begin(result),
        [&](char c){ return translate(tolower(c)); }
    );
    
    for(int x: result){
    	cout << x << " ";
    }
    return 0;
}

http://ideone.com/7Czla1

0

Dzięki. Z pół godziny po tym jak napisałem ten post wpadłem na pomysł z ASCI. Dzięki za zwrócenie uwagi na literówkę i dzięki za snippet.

0

Na pewno ten kawałek kodu od spartanPAGE jest właściwą odpowiedzią na to pytanie i postaram się go zrozumieć. Naprawdę doceniam pracę włożoną w to żeby mi pomóc, jednak w tym przypadku stwierdziłem, że przepisanie wartości do int nie jest mi potrzebne. Skoro wiem, że 1 w ASCII to 48 a 9 to 57, to mogę po prostu mniejszym nakładem pracy zmienić pentle if tak żeby dla 'w' przypisywały 59, q=60, k=61 natomiast a=62. Trzeba było tylko dodać if dla wartosci 10 i nadać jej 58. Wszystkie inne funkcje działają poprawnie, np. kiedy sprawdzam czy w sekwencji kart jest poker to sprawdzając czy różnica między największą i najmniejszą wynosi 4 to automatycznie działa itd.
Teraz wygląda to w ten sposób:

 	for(int i=0;i<5;i++)  //Zamieniam znaki W, Q, K na dopowienie liczby
			{
				if(tab1z2[i]==10)
					tab1z[i]=58;  //ponieważ 9 w Kodzie Ascii jest równe 57. Dzięki temu 10 będzie o 1 większe niż 9.
				else
				{
				
					if(tab1z2[i]=='W'||tab1z2[i]=='w')
						tab1z[i]=59;
					else
						{
			
						if(tab1z2[i]=='Q'||tab1z2[i]=='q')
							tab1z[i]=60;
						else
							{
								if(tab1z2[i]=='K'||tab1z2[i]=='k')
								tab1z[i]=61;
							else
							{
							if(tab1z2[i]=='A'||tab1z2[i]=='a')
								tab1z[i]=62;
							else
							tab1z[i]=tab1z2[i];
				
						
						}
						
					}
				}
						
		}  				
	}

Jeszcze raz wielkie dzięki wam obu.

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