Konwertowanie liter na liczby

0

Siemacie

Otóż jestem nowy tutaj, zarówno jak i w programowaniu, ponieważ dopiero co zacząłem studia na kierunku informatyka i teraz jest moja praktycznie pierwsza jakakolwiek styczność z programowaniem :P . Może "podstawy podstaw" można powiedzieć, że "umiem" ale też pewności absolutnej nie mam..... No dobra, chodzi mi głównie o to, że chcę przekonwertować dany wyraz (składający się z liter alfabetu angielskiego + znaki przystankowe, odejmowania, dzielenia itp.) i chcę, żeby dane litery przekonwertował na liczby. Dam przykład:

MARCIN

To mam przykładowo taką tabelę:

M=58
A=47
R=23
C=91
I=52
N=48

Chcę, żeby pierwsze 5 liter przekonwertował na liczby i je po prostu dodał i pokazał sumę. Jeżeli ma przykładowo 7 liter to chcę, żeby wziął pod uwagę pierwsze 5 a 2 na końcu pominął, no i jak wiadomo, jeżeli będą przykładowo 4 litery to żeby je również wszystkie dodał. Mam nadzieję, że to nie jest jakieś bardzo skomplikowane i jest w miarę zrozumiałe :P . Jakieś sugestie/pomoce??? Będę bardzo wdzięczny za jakąkolwiek pomoc!! Z góry wielkie dzięki!!

1

Chyba najprostszy dla Ciebie sposób, to napisanie funkcji, która zwróci 58, gdy jako parametr zostanie podane "M".. i tak dalej.. Wystarczy Ci wiedzieć jak działa funkcja i jak działa if..

0

No właśnie, funkcja, ale..... o co dokładnie chodzi?? Funkcja jaka?? Czego?? Jakie polecenie?? Myślałem nad zrobieniem tablicy, właśnie na coś w stylu A=3, B=7, C=24 itd. ale nie mam pojęcia jak to napisać i jak się za to zabrać...

0

A po co dział "praca"?? Ciężko jest odpowiedzieć albo nakierować mnie o co chodzi albo nakierować do konkretnego poradnika?? Wiem, jak działa if ale jeżeli chodzi o funkcję/funkcje to nie mam pojęcia o co chodzi, bo jest ich chyba wiele...

0

Delphi, nie Delphi - sposób możesz wykorzystać ten sam:

simplex napisał(a)
var Znaki: array[0..25] of Char = 'abcdefghijklmnopqrstuvwxyz';

(...) rozpatrywać po dwa znaki na raz:

var Zakodowane: array[0..51] of Char = ' 1 2 3 4 5 6 7 8 910111213...i tak dalej...2526';

(...) zakodowany tekst będzie w postaci grup cyfr o nieregularnej długości, np:
201510 51920161815192025192625 618 // Nie do złamania ;)

PS. Dlaczego Znaki i Zakodowane są zmiennymi, a nie stałymi?

Obie tablice typu char, pierwsza ma 26 elementów, druga 52.

Warto przeczytać!

0

W sensie.... jeżeli dobrze to rozumiem, to mimo wszystko muszę stworzyć 2 tablice, prawda?? Jeżeli wpiszę dane słowo tak jak powyżej "MARCIN" to muszę tak program zaprogramować, żeby każda litera była zmienną i te zmienne oddzielnie odczytał :P . Przykładowo, słowo M + A + R + C + I + N ma 6 zmiennych, czyli niech to będzie przykładowo a + b + c + d + e (ostatniej litery nie tykam bo program ma wziąć pod uwagę tylko pierwsze 5), no i te zmienne jak np. a=M albo b=A musi poszukać w tablicy aż potem nastąpi wreszcie ta konwersja do liczb, tak jak np. M=58 itd. Na samym początku już miałem taki pomysł i lepszego sposobu na razie nie wymyślę. Czy myślę prawidłowo?? Jest jakiś inny sposób na to??

0

Jeżeli chcesz literom przypisać pewne wartości liczbowe, aby potem znaleźć wartość dla podanej litery, to wygodniej będzie użyć nie tablicy, ale słownika (tudzież mapy).

0
#include <iostream>
#include <cmath>
#include <string>
#include<map>

using namespace std;

