PDA

Visualizza la versione completa : [C] Esercizi su stringhe semplicissimi


vfldj
15-10-2012, 22:30
Devo svolgere questi determinati metodi ma non mi funzionano, mi aiutate? Sono proprio le basi di C.. Quelli che non vanno sono contrassegnati da /*NO*/



#include <stdio.h>
#include <stdlib.h>

#define N 25

typedef enum{FALSE, TRUE} bool;

int palindroma(char s[]);
int confronta(char s1[], char s2[]);
int occorre(char s1[], char c);
int prefisso(char s1[], char s2[]);
int sottostringa(char s1[], char s2[]);

menu() {
//system("clear");
printf("0 - Uscita");
printf("\n1 - Palindroma");
printf("\n2 - Confronta"); /*NO*/
printf("\n3 - Occorre"); /*NO*/
printf("\n4 - Prefisso"); /*NO*/
//printf("\n5 - Sottostringa");
//printf("\n6 - Concatena");
printf("\nQuale metodo vuoi eseguire? ");
int risp;
scanf("%d", &risp);
getchar();
return risp;
}

main() {

char s1[N];
char s2[N];
char c;
int occ;

while(1) {
int scelta = menu();
switch(scelta) {
case 0:
exit(0);
case 1:
printf("\nInserisci una stringa: ");
scanf("%s", s1);
if (palindroma(s1)) {
printf("La parola è palindroman\n\n");
}
else {
printf("La parola non è palindroma\n\n");
}
break;
case 2:
printf("\nInserisci una stringa: ");
scanf("%s", s1);
printf("Inserisci una seconda stringa: ");
scanf("%s", s2);
if (confronta(s1, s2)) {
printf("s1 ed s2 sono uguali\n\n");
}
else {
printf("s1 ed s2 non sono uguali\n\n");
}
break;
case 3:
printf("\nInserisci una stringa: ");
scanf("%s", s1);
printf("Inserisci un carattere da cercare: ");
c = getchar();
occ = occorre(s1, c);
printf("Il carattere %c compare %d volte in %s\n\n", c, occ, s1);
break;
case 4:
printf("\nInserisci una stringa: ");
scanf("%s", s1);
printf("Inserisci una seconda stringa: ");
scanf("%s", s2);
if (prefisso(s1, s2)) {
printf("s2 e' la parte inziale di s1\n\n");
}
else {
printf("s2 non e' la parte inziale di s1\n\n");
}
break;
/*case 5:
sottostringa();
break;*/
/*case 6:
concatena();
break;*/
default:
exit(0);
}
}
}

int palindroma(char s[]) {
int d;
for(d = 0; s[d] != '\0'; d++);
int uguali = 1;
int i = 0;
int j = d - 1;
while(i < j && uguali) {
if (s[i] == s[j]) {
i = i + 1;
j = j - 1;
}
else
uguali = 0;
}
return uguali;
}

int confronta(char s1[], char s2[]) {
int i;
int j;
int l1;
int l2;
int uguali = 1;
for(i = 0; s1[i] != '\0'; ++i);
l1 = i;
i = 0;
for(j = 0; s2[j] != '\0'; ++j);
l1 = j;
j = 0;
if(l1 != l2)
return 0;
while(i < l1) {
if(s1[i] != s2[i]) {
uguali = 0;
}
++i;
}
return uguali;
}

int occorre(char s1[], char c) {
int i = 0;
int count = 0;
for(i = 0; i < N; ++i) {
if(s1[i] == c) {
count++;
}
}
return count;
}

int prefisso(char s1[], char s2[]) {
int i;
int j;
int l1;
int l2;
int pref = 1;
for(i = 0; s1[i] != '\0'; ++i);
l1 = i;
i = 0;
for(j = 0; s2[j] != '\0'; ++j);
l1 = j;
j = 0;
if(l2 > l1)
return 0;
while(s2[i] != '\0') {
if(s1[i] == s2[i])
++i;
else
pref = 0;
}
}

/*int sottostringa(char s1[], char s2[]) {
int i;
int j;
int l1;
int l2;
int sott = 1;
for(i = 0; s1[i] != '\0'; ++i);
l1 = i;
i = 0;
for(j = 0; s2[j] != '\0'; ++j);
l1 = j;
j = 0;
if(l2 > l1)
return 0;
while(s1[i] != '\0' && sott) {
if(s1[i] == s2[j])


}
}*/


Come faccio a salvare in una variabile un singolo carattere? Per esempio voglio chiedere all'utente un carattere e voglio salvarlo nella variabile "c". Come si fa? Ho capito che bisogna usare la getchar() ma come? Ho cercato un p su internet ma non ho compreso molto sul suo funzionamento..
Mi scrivete un esempio veramente banale, giusto per capire?
Grazie :ciauz:

