PDA

View Full Version : [PASCAL] Help risoluzione matrice di stringhe


Qwertid
04-07-2005, 16:33
Ciao a tutti! :)

Chi può darmi una mano ad impostare un algoritmo risolutivo per questo programma? E' davvero importante per me :) Grazie a chi vorrà aiutarmi :D

http://ipsedixit.altervista.org/Ex2.jpg

motogpdesmo16
04-07-2005, 16:58
quello che dovresti fare è un ordinamento per valori ascendenti. Se non vado errato, sfruttando l'algoritmo che ti posterò, i valori null dovrebbero essere messi alla fine.
allora:
i=For 1-->m(num.righe)
j=for 1-->n(num.colonne)
r=for 1-->m
c=for 1-->n
if M[r,c]>M[i,j] then
aux=M[r,c]
M[r,c]=M[i,j]
M[i,j]=aux
e poi chiudi tutti i for.

Qwertid
04-07-2005, 19:22
Ma nel mio caso io non posso confrontare perchè sono stringhe di caratteri....

71104
04-07-2005, 20:12
che c'entra, anche i caratteri si possono confrontare: in base al loro codice ASCII.

Qwertid
04-07-2005, 21:01
Ha senso confrontare "mela" con un " " (che sarebbe un blank)? E quando arriva a confrontare ad esempio "mela" con "tre" se mi fa lo scambio mi fa saltare l'ordine alfabetico..

71104
04-07-2005, 21:13
Ha senso confrontare "mela" con un " " (che sarebbe un blank)? E quando arriva a confrontare ad esempio "mela" con "tre" se mi fa lo scambio mi fa saltare l'ordine alfabetico.. si, confrontare "mela" con uno spazio in base ai codici ASCII ha senso: lo spazio viene prima. la storia del "tre" poi non l'ho capita... :mbe:

Qwertid
04-07-2005, 21:22
Secondo la traccia devo fare scalare le parole e lasciare gli spazi alla fine. Se confronto mela con tre come lettere mela è 4 e tre è 3 appunto. Adesso confrontandole mela risulta maggiore di tre? E quindi mi fa lo scambio? E quindi viene a mancare l'ordine alfabetico. O no?

gokan
04-07-2005, 21:45
L'operatore < in pascal, usato per le stringhe si riferisce all'ordinamento lessicografico. Quindi
mela < tre
Restituisce TRUE

71104
05-07-2005, 00:22
Secondo la traccia devo fare scalare le parole e lasciare gli spazi alla fine. Se confronto mela con tre come lettere mela è 4 e tre è 3 appunto. Adesso confrontandole mela risulta maggiore di tre? E quindi mi fa lo scambio? E quindi viene a mancare l'ordine alfabetico. O no? scusa, perché mai "mela" dovrebbe venire dopo "tre"? la "m" viene prima della "t" (almeno quando sono entrambe minuscole o entrambe maiuscole; l'unica accortezza che devi avere è (se vuoi) quella di convertire tutto in lower o upper case prima del confronto).

Qwertid
05-07-2005, 13:02
Ciao ragazzi! :D

Stamattina ho fatto il programma con il procedimento che gentilmente motogpdesmo16 mi ha postato e voi mi avete illustrato.. Ebbene il risultato è che le stringhe bianche me le mette all'inizio invece che alla fine.. Poi per il resto è ok.. Come posso risolvere? Grazie :)

gokan
05-07-2005, 13:12
probabilmente il simbolo blank risulta minore di qualsiasi lettera dell'alfabeto..in maniera non pulitissima puoi risolvere il problema mettendo un altro if che controlli che non appena trova il blank lo imponi come una stringa del tipo "zzzzzzzzzz" (insomma, basta che fa in modo che il controllo stringa con blank risulti a favore di stringa)....

Qwertid
05-07-2005, 13:20
probabilmente il simbolo blank risulta minore di qualsiasi lettera dell'alfabeto..in maniera non pulitissima puoi risolvere il problema mettendo un altro if che controlli che non appena trova il blank lo imponi come una stringa del tipo "zzzzzzzzzz" (insomma, basta che fa in modo che il controllo stringa con blank risulti a favore di stringa)....

Si ho fatto un watch della cosa ed è proprio come dici tu... Il confronto stringa bianca con parola è sempre false... Ora vedo di trovare dove mettere un controllo per la stringa bianca.. Grazie! :) ;)