int main()
{
    map<char, int> dictionary;
    //tworzysz sobie mapę, o kluczach będących pojedynczą literą i wartościach liczbowych
    //http://www.cplusplus.com/reference/stl/map/

    //kojarzysz klucze (litery) z wartościami (liczby)
    dictionary['A']=1;
    dictionary['B']=3;
    dictionary['C']=4;
    dictionary['x']=56;
    dictionary['z']=66;
    /*i tak dalej, ile chcesz...*/


    string text;
    cin >> text;
    //pobierasz sobie napis od uzytkownika
    int suma=0;
    for(int i = 0; i < text.size(); i++)
    {
        cout << dictionary[ text[i] ] << " ";
        //text[i] to pojedyncza liera z pobranego słowa
        //dictionary[text[i]] - to ci daje wartość jaką ustawiłeś dla litery text[i]
        
        suma+=dictionary[text[i]];
        //a tu sumujesz te wartości do jednej zmiennej
        
    }

    cout << endl << "SUMA:" << suma;
    //wyświetlasz wynik

    return 0;
}

Taki najprymitywniejszy gotowiec z użyciem std::map.
Działać działa, jak nie rozumiesz - masz okazję, żeby poczytać sobie o tym.
Zrobić ograniczenie do pierwszych pięciu to praca domowa dla Ciebie.

0

Obawiam się, że pomyliłeś języki bo nadal nie chce mi działać :P . Po prostu żywcem przepisałem kod i mi nie zadziałał mimo wszystko, no i tak mi się wydawało. Nawet jak wpisałem polecenie "map" to program nic mi nie skojarzył. No może teraz mniej więcej zaczynam łapać o co chodzi ale jednak nadal skutków nie ma żadnych.... Jedyne co udało mi się zdziałać to znaleźć gdzieś w internecie o funkcji "Dictionary" ale jednak nie znalazłem nic konkretnego dla siebie, bo nawet nie było nic konkretnego o zwykłym wpisaniu....

0

Możesz podać dokładną treść tego zadania? Czy przypadkiem nie napisałeś tej tabelki od tak sobie? Możliwe, że chodzi po prostu o rzutowanie, bo to zadanie w tej chwili te zadanie nie wydaje się mądre.

0

No racja, tą tabelkę napisałem "od tak sobie" ale to raczej nie ma żadnego znaczenia :P . Dokładnie to leci tak: A=128, B=129, C=130 itd. aż do Z ale to i tak nie zmienia postaci rzeczy, bo i tak trzeba tym cyfrom przypisać wartości...

0

Yyy...nie cyfrom, tylko literom, już późna godzina daje znać. Mimo wszystko, czytałem ten poradnik:
http://stackoverflow.com/questions/687942/java-map-equivalent-in-c-sharp
i co najfajniejsze, nadal mi nie działa..... Wklejam tą linijkę:
Dictionary example = new Dictionary<string,string>();

to nawet na początku słowa "Dictionary" nie zaznacza na niebiesko, jakby nie miał pojęcia o co chodzi.... a dziwne, bo jak wpiszę "D" to wyskakuje obok taka mała lista i jest w niej właśnie "Dictionary<>". Powiedzcie mi co jest grane...

0
MaarioS napisał(a)

No racja, tą tabelkę napisałem "od tak sobie" ale to raczej nie ma żadnego znaczenia :P . Dokładnie to leci tak: A=128, B=129, C=130 itd. aż do Z ale to i tak nie zmienia postaci rzeczy, bo i tak trzeba tym cyfrom przypisać wartości...

Zmienia postać rzeczy, bo takie przypisanie można zrealizować DUŻO prościej, bez tablic czy słowników. ;]

0

Nie wiem jak się rzutuje w C#, ale podejrzewam, że podobnie jak w c++

a = (int)'A' + 73;

Ta instrukcja przypisze, zmiennej a 138, jeżeli wstawisz w miejsce 'A' znak 'B' to 139 itp.
Dalej powinieneś sobie dać radę.

0

w tym przypadku nawet nie trzeba rzutowania, już samo

int a = 'A' + 73;

przypisze 138 do a.

0
for(int i=0;i<=25;i++)
                Console.WriteLine("{1} {0} ", i+128 ,(char)(i+65));