LeleFT
16-10-2012, 08:42
Originariamente inviato da vfldj
Devo svolgere questi determinati metodi ma non mi funzionano, mi aiutate? Sono proprio le basi di C.. Quelli che non vanno sono contrassegnati da /*NO*/


Magari dovresti anche dire COSA non funziona, QUALI errori ottieni. Credi che sia sufficiente "contrassegnare con NO" ci che non va per capire cosa non va? I compilatori danno dei messaggi di errore se c' qualcosa che non va a tempo di compilazione... sono messaggi importanti perch dicono esattamente cosa e dove c' un errore. Bisogna, quindi, riportatli. Stessa cosa per i messaggi a tempo di esecuzione. Se posti un chilometro di righe di codice e "contrassegni con NO" i punti dove non va senza dire cosa non va non aiuti nessuno ad aiutarti.



Mi scrivete un esempio veramente banale, giusto per capire?


Queste richieste non sono lecite... scritto chiaro nel regolamento interno. Senza contare che di esempi banalissimi (gli stessi che ti si proporrebbero qui!) li trovi semplicemente con google. Perch riportare qui gli stessi identici esempi che si trovano con Google?

http://www.cplusplus.com/reference/clibrary/cstdio/getchar/
http://rabbit.eng.miami.edu/class/een218/getchar.html
http://www.ontko.com/pub/rayo/cs35/while_getchar.html
http://www.lainoox.com/c-getchar-examples/

(sono i primi 4 risultati della ricerca "C getchar example")


Ciao. :ciauz:

Who am I
16-10-2012, 11:58
Se tu scrivi un codice in C:



int a=2;
a<<1;
printf("%d",a);


Ti aspetti che stampi 2 magari perch non conosci l' operatore di shift e pensi che invece faccia una moltiplicazione, e dici che "non funziona" chi sta dall' altra parte non sa cosa non va, ovviamente.
Per cui devi dire cosa ti aspetti che fa e cosa fa effettivamente il codice che hai scritto (e sarebbe da fare un banner per questo).

vfldj
16-10-2012, 19:51
Ok chiedo scusa...
Il codice compila ma i vari metodi non svolgono ci che dovrebbero fare cio:
- int confronta(char s1[], char s2[]);
confronta s1 ed s2 dovrebbe restuire 1 se s1=s2, 0 altrimenti.
Il problema che mi restituisce sempre 0, quindi sempre diverse
- int occorre(char s1[], char c);
Deve restituire il numero di occorrenze di c nella stringa s1. Il problema che non riesco a fare inserire la stringa
- int prefisso(char s1[], char s2[]);
deve restituire 1 se s2 prefisso di s1. Il problema che mi restituisce sempre 0.
- int sottostringa(char s1[], char s2[]);
Deve restituire 1 se s2 sottostringa si s1.
Non so proprio come scrivere il codice...

clynamen
16-10-2012, 20:42
for(i = 0; s1[i] != '\0'; ++i);
in C questo codice non fa niente: la sintassi del ciclo for e`


for() {
statement1;
statement2;
}

o

for() statement;

Con il codice da te postato si esegue lo statement che compare tra la parentesi chiusa e il punto e virgola, ovvero uno statement nullo, che non fa niente.

vfldj
16-10-2012, 20:52
Originariamente inviato da clynamen

for(i = 0; s1[i] != '\0'; ++i);
in C questo codice non fa niente: la sintassi del ciclo for e`


for() {
statement1;
statement2;
}

o

for() statement;

Con il codice da te postato si esegue lo statement che compare tra la parentesi chiusa e il punto e virgola, ovvero uno statement nullo, che non fa niente.

Il prof usa questo ciclo...

oregon
16-10-2012, 21:11
Quel ciclo for utile per trovare la lunghezza della stringa e quindi va bene.

clynamen
17-10-2012, 09:54
ah, chiedo scusa, sono stato troppo pigro e non ho letto le righe successive.


int confronta(char s1[], char s2[]) {
int i;
int j;
int l1;
int l2;
int uguali = 1;
for(i = 0; s1[i] != '\0'; ++i);
l1 = i;
i = 0;
for(j = 0; s2[j] != '\0'; ++j);
l1 = j; // <<---------------- l2
j = 0;
if(l1 != l2)
return 0;
while(i < l1) {
if(s1[i] != s2[i]) {
uguali = 0; // << ------- se soltanto un carattere e` diverso la stringhe sono diverse, tanto vale
// ritornare subito 0
}
++i;
}
return uguali;
}


Per quanto riguarda la funzione 'occorre' non riesci a leggere il carattere da cercare perche' leggi il carattere null dell'input precedente. E` un problema comune, leggi per esempio qui http://www.pierotofy.it/pages/extras/forum/87/1017083-_gets_dopo_scanf_non_funziona/?PHPSESSID=728e2f8d2af8968597c9a1e20aa0952b

nella funzione prefisso non restituisci un valore diverso da 0 quando la stringa 2 e` un prefisso della stringa 1

Loading