Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    143

    [C] Esercizi su stringhe semplicissimi

    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*/

    codice:
    #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

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Re: [C] Esercizi su stringhe semplicissimi

    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/c...stdio/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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Se tu scrivi un codice in C:

    codice:
    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).

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    143
    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...

  5. #5
    codice:
    for(i = 0; s1[i] != '\0'; ++i);
    in C questo codice non fa niente: la sintassi del ciclo for e`
    codice:
    for() {
      statement1;
      statement2;
    }
    o
    codice:
     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.

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    143
    Originariamente inviato da clynamen
    codice:
    for(i = 0; s1[i] != '\0'; ++i);
    in C questo codice non fa niente: la sintassi del ciclo for e`
    codice:
    for() {
      statement1;
      statement2;
    }
    o
    codice:
     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...

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quel ciclo for è utile per trovare la lunghezza della stringa e quindi va bene.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    ah, chiedo scusa, sono stato troppo pigro e non ho letto le righe successive.
    codice:
    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...c9a1e20aa0952b

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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.