Hmm,, MaarioS mogłeś od razu powiedzieć o co Ci chodzi..Na początku myślałem, że to będzie coś w stylu zadania ze spoja http://pl.spoj.pl/problems/PTWPZ073/

0

Można by to zrobić obchodząc się bez macierzy, słowników itd.; Dawno nie pisałem w językach z rodziny C, ale w Pascal'u wyglądać by to mogło tak:

function GetCharSum(const sLine: String): Integer;
var
  iCount, I: Integer;
begin
  Result := 0;

  case Length(sLine) of
    0 .. 4: iCount := Length(sLine);
  else
    iCount := 5;
  end;

  for I := 1 to iCount do
    Inc(Result, Ord(sLine[I]) + 63);
end;

Dlaczego dodaję 63? Kod ASCII znaku A to 65, a autor przyjmuje dla znaku A kod 128, stąd 65 + 63 = 128; Ten kod łatwo zamienić na C# (pod warunkiem, że się ten język na tyle zna...);

EDIT: No albo na pałę:

function GetCharSum(const sLine: String): Integer;
var
  I: Integer;
begin
  Result := 0;

  for I := 1 to 5 do
    if I <= Length(sLine) then
      Inc(Result, Ord(sLine[I]) + 63);
end;
0

@kopernik: wielkie dzięki za pomoc, co prawda wyświetlił mi te litery z liczbami i faktycznie jest tak jak chciałem :P . Aczkolwiek, nie do końca o to mi chodziło, bo program miał nie wypisywać tego wszystkiego tylko to zapamiętać ale jednak jest, jak to się mówi, "progress". No dobra, żeby nie wprowadzać niepotrzebnego zamieszania, dam dokładnie polecenie swojego zadania (tak naprawdę to 1 z podpunktów ale 2 pozostałe już sam zrobiłem):

Napisz program obliczający sumę wartości znaków (według tabeli poniżej) z wprowadzonego wyrazu przez użytkownika. Program ma uwzględnić tylko pierwsze 5 znaków:
A = 128 a = 160 (spacja)=0
B = 129 b = 161 - = 227
C = 130 c = 162 ? = 230
D = 131 d = 163 / = 243
E = 132 e = 164 . = 232
F = 133 f = 165 , = 244
G = 134 g = 166 ( = 154
H = 135 h = 167 ) = 155
I = 136 i = 168 : = 156
J = 137 j = 169 ; = 157
K = 138 k = 170 [ = 158
L = 139 l = 171 ] = 159
M = 140 m = 172 < = 225
N = 141 n = 173 > = 226
O = 142 o = 174 ! = 231
P = 143 p = 175 * = 241
Q = 144 q = 176
R = 145 r = 177
S = 146 s = 178
T = 147 t = 179
U = 148 u = 180
V = 149 v = 181
W = 150 w = 182
X = 151 x = 183
Y = 152 y = 184
Z = 153 z = 185

Litery idą jakoś po kolei, aczkolwiek najbardziej obawiam się jeżeli chodzi o te durne dodatkowe znaki, bo tutaj już jest chyba wszystko pochrzanione jak można....

1

Nie masz zbyt dużo pracy.

var map = new Dictionary<char, int>();

for (char chr = 'A'; chr <= 'Z'; chr++)
{
    map[chr] = chr + 63;
    map[(char)(chr + 32)] = chr + 95;
}

map[' '] = 0;
map['-'] = 227;

// etc.
0

Ta tabela co podałeś jest inna niż wywala mi mój program nr znaku z tabeli asci.

1
ace4ur napisał(a)

Ta tabela co podałeś jest inna niż wywala mi mój program nr znaku z tabeli asci.

Tyle się od ciebie dowiedzieliśmy, co od tego pana.

0
Rev napisał(a)

Nie masz zbyt dużo pracy.

var map = new Dictionary<char, int>();

for (char chr = 'A'; chr <= 'Z'; chr++)
{
    map[chr] = chr + 63;
    map[(char)(chr + 32)] = chr + 95;
}

map[' '] = 0;
map['-'] = 227;

// etc.