Qwertid
05-07-2005, 13:22
Mettendo il controllo funziona!!! Però nel risultato al posto del blank mi esce la stringa "ZZZ" :D Significa che ne devo mettere un altro all'uscita? E dove in particolare? Dovunque la metta mi sballa tutto :eek:

gokan
05-07-2005, 13:32
Mettendo il controllo funziona!!! Però nel risultato al posto del blank mi esce la stringa "ZZZ" :D Significa che ne devo mettere un altro all'uscita? E dove in particolare? Dovunque la metta mi sballa tutto :eek:
Eventualmente riconverti...vedi se puoi trovare comunque un metodo migliore, la mia è stata la prima cosa venuta in mente...non mi ricordo perfettamente tutte le funzioni della libreria per gestire le stringhe..magari usando qualche funzione particolare ci arrivi prima :)

repla
05-07-2005, 13:42
@Qwertid

esame di programmazione mod A.
prof. Burattini
Appello del 29 giugno

Ho indovinato?

Qwertid
05-07-2005, 13:43
:D :D :D Centro!

Voglio capire questo tipo di esercizi come si fanno.. Anche tu hai partecipato a quell'appello?

repla
05-07-2005, 13:45
:D :D :D Centro!

Voglio capire questo tipo di esercizi come si fanno.. Anche tu hai partecipato a quell'appello?

si ma me ne sono andato perchè il giorno dopo avevo l'orale di Analisi.
Cmq rispetto all'appello di Febbraio-Marzo gli esercizi erano molto + difficili.
Nella stanza con quali prof. stavi?

Qwertid
05-07-2005, 13:47
Stavo con Serino.. Il più umano forse e il più preparato sicuramente.. :) Anche se è lui che prepara gli esercizi

repla
05-07-2005, 13:50
Stavo con Serino.. Il più umano forse.. :) Anche se è lui che prepara gli esercizi

Anche io stavo con Serino.

Sono quello che se ne andato verso le 3-3.15.
e che è stato chiamato indietro perchè volevano la traccia indietro.
Tu dove eri seduto?
Cmq sono usciti i risultati?l'hai passato?

Ciao

Qwertid
05-07-2005, 13:52
Anche io stavo con Serino.

Sono quello che se ne andato verso le 3-3.15.
e che è stato chiamato indietro perchè volevano la traccia indietro.
Tu dove eri seduto?
Cmq sono usciti i risultati?l'hai passato?

Ciao

Ah si si mi ricordo di questo fatto! Io ero seduto in 4-5 fila sul lato sinistro nella parte più vicino al muro. Si passato.. Domani siamo tra mod. A e mod. B 85 persone a dover fare l'esame orale... Si farà notte :) Ciao! :D

repla
05-07-2005, 13:56
Ah si si mi ricordo di questo fatto! Io ero seduto in 4-5 fila sul lato sinistro nella parte più vicino al muro. Si passato.. Domani siamo tra mod. A e mod. B 85 persone a dover fare l'esame orale... Si farà notte :) Ciao! :D

a detta di coloro che già l'hanno fatto, passato lo scritto l'orale non è niente di che....
Preparati gli esercizi e gli eventuali errori che hai fatto + gli algoritmi di ordinamento.

Io spero di passarlo nell'appello del 19 luglio....

Ciao

leadergl
05-07-2005, 14:02
@Qwertid

esame di programmazione mod A.
prof. Burattini
Appello del 29 giugno

Ho indovinato?


c'ero anche io a quell'esame...con Burattini..ma nel mio compito non c'era quest'esercizio.

vi posso chiedere una cosa?

1) ma gli orali stavano oggi?
2) ma il progetto di laboratorio entro quando andava consegnato?

repla
05-07-2005, 14:03
c'ero anche io a quell'esame...con Burattini..ma nel mio compito non c'era quest'esercizio.

vi posso chiedere una cosa?

1) ma gli orali stavano oggi?
2) ma il progetto di laboratorio entro quando andava consegnato?

il progeto riguarda il mod.B gli orali del mod.A stanno il 6 quindi domani.

Ciao

gokan
05-07-2005, 14:06
Ragazzi, il forum non è una chat
Rischiate di farvi chiudere il tread :)

repla
05-07-2005, 14:08
Ragazzi, il forum non è una chat
Rischiate di farvi chiudere il tread :)

questo è vero.
cmq io ora stacco e continuo a studiare.
Ci sentiamo

