Da się zrobić tabelę ze zmienną char...?

0

Witam, mam pewien problem gdyż napisałem program:

uses
  Crt;

var
  a : array[1..1000] of char;
  q : char;
  b, x, z, y, wyjscie : word;

begin
  clrscr;
  read(b);
  for x := 1 to b do
    read(a[x]);
  for x := 1 to b do
  begin
    q := a[x];
    for y := 1 to 32 do
      Inc(q);
    for z := 1 to b do
      if a[z] = q then
        wyjscie := wyjscie + 1;
  end;
  for x := 1 to b do
  begin
    q := a[x];
    for y := 1 to 32 do
      Dec(q);
    for z := 1 to b do
      if a[z] = q then
        wyjscie := wyjscie + 1;
  end;
  clrscr;
  write(wyjscie);
  delay(5000);
end.

Domyślam się, że char nie może być tabelą gdyż podaję znaki, a nie liczby.
Ale ciekawi mnie, czy da się w jakiś sposób "naprawić" za pomocą prostej sztuczki ten program by wszystko działało:3 ? Z góry dziękuję

0

Pewnie że się da, problem jedynie w tym że tak namąciłeś że nie da się zrozumieć co chciałeś zrobić.

0

Bardzo proste,

Chciałem by w pierwszym wierszu standardowego wiersza wpisać liczbę (b) która symbolizuje ilość znaków char (a[x])
Następnie mam zmienną "q" która jest do pomocy staje się ona pierwszym wpisanym znakiem i zostaje porównana do reszty znaków (najpierw jest zwiększona bądź zmniejszona o 32)
Jeśli będzie się równać po zwiększeniu bądź zmniejszeniu wynik zostaje zwiększony o 1 i tak cały czas, aż się nie skończy a[x].

Czyli łopatologicznie tak powinno to wyglądać -

(b) = 5

a[1] = b
a[2] = B
a[3] = c
a[4] = B
a[5] = B

q:=b - zostaje zwiększone, ale nie równa się ani B ani c więc wynik niezmienny
q:=B - zostaje zwiększone i równa się b więc wynik = 1
q:=c - zostaje zwiększone ale nie równa się ani b ani B
q:=B - zostaje zwiększone i równa się b więc wynik = 2
q:=B - zostaje zwiększone i równa się b więc wynik = 3

Teraz zauważyłem, że nie ma sensu zmniejszać więc te 4 linijki usuwam :P

No i taka jest teoria przy wejściu

5
bBcBB

Wyjście ma wynosić

3

1
var S:String;
NiepotrzebnaLiczba,i,wyjscie:Word;

begin
  readLn(NiepotrzebnaLiczba);
  readLn(S);
  wyjscie=0;
  S[1]:=UpCase(S[1]);
  for i:=2 to Length(S) do if UpCase(S[i])=S1 then Inc(wyjscie);
  write(wyjscie);
  readkey;
end.
1

Jeśli będzie się równać

Czemu równać? Anyway, ja tego dalej nie trawie, ale może @_13th_Dragon pomoże, jeżeli wie o co Ci chodzi. Zaś od siebie dodam, że będziemy musieli stać się z @furious programming tak złośliwi i niedostowujący się do zasad jak często piszący tutaj.

Czy to aż taki problem wstawić kod w pierwszym postcie w odpowiednie znaczniki code? A do tego Twój kod był kompletnie nieczytelny. Nawet w znacznikach. Przeformatowałem go i teraz można na niego spojrzeć. Nauczcie się ludzie. KOD FORMATUJEMY!!! Jeżeli nie umiecie tego zrobić sami, to są odpowiednie narzędzia, ktore to zrobią za Was. Więcej info w google. Chyba po prostu zamiast upominać o powyższe rzeczy, będziemy nagradzać takie wątki przeniesieniem do Kosza, to być może do Was wtedy coś dotrze :/

0

@up
Wybacz, jestem słuchowcem i nie zwracam uwagi na wygląd kodu, zapomina mi się, że większość ludzi to wzrokowcy ;/ Następnym razem przeformatuję...

@UP2

Chyba mnie nie do końca zrozumiałeś ;/ Ty zrobiłeś program, który... który... nawet nie wiem co robi O_o.

