Sei sulla pagina 1di 7

ESERCIZI SVOLTI IL 13 DICEMBRE 2019

ESERCIZIO D)
Date due stringhe S1 e S2 (solo caratteri minuscoli), viene richiesto di

1) individuare e stampare l’ultimo carattere ULTIMO di S1; se S1 è vuota, stampare '#'


2) stabilire se tale carattere ULTIMO di S1 è nella stringa S2, senza considerare il primo e l’ultimo
carattere di S2

Esempi

char S1[]="Prova", S2[]="ora";  ULTIMO ='a' NO in S2

char S1[]="Prova", S2[]="orale";  ULTIMO ='a' OK in S2

L’ultimo carattere di una stringa non vuota S1 è quello in posizione LunghezzaS1 – 1, cioè il carattere
S1[LunghezzaS1 – 1].
Dichiarazioni variabili
char ULTIMO;
int I;
char S1[]="Prova";

Sono possibili varie soluzioni


ULTIMO='#';
for (I=0; S1[I]!='\0';I++); /* alla fine del ciclo for I è pari alla lunghezza di S */

if (I>0)
ULTIMO=S1[I-1];
printf("ultimo %c\n", ULTIMO);

Oppure:
ULTIMO='#';
for (I=0; S1[I]!='\0';I++)
if (S1[I+1]=='\0') /* l’ultimo carattere ha come successivo S1[I+1] il carattere terminatore*/
ULTIMO=S1[I];
printf("ultimo %c\n", ULTIMO);

Oppure:
ULTIMO='#';
for (I=0; S1[I]!='\0';I++)
ULTIMO=S1[I]; /* ad ogni ciclo il carattere S[I] è l’ultimo*/
printf("ultimo %c\n", ULTIMO);

Oppure, usando la funzione strlen (libreria string.h) per il calcolo della lunghezza:
ULTIMO='#';
if (strlen(S1)>0)
ULTIMO=S1[strlen(S1)-1];
printf("ultimo %c\n", ULTIMO);

Oppure:
if (strlen(S1)>0)
ULTIMO=S1[strlen(S1)-1];
else
ULTIMO='#';
printf("ultimo %c\n", ULTIMO);

Oppure, con l’espressione condizionale

ULTIMO = strlen(S1)>0 ? S1[strlen(S1)-1] : '#';

1
Esercizio 2) Stabilire se tale carattere ULTIMO di S1 è nella stringa S2, senza considerare il primo e l’ultimo
carattere di S2

Si risolve con la ricerca lineare di ULTIMO in S2, escludendo dal confronto il primo e l’ultimo carattere di
S2

TROVATO=0;
for(I=0; S2[I]!= '\0'; I++)
if (I > 0 && S2[I+1] != '\0' ) /* per escludere primo e ultimo carattere di S2 */
if (S2[I]==ULTIMO )
TROVATO=1;
if (TROVATO)
printf("OK in S2\n");
else
printf("NO in S2\n");

Ovviamente le due condizioni in if possono essere congiunte:

TROVATO=0;
for(I=0; S2[I]!= '\0'; I++)
if (I > 0 && S2[I+1] != '\0' && S2[I]==ULTIMO )
TROVATO=1;
if (TROVATO)
printf("OK in S2\n");
else
printf("NO in S2\n");

2
ESERCIZIO E)
Date due stringhe S1 e S2 (caratteri minuscoli e maiuscoli), viene richiesto di

1) individuare e stampare l’ultimo carattere maiuscolo ULTIMOMAIUSCOLO di S1; se S1 è vuota


oppure non ha caratteri maiuscoli, stampare '#';
2) stabilire se tale carattere ULTIMOMAIUSCOLO di S1 è nella stringa S2, senza considerare il
primo e l’ultimo carattere di S2 e senza distinguere tra maiuscoli e minuscoli.

Esempi

char S1[]="prova", S2[]="ora";  ULTIMOMAIUSCOLO ='#' NO in S2

char S1[]="Prova", S2[]="ora";  ULTIMOMAIUSCOLO ='P' NO in S2

char S1[]="AlBero", S2[]="Bene";  ULTIMOMAIUSCOLO ='B' NO in S2

char S1[]="AlBero", S2[]="Alba";  ULTIMOMAIUSCOLO ='B' OK in S2

SOLUZIONE
1) individuare e stampare l’ultimo carattere maiuscolo ULTIMOMAIUSCOLO di S1; se S1 è vuota oppure
non ha caratteri maiuscoli, stampare '#';

In questo caso è necessario scandire tutta la stringa ed ogni volta che si incontra un carattere maiuscolo
questo diventa l’ultimo.

ULTIMOMAIUSCOLO viene inizializzato con il carattere da restituire in caso in cui non vi siano caratteri
maiuscoli (ovviamente una stringa vuota non contiene caratteri maiuscoli)
ULTIMOMAIUSCOLO ='#';
for (I=0; S1[I]!='\0'; I++ )
if (S1[I]>='A' && S1[I]<='Z')
ULTIMOMAIUSCOLO = S1[I];