CIao a tutti

leadergl
05-07-2005, 14:08
il progeto riguarda il mod.B gli orali del mod.A stanno il 6 quindi domani.

Ciao


eh...io il MOD B devo fare...non sai entro quando andava consegnato...xkè io ero andato a tentare lo scritto del MOD B x vedere d che si trattava, quindi nn avevo fatto il progetto, poi ho visto che gli esercizi erano semplici...e l'ho un po preso a quel posto...xkè senza progetto....

solo che i risultati uscivano, mi pare, e mi chiedevo se ero in tempo a presentare il progetto k ho fatto in 3 giorni in pratica....

cmq confermo che passato lo scritto l'orale è una cretinata vi chiedono un algoritmo di ordinamento a piacere, magari nn il bubble sort, e le cose che avete sbagliato allo scritto.

poi complessita di tempo e spazio...tutto qui...




--------- edit ----------
riguardo l'argomento del thread...l'esercizio iniziale io avrei cercato di evitare i 4 cicli FOR....i prof spesso ci tengono ad evitare sprechi...e con 4 FOR la complessità di tempo aumenta nn poco...

avrei puntato sui classici 2 FOR per scorrere la matrice, anche perchè non c'è nulla da ordinare visto che è già ordinato, e tenermi traccia con variabili aggiuntive di dove si trovano le celle vuote....e scambiare queste con quelle piene successive....

motogpdesmo16
05-07-2005, 14:20
Mettendo il controllo funziona!!! Però nel risultato al posto del blank mi esce la stringa "ZZZ" :D Significa che ne devo mettere un altro all'uscita? E dove in particolare? Dovunque la metta mi sballa tutto :eek:
magari non è molto elegante ma ora non mi viene in mente niente. Prima sostituisci i blank con "zzz" e poi, al termine dell'ordinamento effettui la sostituzione contraria: "zzz" con blank.
Quindi in definitiva avrai
a=for h=1 to m
b=for k= 1 to n
if m(h,k)="" then m(h,k)="zzz"
chiudi i for
applichi l'algoritmo che ti ho postato nel primo reply
applichi l'alogritmo che ti ho appena postato invertendo la condizione

ripeto magari non è elegante ma non ho altre idee ora.... :(

motogpdesmo16
05-07-2005, 14:21
..cut...

--------- edit ----------
riguardo l'argomento del thread...l'esercizio iniziale io avrei cercato di evitare i 4 cicli FOR....i prof spesso ci tengono ad evitare sprechi...e con 4 FOR la complessità di tempo aumenta nn poco...

avrei puntato sui classici 2 FOR per scorrere la matrice, anche perchè non c'è nulla da ordinare visto che è già ordinato, e tenermi traccia con variabili aggiuntive di dove si trovano le celle vuote....e scambiare queste con quelle piene successive....
Credo però che se ci sono una serie N di celle vuote e poi una parola, lo spreco per far scalare ogni volta di una posizione la cella piena sia maggiore rispetto all'ordinamento.
Riguardo l'algoritmo postato: se l'ordinamento lo effettuase cambiando il verso cioè mettesse ">" avrebbe come primo elemento la parola che inizia con "z" e come ultimo elemento il blank. Potrebbe poi riapplicare lo stesso algoritmo mettendo la condizione "<" AND che l'elemento sia <> da blank.

leadergl
05-07-2005, 14:27
Credo però che se ci sono una serie N di celle vuote e poi una parola, lo spreco per far scalare ogni volta di una posizione la cella piena sia maggiore rispetto all'ordinamento.
Riguardo l'algoritmo postato: se l'ordinamento lo effettuase cambiando il verso cioè mettesse ">" avrebbe come primo elemento la parola che inizia con "z" e come ultimo elemento il blank. Potrebbe poi riapplicare lo stesso algoritmo mettendo la condizione "<" AND che l'elemento sia <> da blank.


la matrice è ordinata...è solo che ci stanno degli spazi vuoti qua e la...

quindi:
1) scorri la matrice
2) appena trovi uno spazio vuoto ti memorizzi le sue coordinare in variabili di appoggio
3) appena trovi un elemento nn vuolo lo scambi con quello vuoto di cui hai trovato le coordinate...

vabbè è un po più contorto di così ma credo che almeno uno elimina i 4 FOR...