Nie wiem po co ta "niepotrzebna liczba" skoro ona jest PIEKIELNIE potrzebna i to właśnie przez nią założyłem ten temat...

Jeszcze raz:

Na samym początku wpisujemy 1 liczbę (dowolną) która oznacza ilość literek jakie będziemy wpisywać w późniejszym czasie.

Przykładowo wpisujemy "3"

Następnie w tabeli powinniśmy wypisać 3 literki i tu typ CHAR jest chyba wymagany bo nie wiem jak inaczej komputerowi pokazać co jest dużą literą a co małą.

wypisujemy dla przykładu:

aAb

W ASCII by z małej literki zrobić dużą trzeba odjąć 32.
Program odejmuje od a (w ASCII [97]) 32 co dzięki ASCII daje nam 65 (duża litera A)
Następnie program porównuje nam nasze małe "a"(które stało się duże) z innymi literkami w tabeli czyli z A i z b.

Program "widzi" że w tabeli widnieje MAŁE a i DUŻE A Dlatego nasz wynik staje się 1

Teraz podam kilka wejść i wyjść bo 50% programistów woli tak się dowiadywać co program ma robić:


WEJŚCIE
5
aaAAA

WYJŚCIE
6

WEJŚCIE
8
abcdeFgi (klawiatura nie działa)

WYJŚCIE
0


WEJŚCIE
4
aBbA

WYJŚCIE
2


WEJŚCIE
7
BbbbAaa

WYJŚCIE
5

Mam nadzieję, że bardziej zrozumiałe ;/

0

Z tego co opisałeś wynika że przerabiamy pierwszą literę na dużą i zliczamy ile razy ta duża występuje w pozostałej części ciągu, z tym że przykłady tego nie potwierdzają.
Ba w przykładach zupełnie nić się nie zgadza, podajesz 8 a dalej masz 7 liter WTF?

0

http://zadania.oig.edu.pl/OIG/stored_files/pdfPreview/10856684

Proszę, tu jest wszystko opisane.
Wiem, że to jest konkurs, ale nie chcę by któryś z Panów programistów mi pisał program, chcę byście wytłumaczyli mi jak to mniej więcej zrobić i dlaczego mój kod nie działa :D
(nie lubię oszukiwać)

0

Nie widzę tego muszę się zarejestrować, a nie mogę się zarejestrować bo już nie jestem licealista.

0

Proszę, tu jest wszystko opisane.

To jeszcze podaj login i hasło, bo pewni mało kto z użytkowników ma tam konta utworzone :D

Wiem, że to jest konkurs, ale nie chcę by któryś z Panów programistów mi pisał program, chcę byście wytłumaczyli mi jak to mniej więcej zrobić i dlaczego mój kod nie działa

Przekopiuj treść zadania z tamtego serwisu do posta, a w końcu może i będzie wiadomo co trzeba zrobić; Twoje opisy są do niczego, bo zamiast powoli i spokojnie napisać co ma program wykonywać, piszesz jakieś dziwne przykłady, a przecież nie o to chodzi; Więc wklej tutaj treść zadania;

A odpowiadając na Twoje pytanie z tytułu wątku: "Da się zrobić tabelę ze zmienną char...?" - nie wiem, bo tego zdania nie rozumiem... o.O

0

@up
Czytam ci w myślach :P

Szlak xD zapomniałem....

Babcia opowiada Jasiowi bajkę. Malec słucha, aż się mu uszy trzęsą, ale ma dziwne wraże-
nie, że opowieść nie do końca układa się w logiczną całość. Uznajemy zdanie za
sprzeczne
,
jeśli wcześniej w bajce pojawiło się zdanie o przeciwnym znaczeniu. Powiedz, ile
sprzecznych
zdań wypowiedziała babci

W pierwszym wierszu standardowego wejścia zapisano liczbę
N
, oznaczającą liczbę zdań
w opowieści. W drugim wierszu pojawi się opowieść, przedstawiona jako ciąg małych i/lub wielkich liter
alfabetu angielskiego. Każda litera reprezentuje jedno zdanie. Przeciwne znaczenia mają zdania oznaczone
tą samą literą, ale o różnej wielkości.