Serio tylko tyle wystarczy??? Hehe, aż jestem w małym szoku jak zobaczyłem jakie to jest łatwe :D -> map['-'] = 227; itd. No dobra, przeszliśmy przez ten cały kawał nareszcie prawie do końca, ale jednak został jeden problem z którym się borykam.... jak program ma odczytać te wyrazy wprowadzone z klawiatury i je odczytać i porównać wartości?? Wiem, że to nie będzie duże odkrycie ale przynajmniej wiem, że trzeba wpisać "Console.ReadLine()" i string jakoś na początku ale co, jak gdzie do czego to nie bardzo mam pomysł....

1

A to już masz w każdej książce o podstawach programowania w C#, w każdym skrypcie na studiach, w każdym randomowym tutorialu o programowaniu w C#.

1

Na MSDN też są przykłady. To samo się tyczy klasy System.String

0

@ujemny: nie wiem czemu wykasowałeś swojego wcześniejszego posta, bo ten kod podany przez Ciebie wyjątkowo zadziałał!! :D Tylko trochę go poprawiłem bo był jeden błąd:

string wyraz;
int suma=0;
wyraz = Console.ReadLine();
for (int i = 0; i < 5; i++)
suma = suma + (wyraz[i] + 63);

No i jak na to popatrzyłem to.... zaczaiłem mniej więcej o co chodzi. "wyraz[i]" to jest właśnie wartość danego znaku z wyrazu. Kazdy znak ma swoją wartość DEC w tabeli ASCII, no i program ma te wartości właśnie wpisane, a żeby te dane się pokryły z tą tabelką powyżej to wystarczy dodać + 63 ;) . No dobra, może nie jest tak za bardzo różowo bo.... mam 2 problemy: te mapowanie powyżej W OGÓLE nie działa...... Wpisywałem spacje i po naciśnięciu ENTER wyskakiwało "475" a powinno być po prostu "0".... Równie dobrze tą całą mapę skomentarzowałem i wyszło dokładnie na to samo. Druga sprawa, to jeżeli wpiszę wyraz na 4 litery lub mniej to wywala mi jakiś błąd w linijce "suma = suma + (wyraz[i] + 63);". Ktoś wie co jest nie tak??

0

Pokaż cały kod jaki złożyłeś z tych klocków, które się tutaj pojawiały.

0
MaarioS napisał(a)

Druga sprawa, to jeżeli wpiszę wyraz na 4 litery lub mniej to wywala mi jakiś błąd w linijce "suma = suma + (wyraz[i] + 63);". Ktoś wie co jest nie tak??

Pewno przekraczasz indeks tablicy. ;]

0

MaarioS:
Druga sprawa, to jeżeli wpiszę wyraz na 4 litery lub mniej to wywala mi jakiś błąd w linijce "suma = suma + (wyraz[i] + 63);". Ktoś wie co jest nie tak??

Pewno przekraczasz indeks tablicy. ;]

Na pewno przekracza indeks pola w macierzy, bo nigdzie nie wa warunku sprawdzającego długość łańcucha :)

string wyraz;
int suma=0;

wyraz = Console.ReadLine();

for (int i = 0; i <= 5; i++)
  if (i <= wyraz.Length)
    suma = suma + (wyraz[i] + 63);

Chyba tak by to szło;

0

Tylko po co ten if w pętli?

int suma=0;
string wyraz = Console.ReadLine();

int max = wyraz.Length >= 5 ? 5 : wyraz.Length;

for (int i = 0; i < max; i++)
    suma = suma + (wyraz[i] + 63);
1
using System;

namespace SampleNamespace
{
    public class SampleClass
    {
        public static void Main()
        {
            char[] znaki = {' ', '-', '?', '/', '.', ',', '(', ')', ':', ';', '[', ']', '<','>', '!', '*'};
	    int[] wart = {0, 227, 230, 243, 232, 244, 154, 155, 156, 157, 158, 159, 225, 226, 231, 241};
            string wyraz; 
            int suma = 0;
            
            wyraz = Console.ReadLine();
            
           	for(int i = 0; i < 5; i++)
				if(wyraz[i] > 64 && wyraz[i] < 91 || wyraz[i] > 96 && wyraz[i] < 123)
					suma = suma + wyraz[i] + 63;
				else
					for(int j = 0; j < 16; j++)
						if(wyraz[i] == znaki[j])
							suma = suma + wart[j];
			
	    System.Console.WriteLine(suma);

            System.Console.WriteLine("Press any key to exit the application");
            System.Console.Read();
        }
    }
}

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