Qwertid
05-07-2005, 14:39
:D Innanzi tutto grazie dell'aiuto a tutti... Sto facendo un pò di studio teorico e un pò mi sto rivedendo gli esercizi :) Mi avete dato già ottimi spunti cercherò di metterli a frutto... Grazie veramente siete gentilissimi.. :)

**** Per il collega di università ****: Solo per la cronaca il progetto andava consegnato massimo una settimana prima dell'orale di programmazione B

leadergl
05-07-2005, 14:52
:D Innanzi tutto grazie dell'aiuto a tutti... Sto facendo un pò di studio teorico e un pò mi sto rivedendo gli esercizi :) Mi avete dato già ottimi spunti cercherò di metterli a frutto... Grazie veramente siete gentilissimi.. :)

**** Per il collega di università ****: Solo per la cronaca il progetto andava consegnato massimo una settimana prima dell'orale di programmazione B

ti ringrazio per la notizia :p ...vorrà dire che lo ridò a luglio..

cmq riguardo il tuo esercizio si potrebbe anche fare in un altro modo...ad esempio con una matrice di appoggio....dai butto giù qualche riga...

procedure ordina;
var i,j,r,c:integer;
b:array[1..n,1..m] of string;
begin

r:=1;
c:=1;
for i:=1 to n do
begin
for j:=1 to m do
begin
if a[i,j]<>'' then
begin
b[r,c]:=a[i,j];
if c=m then
begin
c:=1;
r:=r+1;
end else
c:=c+1;
end;
end;
end;
a:=b;
end;

...certo a rivederlo non mi piace troppo ma almeno nn ci sono 4 for...

Qwertid
05-07-2005, 17:08
:( Questo programma proprio non mi riesce.... Stavo tentando la strada della memorizzazione delle coordinate ma non va.... :(

gokan
05-07-2005, 17:13
Tentare di memorizzare le coordinate in cui c'è un blank non è una buona strada perchè:
-non sai quanti blank ci possono essere in una matrice
-se ti metti a considerare matrici molto grandi diventa impossibile

Tanto vale usare "questi 4 cicli for" che tanto vi impauriscono :p

leadergl
05-07-2005, 17:18
Tentare di memorizzare le coordinate in cui c'è un blank non è una buona strada perchè:
-non sai quanti blank ci possono essere in una matrice
-se ti metti a considerare matrici molto grandi diventa impossibile

Tanto vale usare "questi 4 cicli for" che tanto vi impauriscono :p


diciamo che il casino viene quando ci sono più "blank" consecutivi...li si diventa un po contorto...

gokan
05-07-2005, 17:20
Non so se usate il pascal borlandiano, quindi se in pratica usate Delphi come compilatore, se si, potete dar un'occhiata a queste funzioni che operano su stringhe, magari trovate qualcosa di utile:
http://www.delphibasics.co.uk/ByFunction.asp?Main=Strings

Qwertid
05-07-2005, 17:48
Non so se usate il pascal borlandiano, quindi se in pratica usate Delphi come compilatore, se si, potete dar un'occhiata a queste funzioni che operano su stringhe, magari trovate qualcosa di utile:
http://www.delphibasics.co.uk/ByFunction.asp?Main=Strings

:) Grazie del link.. In effetti sono belle funzioni ma non credo di poterle usare perchè a lezione non le abbiamo mai utilizzate... Dovrò buttarmi sui 4 for allora... :D (è un parto, le doglie sono molto dolorose :D)

Qwertid
05-07-2005, 17:58
Facendo così funziona:

PROCEDURE ORDINA (VAR A: MATRICE; M,N: INTEGER);
VAR
I,J,R,C: INTEGER;
AUX: STRING[5];
BEGIN
For i:=1 to M do
BEGIN
FOR J:=1 TO N DO
BEGIN
FOR R:=1 TO M DO
BEGIN
FOR C:=1 TO N DO
BEGIN
IF A[R,C]=' ' THEN A[R,C]:='ZZZ';
if A[r,c]>A[i,j] then
BEGIN
aux:=A[r,c];
A[r,c]:=A[i,j];
A[i,j]:=aux;
END;
END;
END;
END;
END;

FOR I:=1 TO M DO
BEGIN
FOR J:=1 TO N DO
IF A[I,J]='ZZZ' THEN A[I,J]:=' ';
END;

writeln; writeln;
writeln('MATRICE A INSERITA');
for i:=1 to M do begin
writeln;
for j:=1 to N do
write(A[i, j]:8);
end;
END;

Che ne pensate? (anche se da voi viene) :D

Qwertid
05-07-2005, 18:29
In più per renderlo un pò più bellino :D ho fatto una procedura scambia...

Qwertid
06-07-2005, 14:04
Ragazzi 30! :D

Mi ha chiesto di quell'esercizio... ha detto che si faceva con solo 2 for... E per semplificarmi all'orale mi ha detto considera il caso che sia un vettore e non una matrice.. Molto più umano :D

leadergl
06-07-2005, 14:15
Ragazzi 30! :D

Mi ha chiesto di quell'esercizio... ha detto che si faceva con solo 2 for... E per semplificarmi all'orale mi ha detto considera il caso che sia un vettore e non una matrice.. Molto più umano :D


:D quello che pensavo stamattina :D

Quando ordiniamo un vettore possiamo ad esempio fare due cicli for così:

For i:=1 to Totala-1 do
begin
for j:=(i+1) to Totale do

se applichiamo lo stesso concetto alla matrice facendo finta che siano tutti sulla stessa riga

leadergl
06-07-2005, 14:32
Bisogna solo far andare le celle vuote alla fine....per il resto funziona...ho messo anche la procedura che vi stampa la matrice...

Program OrdinaMatrice;
uses crt;
Const R=3;
C=4;

Var A:Array[1..R,1..C] of string;

{procedura di ordinamento}
procedure ordina;
var i,j:integer;
rigaI,colonnaI,rigaJ,colonnaJ:integer;
temp:string;
begin
{ordina la matrice}
for i:=1 to ((r*c)-1) do
begin
colonnai:=4-(i mod 12);
rigai:=3-(i div 12);
for j:=(i+1) to (r*c) do
begin
colonnaj:=4-(j mod 12);
rigaj:=3-(j div 12);

if a[rigai,colonnai]<a[rigaj,colonnaj] then
begin
temp:=a[rigai,colonnai];
a[rigai,colonnai]:=a[rigaj,colonnaj];
a[rigaj,colonnaj]:=temp;
end;
end;
end;
{stampa la matrice}
for i:=1 to r do
begin
for j:=1 to c do
write('| ',a[i,j]);
writeln;
end;
readln;
end;

{main del programma}
begin
clrscr;
a[1,1]:='anno';
a[1,2]:='casa';
a[1,4]:='chiesa';
a[2,3]:='elmo';
a[2,4]:='gatto';
a[3,1]:='luna';
a[3,2]:='nave';
ordina;
end.


modificato in questo modo fa esattamente quello che volevi tu...anche con le celle vuote ;)