Na standardowe wyjście wypisz jedną liczbę — liczbę
sprzecznych
zdań w bajce, to znaczy takich, dla których
wcześniej w opowieści pojawiło się zdanie o przeciwnym znaczeniu

I potem macie pare przykładów (u góry są dobre)

1
var ch:Char;
var N,i,Count:Integer;
var Up,Dn:array[0..25] of Integer;
begin
  ReadLn(N);
  for i:=1 to N do
  begin
    Read(ch);
    if ch<'a' then Inc(Up[Ord(ch)-Ord('A')]) else Inc(Dn[Ord(ch)-Ord('a')]);
  end;
  Count:=0;
  for i:=0 to 25 do Inc(Count,Up[i]*Dn[i]);
  write(Count);
  readkey;
end.
0

Twój program ma ten sam problem co mój :)
A dokładnie wyjście poza tabelę
http://scr.hu/1u46/uonca
http://scr.hu/1u46/21qwk
http://scr.hu/1u46/s0f0o

W tym samym momencie czyli kiedy chcę do tabeli wpisać literkę (nie mogę wpisać liczby[bo zadanie zabrania])

0

Rozwiązanie, które podal @_13th_Dragon działa idealnie i zwraca to co podałeś jako przykłady. A nie wiem o jakie cyferki chodzi, ponieważ sam podałeś w treści zadania, że zestawem znaków mają być tylko małe/wielkie litery.

0

Myślałem, że te literki mają być wpisywane pojedynczo, po enterku ale ok...
Pan @_13th_Dragon rozpykał to inaczej niż ja, w swojej głowie, zrobił to hmmm w 80% dobrze xD
Gdyż 3 przykład moich kochanych organizatorów to

Wejście
15
aAaAbaABBabbBbB

Wyjście
13

Program pana Dragona na wyjściu ma 28...

Całe zadanie... Dlaczego ja nie myślę dokładniej...

http://scr.hu/1u46/fiv55

0

To powiedz jeszcze raz co ma się pojawić w tym przykładzie co podałeś wcześniej ?

WEJŚCIE          
5                                  
aaAAA

WYJŚCIE
6
0

Pod moim ostatnim postem masz treść całego zadania (ss) A te przykłady wymyśliłem, z mojej chorej logiki w ogóle nie mam pojęcia jak się w mojej głowie znalazły nie musisz się nimi kierować...

0

To zadanie jeszcze prostsze (bo nawet żadnej tablicy nie potrzebuje), jeżeli nawet po tym nie dajesz sobie rady to z całą pewnością powinieneś sobie darować tą olimpiadę i pomyśleć może o dziennikarstwie.

0

Wiesz... mnie dosłownie NIKT NIGDY nie uczył programowania, uczyłem się z takich o forów i innych cośków. Ale skoro jest takie proste to dlaczego nie wytłumaczysz o co chodzi :D ? Z resztą dałbym sobie z nim radę bo jak widzisz w temacie chodziło mi tylko o jedną małą rzecz, a dokładnie jak zrobić by zmienna a[x] (tablica) bez problemów łykała LITERKI jako cyfry. (Nie zagłębiamy się bo i tak nie wytłumaczę, trudno się tłumaczy PISZĄC )

0

Z resztą dałbym sobie z nim radę bo jak widzisz w temacie chodziło mi tylko o jedną małą rzecz, a dokładnie jak zrobić by zmienna a[x] (tabela) bez problemów łykała LITERKI jako cyfry.

Nie tabela a tablica (lub macierz), bo tabele to są w SQL;

Jeśli tablica przechowuje pojedyncze znaki, to wystarczy bazować się na kodzie ASCII aktualnie maltretowanego znaku i odpowiednio go zwiększyć lub zmniejszyć, w zależności od potrzeb.

0

Oczywiście nie widzisz tego z mojego kodu?

Dn[Ord(ch)-Ord('a')]

Tak a propos mnie też nikt specjalnie nie uczył, paskala nauczyłem się w niecałe dwa tygodnia, po miesiącu nauki już byłem zapraszany jako wykładowca do Borland Support Center Polska

0

@up
A kto cię uczył innych języków i jakich ? No i oczywiście ile lat siedzisz w Informatyce/Programistyce bo widzę, że zarejestrowany jesteś od 2005, ja w tym roku umiałem na kompie jedynie w Crusadersy grać i robić mapki na silniku jakiejś innej gry...

