Curiosità

stellacometa
Ragazzi...avrei una domanda da farvi...

Sapete come si fa a fare l'algoritmo di questo problema: Verificare che all'interno di una parola inserita da tastiera vi sia la lettera "a".

E' un bel pò che me lo domando ma mi è sempre rimasto il dubbio....

Risposte
Nidhogg
Vuoi sapere l'algoritmo in generale o in un linguaggio specifico?

Nidhogg
In linguaggio Pascal:

Program VerificaLettera;
Uses WinCrt;
Var lettera:char;
    parola:string;
    i,flag:integer;
begin
   write('Inserisci la lettera da trovare nella parola: ');
   readln(lettera);
   writeln;
   write('Inserisci la parola: ');
   readln(parola);
   flag:=0;
   for i:=1 to length(parola) do
      if parola[i]=lettera then flag:=1;
   writeln;
   if flag=1 then writeln('La lettera ',lettera,' è presente in ',parola)
      else writeln('La lettera ',lettera,' non è presente in ',parola);

end.

Nidhogg
In linguaggio C:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100

int main(void)
{
   char lettera;
   char parola[MAX];
   int i,flag;

   printf("\n Inserisci la lettera da trovare nella parola: ");
   scanf("%c",&lettera);

   printf("\n Inserisci la parola: ");
   scanf("%s",&parola);
   
   flag=0;
   for (i=0;i<strlen(parola);i++)
      if (parola[i]==lettera) flag=1;

   if (flag==1) printf("\n La lettera %c è presente in %s \n",lettera,parola);
      else printf("\n La lettera %c non è presente in %s \n",lettera,parola);
   
   system("pause");
   return 0;
}


Poi in linguaggio C esiste una funzione, la strchr, che implementa direttamente questo algoritmo. Gli algoritmi di ricerca di stringhe aventi il compito di trovare una data sottostringa o una data configurazione di caratteri sono molto interessanti!!!

Se hai bisogno di chiarimenti chiedi pure.

stellacometa
Mi interesserebbe in linguaggio Visual Basic...ma ovviamente vorrei spiegato come si procede!!! Grazie

Nidhogg
Esiste una funzione in VB, InStr, che permette la ricerca di una sottostringa all'interno di una stringa.


Private Function EInStr (ByVal parola1 As String, ByVal parola2 As String) As Long
Dim i As Integer
Dim Finito As Boolean

Finito = False
EInStr = 0  
If Len(parola1) >= Len(parola2) Then
   i = 1  
   Do While Mid dollaro(parola1, i, Len(parola2)) <> parola2
      If i > Len(parola1) - Len(parola2) + 1 Then
         i = 0 
         Finito = True 
      Else
         i = i + 1 
      End If
   Loop
End If
EInStr = i
End Sub


parola1 = "MIAO MIAO"
parola2 = "IAO"
EInStr(parola1,parola2) --> 2 'trovata a partire dalla posizione 2
EInStr(parola1,"BAU") --> 0 'non trovata[/quote]

stellacometa
Grazie Leonardo...forse è inutile ma a noi lo fanno studiare..perciò, sapete a sommi capi come dovrei impostare il diagramma a blocchi?

lorven
Mi sono permesso di completare e modificare il buon programma di Leonardo, che presentava però qualche errore, evidentemente di distrazione.
Ho costruito un form con un solo COMMAND BUTTON che attiva COMMAND1_CLICK.

Private Function MiaInStr(ByVal parola1 As String, ByVal parola2 As String) As Long
Dim i As Integer
Dim Finito As Boolean

Finito = False
MiaInStr = 0
i = 1
Do While Not Finito
If Mid(parola1, i, Len(parola2)) = parola2 Then
Finito = True
MiaInStr = i
End If
If i > Len(parola1) - Len(parola2) Then
Finito = True
Else: i = i + 1
End If
Loop
End Function

Sub COMMAND1_CLICK()
Dim par1 As String
Dim par2 As String
Dim messaggio As String
Dim posiz As Long

