Zmiana dwuwymiarowej tablicy integer na stringi

0

Mam zapełnioną dwuwymiarowa tablice liczb ineteger i chce aby w miejscu gdzie jest np. wartosc 9 wstawic spacje i tak wyswietlic, probowalem wszystko przekonwertowac na string i potem sobie zaltwic wszystko if-ami, ale string jest jednowymiarowy, myslalem ze da rade zrobic cos takiego:

for  i:= 1 to 10 do
       
           begin
             for  j:= 0 to 10  do

                ZmiennaString[j]:=IntToStr(TablicaDwuwymiarowa[i,j]);
                if ZmiennaString[j]=9 then
                ZmiennaString[j]:=' ';
                write(ZmiennaString[j]);
               end ;
           

ale kompilator protestuje, że niekompatybilne typy Char i string, wiec nawet konwersji nie moge zrobic, macie jakis pomysl jak w tablicy Intow wstawic sobie spacje w miejsce jakiejs określonej wartosci?

1
srk71 napisał(a):

ale kompilator protestuje, że niekompatybilne typy Char i string, wiec nawet konwersji nie moge zrobic […]

No bo Char i String to różne typy danych – Char to jednobajtowy znak, a String to wielobajtowy ciąg znaków. Nie można tych typów dowolnie przypisywać, tak jak zrobiłeś to tutaj:

ZmiennaString[j]:=IntToStr(TablicaDwuwymiarowa[i,j]);

Przypisać możesz co najwyżej jeden znak z ciągu zwracanego przez IntToStr.


macie jakis pomysl jak w tablicy Intow wstawic sobie spacje w miejsce jakiejs określonej wartosci?

Nie ma na to pomysłu. Nie możesz wpisać znaku do tablicy intów, bo to zupełnie różne typy danych. Napisz konkretnie i szczegółowo co chcesz zrobić – wtedy będziemy myśleć nad rozwiązaniem.

0

Taj jak napisałem mam już zapełnioną dwuwymiarową tablicę intów np:

12345678
90123456
78901234

I teraz wszędzie tam gdzie jest np cyfra osiem, wstawić zamiast niej spacje (tu jako s), potrzebne to mi jest tylko do zaprezentowania wyniku jak wyżej z potrzebnymi zmianami czyli

1234567s
90123456
7s901234

myslalem zeby kazdy wiersz zamienic na stringa wstawić spacje, wyrzucic na ekran i znowu kolejny wiersz na tego samego stringa i znowu na ekran, stringi potrzebne mi sa tylko raz do prezentacji wyniku z podmianka, dane oryginalne mam caly czas w tablicy dwuwymiarowej

1

Jeśli chcesz w taki sposób trzymać dane w tablicy:

12345678
90123456
78901234

i móc wstawić znaki w miejsca ósemek, to tablicę musisz zadeklarować jako przechowującą znaki, czyli typ Char. Do tablicy intów możesz wstawiać tylko liczby. Przy czym tablicę możesz zastąpić zwykłym stringiem, bo tego możesz traktować jak macierz – ustawić długość, dostać się do konkretnej komórki itd.

A jeśli już faktycznie skorzystasz ze stringa zamiast z tablicy znaków, to wszystkie ósemki na spacje będziesz mógł zamienić za pomocą funkcji StringReplace, której należy w parametrze podać flagę rfReplaceAll, aby zamienione zostały wszystkie wystąpienia znaku-wzorca.

0

dwuwymiarowa tablica char jest idealna bo wszystkie liczby sa jednocyfrowea jak skonwertowac int na char? jest jakas funkcja czy tylko rzutowanie typow?

1

Za pomocą… funkcji Chr. ;)

0

czyli cos takiego?

for  i:= 1 to 10 do

           begin
             for  j:= 0 to 10  do

                ZmiennaChar[i,j]:=Chr(TablicaDwuwymiarowa[i,j]);
               
               end ;
1

No tak, ale pamiętaj, że aby do ZmiennaChar trafiła cyfra, liczby w komórce TablicaDwuwymiarowa muszą być z przedziału od 48 do 57 – w przeciwnym razie Chr zwróci jakieś inne znaki, odpowiednie dla kodowania Ansi.