printf("ultimo %c\n", ULTIMOMAIUSCOLO);

2) stabilire se tale carattere ULTIMOMAIUSCOLO di S1 è nella stringa S2, senza considerare il primo e
l’ultimo carattere di S2 e senza distinguere tra maiuscoli e minuscoli.

Come nell’esercizio precedente si effettua una ricerca di ULTIMOMAIUSCOLO in S2 escludendo dal


confronto il primo e l’ultimo carattere di S2; inoltre si confronta ULTIMOMAIUSCOLO anche con il
carattere minuscolo corrispondente a S2[I] cioè S2[I]-('a'-'A'):

/* RICERCA */
TROVATO=0;
for (I=0; S2[I]!='\0'; I++ )
if (I>0 && S2[I+1]!='\0') /* senza considerare il primo e l'ultimo carattere di S2 */
if ( (ULTIMOMAIUSCOLO == S2[I] ||
ULTIMOMAIUSCOLO == S2[I]-('a'-'A') )) /*senza distinguere tra maiuscoli e minuscoli*/

TROVATO=1;

if (TROVATO)
printf("OK in S2\n");
else
printf("NO in S2\n");

3
[es. 12 - punti 5] Data una stringa S scrivere un programma per
1) Stampare la stringa S carattere per carattere secondo la seguente modalità:
 Se il carattere è una consonante stampare il carattere (vocale o consonante) immediatamente precedente
 Se il carattere è una vocale stampare il carattere (vocale o consonante) immediatamente successivo
 Il primo e l’ultimo carattere della stringa non devono essere stampati
Esempi:
“FONDAMENTI” → “NONMANEN”
“INFORMATICA” → “INRORTACI”

2) Data un’altra stringa S2, stampare a video la minima consonante di S (quella più piccola in ordine
alfabetico) che compare anche in S2; se tale consonante non esiste stampare ‘@’
Esempi:
S2 = “ESAME”
S = “FONDAMENTI” → ‘M’
S = “INFORMATICA” → ‘M’
S = “ORALE” → ‘@’

Note: In S e S2 si suppongono esclusivamente caratteri alfabetici maiuscoli (solo vocali e consonanti: quindi se un
carattere non è una vocale allora è una consonante)

SOLUZIONE
Per controllare che sia una consonante quindi si può usare la condizione
!(S[i] == 'A' || S[i] == 'E' || S[i] == 'I' || S[i] == 'O' || S[i] == 'U')
Primo punto:
char S[]="FONDAMENTI";
int i, j;

for (i = 0; S[i]!='\0' ; i++) {


if (i>0 && S[i+1]!='\0') /* senza considerare il primo e l'ultimo carattere */
if (!(S[i] == 'A' || S[i] == 'E' || S[i] == 'I' || S[i] == 'O' || S[i] == 'U'))
printf("%c", S[i-1]);
else
printf("%c", S[i+1]);
}

Secondo punto:
char S[]="FONDAMENTI" , S2[]="ESAME";
int i, j;
int trovato; /* per effettuare la ricerca lineare */
char min_con; /* consonante minima */

min_con='@';

for (i = 0; S[i]!='\0' ; i++)


if (!(S[i] == 'A' || S[i] == 'E' || S[i] == 'I' || S[i] == 'O' || S[i] == 'U')){

/* si effettua ricerca lineare */


trovato =0;
for (j = 0; S2[j]!='\0' ; j++)
if (S[i]==S2[j])
trovato=1;
/* fine ricerca lineare */

/* se S[i] è stato trovato in S2, allora si considera nel calcolo del minimo */

if (trovato)
/* la prima volta si individua tramite min_con=='@' */
if (min_con=='@' || S[i]<min_con)
min_con=S[i];
}

printf("min_con = %c", min_con);

4
[es. 11 - punti 4] Date le stringhe SA e SB, scrivere un programma che stampi le consonanti di SA ed il numero di
volte che tale vocale compare nella stringa SB, senza considerare il primo e l’ultimo carattere di tale stringa SB.

Note: In SA e SB si suppongono esclusivamente caratteri alfabetici maiuscoli (solo vocali e consonanti: quindi se
un carattere non è una vocale allora è una consonante)

Esempio
char SA[]= "RAP"; /* caratteri distinti */
char SB[]= "RELIPPO"; /* può avere caratteri ripetuti*/

Si deve ottenere

'R' : compare 0 volte in SB


'P' : compare 2 volte in SB

Facoltativo: Tra le consonanti stampate individuare e stampare quella che compare più volte in SB;
Nell’esempio precedente si deve stampare 'P'

SOLUZIONE:
Si riporta il programma completo

#include <stdio.h>

