View Full Version : Pascal - caratteri
DarkSiDE
07-01-2004, 15:23
Esiste un metodo ortodosso per risolvere questo problema senza troppi casini?
In un pianeta di extra terrestri le informazioni numeriche sono rappresentate con 8 caratteri: #, ?, !, ), (, /, ], [ corrispondenti alle cifre 0, 1, 2, 3, 4, 5, 6, 7. Inserite da tastiera ad una ad una le cifre del numero extra-terrestre, produrre su una sola riga la rappresentazione terrestre del numero
leadergl
07-01-2004, 19:55
io credo che tu debba fare semplicemente 8 IF (1 per ogni carattere da convertire):
es:
readln(carattere);
if carattere='#' then numero=1;
....
write(numero,' ');
e così via....
DarkSiDE
07-01-2004, 21:07
Originariamente inviato da leadergl
io credo che tu debba fare semplicemente 8 IF (1 per ogni carattere da convertire):
es:
readln(carattere);
if carattere='#' then numero=1;
....
write(numero,' ');
e così via....
così c'ero anche io, a questo punto sarebbe preferibile utilizzare la struttura case, credevo ci fosse qualcosa di più "coinciso"
leadergl
07-01-2004, 22:25
altrimenti devi cercare qualche corrispondeza con le tabelle ASCII tra quei caratteri ed i numeri...del tipo se nella tabella quei caratteri sono consecutivi ti fai restituire il loro valore decimale e gli sottrai una determinata costante per avere numeri da 1 ad 8......!!!!!!
Altrimenti poi diventerebbe tutto più "complicato" tipo ti crei una stringa con quei caratteri e poi cerchi la posizione, da 1 ad 8, di dove si trova il carattere digitato dall'utente........ma è moooolto più semplice con le altre strade!
Altrimenti non saprei
Ti fai un vettore di 256 caratteri in corrispondenza del codice ASCII dei caratteri #, ?, !, ), (, /, ], [ scrivi i numeri da 0 a 7...negli altri metti uno spazio... Dopo basta indicizzare il vettore con i vari codici ASCII de caratteri digitati ed ottieni i caratteri da concatenere alla stringa che deve stampare il risultato (attenzione che chiede il risultato su una sola linea)...
leadergl
08-01-2004, 10:21
quello che volevo dire io, però credo che sia inutile un vettore da 256 ne basta uno da 8!! Un posto per ognuno dei caratteri che deve cercare, così quando fa la ricerca nel vettore gli tira subito fuori il numero che gli serve!!!
(prima avevo scritto stringa....ma siamo li visto che IN PASCAL le stringhe sono Vettori di caratteri)
Originariamente inviato da leadergl
quello che volevo dire io, però credo che sia inutile un vettore da 256 ne basta uno da 8!! Un posto per ognuno dei caratteri che deve cercare, così quando fa la ricerca nel vettore gli tira subito fuori il numero che gli serve!!!
No, altrimenti gli ci vuole comnunque uno switch !!! A quel punto si usa lo switch e basta...
256 byte non è un grande costo ;)
leadergl
08-01-2004, 10:40
...scusa ma cos'è sto SWITCH???
nn può fare cosi:
VAR
vettore:ARRAY[1..8] of char;
carattere:char;
somma:integer;
Procedure AssegnaVettore:
BEGIN
vettore[1]='#';
vettore[1]='?';
vettore[1]='!';
vettore[1]=')';
vettore[1]='(';
vettore[1]='/';
vettore[1]=']';
vettore[1]='[';
{così ha assegnato i caratteri al vettore}
end;
Procedure cerca(caracter:char);
Var indice:integer;
begin
For i:=1 to 8 do
if caracter=vettore[i] then somma:=somma+i;
end;
{MAIN}
Begin
somma:=0;
AssegnaVettore;
write('Inserire il carattere da cercare: ');
readln(carattere);
cerca(carattere);
writeln;
End.
vabbè è arronzato ma va uguale!!! non credi?!?
Scusa, 1Kb ;)
Scusa, switch è in C...Case in Pascal...
Io intendevo così:
program corrisp;
var
Vett: array[0..255] of Integer;
i: Integer;
carattere: Char;
begin
for i := 0 to 255 do
Vett[i] := -1;
Vett[Ord('#')] = 0;
Vett[Ord('?')] = 1;
Vett[Ord('!')] = 2;
Vett[Ord(')')] = 3;
Vett[Ord('(')] = 4;
Vett[Ord('/')] = 5;
Vett[Ord(']')] = 6;
Vett[Ord('[')] = 7;
Read(carattere);
Write(Vett[Ord(carattere)]);
end.
Originariamente inviato da leadergl
vabbè è arronzato ma va uguale!!! non credi?!?
Va, va...credevo che lo volessi fare in un altro modo...
leadergl
08-01-2004, 10:46
si ma non capisco perchè fargli scorrere un vettore da 256 posizioni quando quelle che a lui interessano sono 8!! tutto qui!
Il fatto è che il vettore non lo scorre affatto... Perchè il risultato lo raggiunge direttamente...
leadergl
08-01-2004, 10:49
....si ma la ord di quei caratteri li, va da 33 a salire........quindi si deve scorrere le prime 33 e più posizioni prima di arrivare al risultato, senza contare che se l'utente sbagli carattere ed invece di scrivere / scrive K lui ti da cmq una risposta....e da quel che ho capito non dovrebbe.......mentre con un vettore da 8, se c'è risposta la trova nei primi 8 passaggi (massimo)......:)
leadergl
08-01-2004, 10:51
ah no scusa.....per lo scorrimento hai ragione tu.......
però dovresti mettere dei controlli sui caratteri inseriti, xkè a lui servono solo quegli 8 li!!
nn avevo notato il Write(vettore[ord(carattere)])
Allora te lo modifico...
program corrisp;
var
Vett: array[0..255] of Integer;
i: Integer;
carattere: Char;
begin
for i := 0 to 255 do
Vett[i] := -1;
Vett[Ord('#')] = 0;
Vett[Ord('?')] = 1;
Vett[Ord('!')] = 2;
Vett[Ord(')')] = 3;
Vett[Ord('(')] = 4;
Vett[Ord('/')] = 5;
Vett[Ord(']')] = 6;
Vett[Ord('[')] = 7;
Read(carattere);
if Vett[Ord(carattere)] >= 0 then
Write(Vett[Ord(carattere)]);
end.
leadergl
08-01-2004, 10:57
beh speriamo che DarkSide si contento dell'aiuto....:D
Il prgoramma finito:
program corrisp;
var
Vett: array[0..255] of Integer;
i: Integer;
carattere: Char;
risultato: String;
begin
stringa := '';
for i := 0 to 255 do
Vett[i] := -1;
Vett[Ord('#')] = 0;
Vett[Ord('?')] = 1;
Vett[Ord('!')] = 2;
Vett[Ord(')')] = 3;
Vett[Ord('(')] = 4;
Vett[Ord('/')] = 5;
Vett[Ord(']')] = 6;
Vett[Ord('[')] = 7;
repeat
read(carattere);
if Vett[Ord(carattere)] >= 0 then
stringa := concat(string, carattere);
until Vett[Ord(carattere)] >= 0;
writeln;
writeln(stringa);
end.
PS: sono un po' arrugginito in Pascal...
DarkSiDE
08-01-2004, 11:02
scartando la corrispondenza con gli ascii, alla quale avevo già pensato ma se fate caso ai carattere che mi interessano vi rendete conto che nn è fattibbile
io avevo pensato qualcosa di simile al vettore, ma ancora più semplice
type extra = (#, ?, !, ), (, /, ], [);
var alieni:extra;
in questo modo ord(#) dovrebbe restituirmi 1, il problema che quegli ascii nn vengono presi..
grazie ad entrambi
cionci...quel programmillo è "geniale" ;)
type extra = ('#', '?', '!', ')', '(', '/', ']', '[');
Mi sa che è il tuo modo geniale ;)
DarkSiDE
08-01-2004, 11:06
Originariamente inviato da leadergl
beh speriamo che DarkSide si contento dell'aiuto....:D
me coj***...meglio di così :D
DarkSiDE
08-01-2004, 11:09
Originariamente inviato da cionci
type extra = ('#', '?', '!', ')', '(', '/', ']', '[');
Mi sa che è il tuo modo geniale ;)
mi duole correggerLA ma nn si mettono apici per definire costanti nelle var enumerative, in ogni modo dà errore :)
Come dicevo è da una vita che non programmo in Pascal...
DarkSiDE
08-01-2004, 11:13
Originariamente inviato da cionci
PS: sono un po' arrugginito in Pascal...
program corrisp;
var
Vett: array[0..255] of Integer;
i: Integer;
carattere: Char;
risultato,stringa: String;
begin
writeln('Inserisci Una stringa');
stringa := ' ';
for i := 0 to 255 do
Vett[i] := -1;
Vett[Ord('#')] := 0;
Vett[Ord('?')] := 1;
Vett[Ord('!')] := 2;
Vett[Ord(')')] := 3;
Vett[Ord('(')] := 4;
Vett[Ord('/')] := 5;
Vett[Ord(']')] := 6;
Vett[Ord('[')] := 7;
repeat
read(carattere);
if Vett[Ord(carattere)] >= 0 then
stringa := concat(stringa, carattere);
until Vett[Ord(carattere)] >= 0;
writeln;
writeln(stringa);
end.
assegnazione :=
"stringa" nn l'avevi definita
trq sei perdonato..ghgh :D :)
Eh già non puoi usare quei caratteri...in particolar modo la )...
Idea !!!
E se sostituisci ai caratteri il corrispettivo nuemero ASCII ?
Ora non so i numeri..li sparo a caso...
type extra = (24, 34, 33, 56, 76, 32, 54, 55);
Originariamente inviato da DarkSiDE
assegnazione :=
"stringa" nn l'avevi definita
trq sei perdonato..ghgh :D :)
Allora togli risultato ;)
DarkSiDE
08-01-2004, 11:27
errammo entrambi..
program corrisp;
uses wincrt;
var
Vett: array[0..255] of Integer;
i: Integer;
carattere: Char;
risultato,stringa: String;
begin
writeln('Inserisci una stringa aliena');
stringa := ' ';
for i := 0 to 255 do
Vett[i] := -1;
Vett[Ord('#')] := 0;
Vett[Ord('?')] := 1;
Vett[Ord('!')] := 2;
Vett[Ord(')')] := 3;
Vett[Ord('(')] := 4;
Vett[Ord('/')] := 5;
Vett[Ord(']')] := 6;
Vett[Ord('[')] := 7;
repeat
read(carattere);
write(Vett[Ord(carattere)]);
until Vett[Ord(carattere)] > 7;
writeln;
writeln(stringa);
end.
la stringa che contiene il risultato può essere omessa, continuando a stampare sulla stessa riga, inoltre il repeat cicla fino a quando la condizione è falsa
Vabbè...se stampi sulla stessa riga in cui leggi non è bello ;)
E riguardo a questo ?
type extra = (24, 34, 33, 56, 76, 32, 54, 55);
leadergl
08-01-2004, 11:35
Potreste fare così.....ma nn credo che se fai ord di uno d quei caratteri ti da 1..8
type
Letters = set of 'A'..'Z';
const
Insieme: Letters = ['#', '?', '!', ')', '(', '/',']','['];
DarkSiDE
08-01-2004, 11:35
problemino, mi stampa una stringa giusta e mi aggiunge due volte "-1" :confused:
DarkSiDE
08-01-2004, 11:38
Originariamente inviato da cionci
Vabbè...se stampi sulla stessa riga in cui leggi non è bello ;)
E riguardo a questo ?
type extra = (24, 34, 33, 56, 76, 32, 54, 55);
uan moment :)
DarkSiDE
08-01-2004, 11:39
Originariamente inviato da DarkSiDE
problemino, mi stampa una stringa giusta e mi aggiunge due volte "-1" :confused:
ho aggiungo questo controllo per ovviare ma non ne capisco il motivo..
if (Vett[Ord(carattere)] <> -1) then write(Vett[Ord(carattere)]);
leadergl
08-01-2004, 11:58
il problema era nel READ(carattere) che deve essere un readln e in un altra piccola cosuccia...cmq ecco il codice corretto:
program corrisp;
uses crt;
var
Vett: array[0..255] of Integer;
i: Integer;
carattere: Char;
begin
clrscr;
for i := 0 to 255 do Vett[i]:=-1;
Vett[Ord('#')]:=0;
Vett[Ord('?')]:=1;
Vett[Ord('!')]:=2;
Vett[Ord(')')]:=3;
Vett[Ord('(')]:=4;
Vett[Ord('/')]:=5;
Vett[Ord(']')]:=6;
Vett[Ord('[')]:=7;
repeat
write('Inserisci una stringa aliena: ');
readln(carattere);
writeln(Vett[Ord(carattere)]);
writeln;
until Vett[Ord(carattere)]=-1;
end.
ho eliminato risultato e stringa visto che non li usavate
DarkSiDE
08-01-2004, 12:15
grazie mille a entrambi ;)
leadergl
08-01-2004, 12:18
di niente :) ;)
DarkSiDE
09-01-2004, 11:09
type extra = (35,63,33,41,40,47,93,91);
identifier expected.. !??!
leadergl
09-01-2004, 12:07
non puoi dichiararlo così come TYPE.....al massimo puoi fare;
Program esempio;
Uses CRT;
Const
Insieme=[35,63,33,41,40,47,93,91];
Type
.....
Var
.....
Begin
End.
DarkSiDE
09-01-2004, 13:54
Originariamente inviato da leadergl
non puoi dichiararlo così come TYPE.....al massimo puoi fare;
Program esempio;
Uses CRT;
Const
Insieme=[35,63,33,41,40,47,93,91];
Type
.....
Var
.....
Begin
End.
ma così è possibile ricavarne l'ordinale?
leadergl
09-01-2004, 15:46
sinceramente non saprei.....ma credo di no :p
DarkSiDE
12-01-2004, 17:02
{ Esercitazione 3 - 6. Dato un numero in input, scrivere la parola ottenuta
sostituendo ad ogni cifra la lettera corrispondente
(es- 1365 = ACFE) }
program esercizio7;
uses wincrt;
var parametro, lettere: string;
procedure converti(parametro:string);
var risultato:string;
temp,count,i:integer;
simbolo:char;
begin
lettere:='abcdefghilmnopqrstuvz';
count:=length(parametro);
for i:=1 to count do
begin
simbolo:=parametro[i];
temp:=ord(simbolo)-ord('0');
write(lettere[temp]);
end;
end;
begin
writeln('Inserisci il codice da tradurre (Es. 1365 = ACFE)');
readln(parametro); converti(parametro);
end.
che ve ne sembra della risoluzione?
leadergl
12-01-2004, 17:11
si ma così non potrai mai avere tutte le lettere!!!!
ad esempio la N ?!? che numero ci vuole per rappresentarla?
DarkSiDE
12-01-2004, 17:19
Originariamente inviato da leadergl
si ma così non potrai mai avere tutte le lettere!!!!
ad esempio la N ?!? che numero ci vuole per rappresentarla?
la traccia parla chiaro ;)
le lettere da a ad i, ovvero da 0 a 9, ho impropriomente messo anche le altre lettere, effettivamente
:)
leadergl
12-01-2004, 17:28
poi...invece di creare quel casino potevi usare la funzione CHR che praticamente inserito un numero ti restituisce il corrispondente in stringa.....l'inverso di ORD per capirci !!!!
Quindi sapendo che A=65 potevi fare:
TuaLettera:=CHR(TuoNumero+64);
ovviamente anche così avresti escluso tutte le lettere dalla L=10 alla Z.......senza contare che non prenderesti in considerazione le minuscole.....in quando a=97 !!!!
rimanendo nel tuo esempio, avresti potuto fare:
count:=length(parametro);
for i:=1 to count do
begin
val(parametro[i],simbolo,temp);
write( CHR(simbolo+64))
end;
ovviamente ci sono piccole correzioni al codice ma credo che così sia più bello!!
Cmq va bene anche il tuo, solo che come ti ho detto dalla I in poi è tutto escluso
leadergl
12-01-2004, 17:29
questo è il codice leggermente modificato
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.