I na litość boską nadaj tym zmiennym jakieś normalne nazwy, bo obecne są bez sensu. Poza tym masz błąd w indeksowaniu tej dwuwymiarowej tablicy – iterator i indeksujesz od 1, a j od 0.

0

Zmienne nazwałem tak na potrzeby forum, żeby łatwo się czytało o co mi chodzi. To tylko przykład. Tej komendy która napisałem w poprzednim poście kompilator mi nie puszcza.rozumiem ze najpierw muszę zamienić cyfry wg ansi i dopiero z nich czyli podanego przez Ciebie przedziału zrobić char?

0
srk71 napisał(a):

Zmienne nazwałem tak na potrzeby forum, żeby łatwo się czytało o co mi chodzi.

Żeby nam było łatwiej zrozumieć co się w kodzie dzieje, pasowało by pokazać deklarację tych macierzy.

Tej komendy która napisałem w poprzednim poście kompilator mi nie puszcza.

To nie jest opis problemu. Pokaż ten kod w całości i podaj treść błędu – wtedy będzie można coś więcej napisać. A najlepiej to podaj cały testowy program, tak aby można go było przetestować u siebie (i poprawić).

rozumiem ze najpierw muszę zamienić cyfry wg ansi i dopiero z nich czyli podanego przez Ciebie przedziału zrobić char?

Jeżeli w tablicy intów masz liczby od 0 do 9 to aby z nich zrobić znaki cyfr, należy do tych liczb dodać 48, tak aby uzyskać kody znaków z zakresu od 48 do 57, a następnie użyć funkcji Chr do konwersji na znaki. Tak uzyskane znaki typu Char możesz wpisać do odpowiedniej komórki w tablicy znaków lub w odpowiednie komórki stringa.


Niżej masz testowy program demonstrujący konwersję liczb na cyfry (znaki), zamianę ósemek na spacje i wyświetlenie w konsoli końcowej zawartości tablicy znaków:

var
  IntArray: array [0 .. 9] of Integer = (4, 8, 1, 0, 2, 7, 6, 3, 5, 9);
  ChrArray: array [0 .. 9] of Char;
var
  Index: Integer;
begin
  // przepisanie liczb z tablicy intów do tablicy charów (z konwersją)
  for Index := 0 to 9 do
    ChrArray[Index] := Chr(IntArray[Index] + 48);

  // zamiana znaków '8' na ' '
  for Index := 0 to 9 do
    if ChrArray[Index] = '8' then
      ChrArray[Index] := ' ';

  // wyświetlenie finalnej zawartości tablicy charów
  for Index := 0 to 9 do
    Write(ChrArray[Index]);

  ReadLn();
end.

W konsoli wyświetlone zostanie to:

4 10276359

Jak widać zamiast 8 jest spacja, czyli dokładnie to czego oczekujesz.

0

Ok, wielkie dzięki za pomoc, jutro od rana przy tym siądę. Kodu nie wrzucam bo cały program ma 350 linijek i nikt nie będzie się przez to przebijał, po prostu napotkane problemy staram się rozwiązać na bieżąco a ten wydaje się ostatni. Chociaż okazuje się ze ta liczba do podstawienia spacji będzie akurat większa od 10 bo jedynie tak mogę oznaczyć miejsca w które chce dać spacje a to oznacza dwa znaki char i kolejny problem.

0
srk71 napisał(a):

Kodu nie wrzucam bo cały program ma 350 linijek i nikt nie będzie się przez to przebijał […]

Dlatego poprosiłem o testowy program, zawierający okrojony problem do minimum. ;)

Chociaż okazuje się ze ta liczba do podstawienia spacji będzie akurat większa od 10 bo jedynie tak mogę oznaczyć miejsca w które chce dać spacje a to oznacza dwa znaki char i kolejny problem.

O tym wcześniej nie wspominałeś… :/

W każdym razie jeśli potrzebujesz mieć więcej niż jeden znak w tablicy docelowej (obecnie charów), to zamiast tablicy znaków, po prostu zadeklaruj tablicę stringów, a do konwersji użyj funkcji IntToStr.