main() {
int i, j;
int conta;

char SA[]= "RAP"; /* caratteri distinti */


char SB[]= "RELIPPO"; /* può avere caratteri ripetuti*/

for (i = 0; SA[i]!='\0' ; i++)


if (!(SA[i] == 'A' || SA[i] == 'E' || SA[i] == 'I' || SA[i] == 'O' || SA[i] == 'U')){
conta =0; /* è importante inizializzare sempre conta=0, per ogni consonante */
for (j = 0; SB[j]!='\0' ; j++)
if (j>0 && SB[j+1]!='\0') /* senza considerare il primo e l'ultimo carattere */
if (SA[i]==SB[j])
conta++;

printf(" %c compare %d volte in SB\n",SA[i],conta);


}

SOLUZIONE PUNTO FACOLTATIVO:


Per il calcolo del massimo numero di occorrenze si usa la variabile conta_max .
Si introduce anche il carattere max_cons per individuare la consonante che compare più volte

Il calcolo di queste variabili viene effettuato subito dopo aver calcolato conta.
conta_max viene inizializzata a zero (valore minimo)

Nel compito scritto è sufficiente riportare le variazioni rispetto all’esercizio principale già svolto, cioè:
int conta, conta_max=0;
char max_cons;

/* questa parte va inserita dopo il calcolo di conta, prima del printf */


if (conta>conta_max){
conta_max=conta;
max_cons = SA[i];
}
5
Il programma completo è il seguente:
#include <stdio.h>

main() {
int i, j;
int conta, conta_max=0;
char max_cons;

char SA[]= "RAP"; /* caratteri distinti */


char SB[]= "RELIPPO"; /* può avere caratteri ripetuti*/

for (i = 0; SA[i]!='\0' ; i++)


if (!(SA[i] == 'A' || SA[i] == 'E' || SA[i] == 'I' || SA[i] == 'O' || SA[i] == 'U')){
conta =0; /* è importante inizializzare sempre conta=0, per ogni consonante */
for (j = 0; SB[j]!='\0' ; j++)
if (j>0 && SB[j+1]!='\0') /* senza considerare il primo e l'ultimo carattere */
if (SA[i]==SB[j])
conta++;

if (conta>conta_max){
conta_max=conta;
max_cons = SA[i];
}

printf(" %c compare %d volte in SB\n",SA[i],conta);


}

printf("La massima consonante è %c che compare %d volte\n",max_cons,conta_max);

Questo programma funziona nel caso in questione, però nel caso è generale è incompleto in quanto stampa solo una
delle consonanti con il maggior numero di occorrenze; se cambiamo SB mettendoci due R

char SA[]= "RAP"; /* caratteri distinti */


char SB[]= "RERLRIPPO"; /* può avere caratteri ripetuti*/

Si ottiene in uscita solo il carattere R (non più il carattere P)


Si noti che con >= nel calcolo del max si

if (conta >= conta_max){


conta_max=conta;
max_cons = SA[i];
}

Si ottiene in uscita solo il carattere P.

Per ottenerle tutte, il modo più semplice è il seguente: dopo aver calcolato conta_max si effettua di nuovo il calcolo di
conta per ogni consonante: se conta è uguale a conta_max allora si stampa la consonante

Nel compito scritto è sufficiente riportare le variazioni rispetto all’esercizio principale già svolto, cioè:

/* qui si ripete tutto il calcolo di conta, quindi si aggiunge*/

if (conta==conta_max)
printf(" %c \n",SA[i]);

6
Il programma completo è il seguente:
#include <stdio.h>
main() {
int i, j;
int conta, conta_max=0;
char max_cons;

char SA[]= "RAP"; /* caratteri distinti */


char SB[]= "RERLRIPPO"; /* può avere caratteri ripetuti*/

for (i = 0; SA[i]!='\0' ; i++)


if (!(SA[i] == 'A' || SA[i] == 'E' || SA[i] == 'I' || SA[i] == 'O' || SA[i] == 'U')){
conta =0; /* è importante inizializzare sempre conta=0, per ogni consonante */
for (j = 0; SB[j]!='\0' ; j++)
if (j>0 && SB[j+1]!='\0') /* senza considerare il primo e l'ultimo carattere */
if (SA[i]==SB[j])
conta++;
if (conta>conta_max) /* non è più necessario calcolare max_cons = SA[i]; */

conta_max=conta;

printf("%c compare %d volte in SB\n",SA[i],conta);


}

printf("Il massimo numero di occorrenze è %d e si verifica per le consonanti: \n",conta_max);

for (i = 0; SA[i]!='\0' ; i++)


if (!(SA[i] == 'A' || SA[i] == 'E' || SA[i] == 'I' || SA[i] == 'O' || SA[i] == 'U')){
conta =0; /* è importante inizializzare sempre conta=0, per ogni consonante */
for (j = 0; SB[j]!='\0' ; j++)
if (j>0 && SB[j+1]!='\0') /* senza considerare il primo e l'ultimo carattere */
if (SA[i]==SB[j])
conta++;
if (conta==conta_max)
printf(" %c \n",SA[i]);
}

Potrebbero piacerti anche