par1 = InputBox("parola 1:")
par2 = InputBox("parola 2:")
posiz = MiaInStr(par1, par2)
If posiz > 0 Then
messaggio = "la parola " + par2 + " appare in " + par1 + " in posizione " + CStr(posiz)
Else: messaggio = "la parola " + par2 + " non appare in " + par1
End If
MsgBox messaggio
End Sub

N.B.: Dopo MID c'è il simbolo del dollaro!
Per il diagramma a blocchi: non ho il programma per disegnarlo; se necessario, posso realizzarlo a mano e inserirne una immagine scannerizzata (ma spero di no ...) ;-)

Nidhogg
Non capisco che errori hai trovato nel mio programma. Non metto in dubbio che li hai trovati, ma quali sono?

stellacometa
Ragazzi...fatemi capire anche a me...ci sono delle funzioni che non ho mai utilizzato..Ricordatevi che ho iniziato da poco a studire VB

Nidhogg
Quali funzioni in particolare non riconosci? Ad esempio Len(stringa) restituisce il numero di caratteri della variabile "stringa".

stellacometa
EInStr (ByVal parola1 As String, ByVal parola2 As String)

Ps...se ti riesce cerca di spiegarmelo passo per passo tutto ok??...
Grazie 1000 ;-)

Nidhogg
In Visual Basic esiste una funzione già definita, InStr(), che permette di cercare una stringa all’interno di un’altra. La sintassi di questa funzione è: Instr([iniziale, ]stringa1, stringa2[, confronto]). "iniziale" è il numero che indica la posizione, l'indice da dove far partire la ricerca. Se si omette l’argomento, la ricerca inizia dal primo carattere. "stringa1" è la sottostringa da ricercare. "confronto" è il tipo di confronto da effettuare (se vuoi altre informazioni su questo argomento chiedi pure). Io ho voluto emulare questa funzione, definendone un'altra, EInStr, che fa esplicita esattamente le stesse funzionalità della procedura standard InStr. Poi la parola chiave ByVal serve ad indicare che un argomento viene passato in modo tale che la routine o la proprietà chiamata non sia in grado di modificare il valore della variabile sottostante nel codice chiamante. Quindi se si passa una variabile di argomento tramite valore, utilizzando la parola chiave ByVal, la routine non può modificare la variabile.

stellacometa
Ok...magari provo a farlo in Vb e vediamo che me ne esce fuori..in tal caso mi rifaccio viva!!

lorven
Gli errori:

1. appaiono EInstr e MiaInstr, che immagino siano due nomi diversi per la stessa funzione;
2. la variabile booleana Finito viene valorizzata ma mai testata (dovrebbe comandare l'uscita dal ciclo)
3. se parola2 non appare in parola1 mi risulta che il programma vada in errore

Una curiosità: è sparita l'indentazione dal mio programma; come fare per mantenerla anche nel post?
Ciao e grazie.

Nidhogg
Gli errori che hai segnalato non esistono. Controlla di nuovo il mio codice.

N.B.: Per mantenere l'indentazione o qualsiasi forma di formattazione basta premere il bottone "Code" nel menù "Struttura Messaggio", poi inserire il testo e poi ripremere "Code".

lorven
Confermo i tre punti.
Forse parliamo di due codifiche diverse?

Nidhogg
Temo di si!

lorven
Private Function EInStr (ByVal parola1 As String, ByVal parola2 As String) As Long
Dim i As Integer
Dim Finito As Boolean

Finito = False
EInStr = 0
If Len(parola1) >= Len(parola2) Then
i = 1
Do While Mid dollaro(parola1, i, Len(parola2)) <> parola2
If i > Len(parola1) - Len(parola2) + 1 Then
i = 0
Finito = True
Else
i = i + 1
End If
Loop
End If
MiaInStr = i
End Sub

Questo è ciò che vedo io; ho evidenziato i tre errori

Nidhogg
Non capisco come sia scomparsa la condizione su Finito nel ciclo Do While. Poi EInStr e MiaStr sono lo stesso (un errore, vero!).

lorven
:smt023 :smt023 :smt023

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.