W każdym razie jeśli nadal będziesz miał z czymś problem to podaj więcej kodu, tak aby nie trzeba było zgadywać.

0

Problem wygląda tak. Tworze macierz i na poczatek wypelniam ja zerami. W kolejnych etapach programu macierz wypelnia sie wartosciami zgodnie z dzialaniem programu, ale tylko w niektorych miejscach np pocztek:

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
pozniej macierz wyglada np. tak

1 2 3 4 0
0 3 2 0 4
0 ** 0** 2 0 0

zera pogrubione to pozostalosci po pierwszym wypelnieniu i chce zeby byly na koniec niewidoczne czyli puste w macierzy wynikowej (macierz nie bedzie wtedy prostokatna tylko bedzie miala "wciecia"), czyli najlepiej zamienic je na spacje, ale niektore zera (niepogrubione) sa wynikiem dzialania programu (wstawia cyfry od 0 do 9) i chce je zostawic, program zawsze wstawia do macierzy liczby jednocyfrowe, wiec zeby odroznic pozostalosci z inicjalizacji macierzy od zer wstawionych przez program myslalem zeby wypelniac na poczatku macierz liczba 11 i wtedy kazdy element o wartosci 11 bylby zamieniany na spacje i daloby sie odroznic co jest wynikiem dzialania programu a co pozostaloscia. Sterowanie za pomoca nr indeksow w macierzy odpada bo to bedzie zbyt skomplikowane i bedzie powodowalo mnostwo klopotow po drodze.

1

Jeśli chcesz odróżnić wartości wynikowe od zainicjowanych to inicjuj na -1.
Dobrze jakbyś zdradził całość planu, co chcesz dalej robić z tymi macierzami bo może znajdzie się inne wyjście.

1
srk71 napisał(a):

program zawsze wstawia do macierzy liczby jednocyfrowe, wiec zeby odroznic pozostalosci z inicjalizacji macierzy od zer wstawionych przez program […]

Zainicjuj liczbową macierz wartościami -1, które oznaczać będą komórki nietknięte. Dzięki temu będziesz miał wszystko czego potrzebujesz i tylko jedną macierz (i odpadnie konwersja).

0

Tylko ze potem to -1 muszę zamienić na spacje wiec bez konwersji się nie obejdzie, poza tym jak rzutować -1 na char? Wynikiem działania programu jest właśnie ta „okrojona macierz” dalej już nic z tym nie będę robil

0

A koniecznie musisz na wyjściu mieć tablicę znaków? Nie możesz cały czas operować na intach?

0

Muszę mieć na wyjściu powycinana macierz gdzie pozostałości po zainicjowanych na początku zmiennych będą pustymi miejscami na ekranie. Czyli np pierwszy wiersz 5 cyfr, drugi wiersz spacja 4 cyfry, trzeci wiersz 2 spacje dwie cyfry spacja, taka trochę choinka albo poprzesuwane segmenty i to musi być zrobione w oparciu o ta macierz. Jakiego typu będą to dane na wyjściu jest nieistotne chodzi tylko o te nieszczęsne spacje w miejsce pozostałości.

0

Ja to bym zrobił tak.
Masz macierz wynikową z integerami. Robisz 2 pętle z if..else dla spacji i wstawiasz wynik konwersji na stringa do TStringList. Dalej możesz sobie wyświetlać jak i gdzie chcesz. Lecę spać. Pomyślnego rozwiązania problemu ;)

0

Dzięki, od rana działam

0

Haha, jakie to było banalne if elementtablicy=11 write(‚ ‚) else write(elementtablicy)

1
srk71 napisał(a):

Jakiego typu będą to dane na wyjściu jest nieistotne chodzi tylko o te nieszczęsne spacje w miejsce pozostałości.

Dlatego właśnie Ci zasugerowałem, abyś wartości domyślne oznaczył sobie jako -1 i takie komórki walidował w dalszej części działania programu i je pomijał. Utrudniasz sobie robotę niepotrzebnie, zamiast odseparować dane (tablicę liczb) od logiki ich wyświetlania.

A zasugerowałem Ci inicjalizację macierzy wartościami -1, bo ogólnie przyjęło się, że one liczbowo określają ”nic”.

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