Program OrdinaMatrice;
uses crt;
Const R=3;
C=4;

Var A:Array[1..R,1..C] of string;

{procedura di ordinamento}
procedure ordina;
var i,j:integer;
rigaI,colonnaI,rigaJ,colonnaJ:integer;
temp:string;
begin
{ordina la matrice}
for i:=1 to ((r*c)-1) do
begin
colonnai:=(i mod 12);
rigai:=(i div 12)+1;
for j:=1 to (r*c) do
begin
colonnaj:=(j mod 12);
rigaj:=(j div 12)+1;

if a[rigai,colonnai]='' then a[rigai,colonnai]:='~~';
if a[rigaj,colonnaj]='' then a[rigaj,colonnaj]:='~~';

if a[rigai,colonnai]<a[rigaj,colonnaj] then
begin
temp:=a[rigai,colonnai];
a[rigai,colonnai]:=a[rigaj,colonnaj];
a[rigaj,colonnaj]:=temp;
end;

if a[rigaj,colonnaj]='~~' then a[rigaj,colonnaj]:='';
if a[rigai,colonnai]='~~' then a[rigai,colonnai]:='';
end;
end;
{stampa la matrice}
for i:=1 to r do
begin
for j:=1 to c do
write('| ',a[i,j]);
writeln;
end;
readln;
end;



{main del programma}
begin
clrscr;
a[1,1]:='anno';
a[1,2]:='casa';
a[1,4]:='chiesa';
a[2,3]:='elmo';
a[2,4]:='gatto';
a[3,1]:='luna';
a[3,2]:='nave';
ordina;
end.

Qwertid
06-07-2005, 17:35
Grazie!!! :D

Stavo continuando a scervellarmici su... :) Veramente grazie di cuore :)