@up2

Tak ale wprowadzający MUSI wpisać kod ASCII zgadza się ? Mi chodzi o to by Komputer sam sobie ZNAK tłumaczył na kod, a nie, że wprowadzający musi szukać :)

Zresztą tyle to sam się domyśliłem, cały czas mi chodzi JAK do tablicy (dla mnie jeden pies) wprowadzić LITERKĘ "a" po czym program ją sobie przetłumaczy na 97 i będę mógł z nią robić co zechcę (zmniejszać zwiększać porównywać)

Tutaj fragmenty kodu z wytłumaczeniem jak to MIAŁO działać w teorii:

uses
  Crt;        {nie trzeba tłumaczyć}
 
var
  a : array[1..1000] of char;
  q : char;                                {deklaracja zmiennych a czyli LITERKĘ w tablicy, q czyli POMOCNICZA literka potrzebna do porównywania i b,x,z,y czyli pomocnicze zmienne przydatne do pętli}
  b, x, z, y, wyjscie : word;
 
begin
  clrscr;   
  read(b);  {wpisujemy ile ZNAKÓW chcemy w tablicy}
  for x := 1 to b do   {program zaczyna robić pętelkę}
    read(a[x]);            {,a użytkownik wpisuje ZNAKI jakie tam sobie wymyśli czyli małe albo duże literki}  {Program przestaje działać na tym etapie} 
  for x := 1 to b do      { Program zaczyna zapętlać się b razy}
  begin                           {rozpoczynając:}
    q := a[x];                    { pomocnicza literka staje się pierwszą literką z naszej tablicy np.: "A"}
    for y := 1 to 32 do        {znów krążymy ale tylko 32 razy}
      Inc(q);                         { po to aby nasze q w kodzie ASCII zostało zwiększone o 32, a jak wiemy każda duża literka zwiększona w kodzie ASCII o 32 staje się tą samą ale małą literką}
    for z := 1 to b do             
      if a[z] = q then            {program porównuje każdą literkę w tablicy, ze zmienną pomocniczą czyli q, które w tym przypadku wynosi "A" jeśli są równe}
        wyjscie := wyjscie + 1;   {do wyjścia zostaje dodana liczba 1}
  end;
  for x := 1 to b do            {tutaj dzieje się to samo tylko że nasza literka zostaje ZMNIEJSZONA o 32, a każda MAŁA literka w kodzie ASCII zmniejszona o 32 staje się literką DUŻĄ}
  begin
    q := a[x];
    for y := 1 to 32 do
      Dec(q);
    for z := 1 to b do
      if a[z] = q then           {Porównanie, jeśli są takie same do wyniku zostaje dodany 1}
        wyjscie := wyjscie + 1;            
  end;    {Krąży to tak długo, aż wszystkie literki zostaną ze sobą porównane}
  clrscr; 
  write(wyjscie);     
  delay(5000);
end.

Boże jeszcze mniej czytelny O_o

2

To zadanie nie potrzebuje żadnej tablicy.
To zadanie nie potrzebuje konwersji literki na kod ASCII masz w przykładach jak to skonwertować.

0

Nie mogłeś tak od razu T_T ?

<temat można zamknąć>

1
for y := 1 to 32 do  {znów krążymy ale tylko 32 razy}
  Inc(q);            { po to aby nasze q w kodzie ASCII zostało zwiększone o 32, a jak wiemy każda duża literka zwiększona w kodzie ASCII o 32 staje się tą samą ale małą literką}

A czy Ty wiesz, że procedura Inc ma także opcjonalny drugi argument, określający rozmiar inkrementacji? Wystarczy po przecinku go podać, zamiast tracić czas pętlą:

Inc(q, 32);

To samo dotyczy procedury Dec, tyle że z rozmiarem dekrementacji;

<temat można zamknąć>

Sam go musisz zamknąć - rozdaj plusiki wszystkim pomocnym postom i wybierz jeden, który rozwiązał Twój problem i oznacz go jako rozwiązanie (zaznacz fajeczkę pod ilością ocen), a dzięki temu zamkniesz wątek.

0

Nie mogę go zamknąć skoro rozpocząłem go jako anonim :D

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