Programma in C cicli if,for while

di il
4 risposte

Programma in C cicli if,for while

Implementare la funzione int negativo(char* str) che restituisce 1 se la frase str passata per argomento
e' negativa, 0 altrimenti. Per determinare se una frase sia negativa o meno occorre conteggiare il numero
di occorrenze delle parole ``NON'' e ``FALSO'' all'interno della frase, seguendo il principio che la doppia
negazione diventa aermazione.
Esempi:
negativo("e vero") ritorna ) 0
negativo("non e vero") ritorna ) 1
negativo("e falso") ritorna ) 1
negativo("non e falso") ritorna ) 0
negativo("non e vero che non e falso") ritorna ) 1
negativo("non era il nonno") ritorna ) 1
Note
Non e' possibile utilizzare le funzioni della libreria string.h;
La funzione deve essere case-insensitive, ovvero non deve fare distinzione tra caratteri maiuscoli e minuscoli.
E' possibile utilizzare le funzioni char toupper(char x) e int isalpha(char x) (ctype.h);
Non implementare funzioni non necessarie o non esplicitamente richieste.
Implementare una funzione main che legga la stringa str (scanf). La funzione stampa a video la stringa letta,
scrivendo se la stringa sia o meno in forma negativa basandosi sul valore di ritorno di negativo(str).
non ho la MINIMA IDEA da dove partire!! lol ringrazio i gentili d'animo che sapranno darmi una mano!!

4 Risposte

  • Re: Programma in C cicli if,for while

    Praticamente devi vedere se la somma dei "NON" e dei "FALSO" sia divisibile per 2. Se si ritorni 0, se no ritorni 1. Quindi devi contare quante volte compaiono le stringhe NON e FALSO nella stringa iniziale e fare la divisione.
  • Re: Programma in C cicli if,for while

    Il problema è proprio sapere come fare a contare in una stringa quante volte c'è NON e FALSO..
    poi, usare scanf è impossibile perché non si può mettere gli spazi.. uso getchar..
  • Re: Programma in C cicli if,for while

    #include<stdio.h>
    #include<ctype.h>
    #define MAX 300
    
    int len(char *s)
    {
        int i=0;
        while(s[i]!='\0')
            i++;
    
        return i;
    }
    
    int negativo(char* str)
    {
        int i,j,l,counternon=0,counterfalse=0,countergen=0, countergen1=0, countergen2=0, countergen3=0;
    
        char* A="NON";
        char* B="FALSO";
    
        for(i=0;i<len(str);i++)
            {
                str[i]=toupper(str[i]);
    
                if(isalpha(str[i])==0) //se è un carattere speciale mettilo uguale a zero
                    str[i]='0';
            }
        printf("\n%s\n",str);
    
        for(i=0;i<len(A);i++)       //questa prima parte è se NON è a inizio stringa
            {
                if( str[i]==A[i] )
                    countergen1++;
            }
        if (countergen1==3)
            {
                if( str[len(A)]=='0' || str[len(A)]=='\0' )
                    counternon++;
            }
    
        for(i=0;i<len(B);i++)       //questa prima parte è se FALSO è a inizio stringa
            {
                if( str[i]==B[i] )
                    countergen2++;
            }
        if (countergen2==5)
            {
                if( str[len(B)]=='0' || str[len(B)]=='\0' )
                    counterfalse++;
            }
    
    
    
        for(i=0;i<len(str);i++)         //questa se NON è in mezzo o per ultima parola
        {
            countergen=0;
            if (str[i]=='0')
                {
                    for( j=0;j<len(A);j++ )
                    {
                        if (A[j]==str[i+1+j])
                            countergen++;
                    }
                    if(countergen==len(A))
                        {
                            if (str[i+4] =='0' || str[i+4]=='\0')
                            counternon++;
                        }
                }
        }
    
        for(i=0;i<len(str);i++)         //questa se FALSO è in mezzo o per ultima parola
        {
            countergen3=0;
            if (str[i]=='0')
                {
                    for( j=0;j<len(B);j++ )
                    {
                        if (B[j]==str[i+1+j])
                            countergen3++;
                    }
                    if(countergen3==len(B))
                        {
                            if (str[i+6] =='0' || str[i+6]=='\0')
                            counterfalse++;
                        }
                }
        }
    
        printf("\n%d falso e %d non", counterfalse, counternon);
    
        if( (counternon + counterfalse)%2 == 0 )
            return 0;
    
    return 1;
    }
    
    
    int main()
    {
        char str[MAX], c;
    
        int i=0;
    
        puts("Inserisci una linea di testo:\n");
    
        while((c=getchar())!='\n')
             str[ i++ ] = c;
    
        str[i] = '\0'; /* termina la stringa */
    
        printf("\nLa funzione ritorna:\n%d\n", negativo(str));
    
        return 0;
    }
    
    ho risolto così, però sono molto insoddisfatto e scoraggiato.. non riesco a capire come gestire al meglio gli strumenti che ho per poter scrivere un buon codice ed elegante e non così esteso per esercizi così banali.. è vero che le consegne che mi vengono date sono molto restrittive (non potendo usare string.h tutti i paragoni tra stringhe devo farmeli con cicli if e for) però mi sembra di ricercare sempre la strada più contorta per arrivare alla soluzione e questo mi fa sentire un idiota. Magari molti storceranno il naso a vedere una schifezza di codice scritto così (eppur funziona)..
    Ho dovuto "disobbedire" alla consegna di usare scanf in quanto digitando una stringa del tipo "il nonno non è vero" al primo spazio scanf mi considera la mia stringa solo come "il" e quindi ecco getchar.
    Sarei davvero grato di poter imparare da molti di voi che fanno di questa materia un'arte e uno strumento molto potente.
    Buon week-end a tutti e alla prossima.
  • Re: Programma in C cicli if,for while

    zanna_5 ha scritto:


    non riesco a capire come gestire al meglio gli strumenti che ho per poter scrivere un buon codice ed elegante e non così esteso per esercizi così banali..
    Non si dèe adunqe l' uomo contentare di fare le cose buone, ma dèe studiare di farle anco leggiadre.

    zanna_5 ha scritto:


    ho risolto così, però sono molto insoddisfatto e scoraggiato..
    Secondo me stai andando benone. Continua cosi, nessuno nasce imparato.
Devi accedere o registrarti per scrivere nel forum
4 risposte