Pagina 1 di 1

[C] Dubbio esercizio funzione ricorsiva

MessaggioInviato: 25/11/2018, 12:19
da nick_10
Ciao! Di nuovo funzioni ricorsive...questa volta il mio programma dovrebbe andar (quasi) bene.
Volevo sapere da voi se poteva andare. Il testo è il seguente:
"Scrivere una funzione ricorsiva che
• legga in input una sequenza di caratteri alfabetici di lunghezza arbitraria, che termina quando viene immesso un carattere non alfabetico, e che
• stampi ogni carattere minuscolo e stampi invece ogni carattere maiuscolo solo se `e preceduto da un carattere minuscolo.
• restituisca il numero di elementi scartati
Se ad esempio la sequenza fosse b g R u C E F j P 9 la funzione dovrebbe stampare b g R u C j P e restituire 2."
Il problema è sempre il solito delle discussioni precedenti e come sempre mi sono appoggiato sul main per leggere il primo carattere che diventerà il carattere precedente nella ricorsione.
Però, per stamparlo l'unico modo che ho trovato è quello di farlo nel main. Ecco:
Codice:
#include <stdio.h>
int sequenzaalfabeticaric(char prev){
    char  c;
    scanf("%c",&c);
    if((c>='a' && c<='z')||(c>='A' && c<='Z')){
        if((c>='a' && c<='z')){
            printf("%c",c);
            return 0+sequenzaalfabeticaric(c);
        }
        else if((c>='A' && c<='Z')&&(prev>='a' && prev<='z')){
            printf("%c",c);
            return 0+sequenzaalfabeticaric(c);
        }
        else return 1+sequenzaalfabeticaric(c);
    }
    else{
        printf("Sequenza modificata: \n");
        return 0;
    }
}
int main() {
    char c;
    scanf("%c",&c);
    printf("%c",c);   //problema di stampa del primo valore
    printf("Il numero di elementi scartati è:%d\n",sequenzaalfabeticaric(c));
    return 0;
}

Re: [C] Dubbio esercizio funzione ricorsiva

MessaggioInviato: 25/11/2018, 16:20
da Super Squirrel
Io farei qualcosa del genere:
Codice:
#include <iostream>

using namespace std;

int fun(bool prev_is_lower = false)
{
    char c;
    cout << "--> ";
    cin >> c;
    bool curr_is_upper = c >= 'A' && c <= 'Z';
    if(curr_is_upper || (c >= 'a' && c <= 'z'))
    {
        if(!(curr_is_upper && !prev_is_lower))
        {
            cout << c << endl;
        }
        return !prev_is_lower * curr_is_upper + fun(!curr_is_upper);
    }
    return 0;
}

int main()
{
    cout << "CARATTERI SCARTATI: " << fun();
}


EDIT:
P.S.
mi sembra strano che il codice che hai postato ti faccia effettuare più di 1 inserimento... la scanf() nella funzione dovrebbe essere "ignorata", nel senso che dovrebbe leggere il carattere newline presente nel buffer di inserimento.

Re: [C] Dubbio esercizio funzione ricorsiva

MessaggioInviato: 25/11/2018, 17:12
da vict85
Mi sfugge della richiesta se l'input è qualcosa del tipo AsaAABbScedjfnkanfsdM oppure se tra i caratteri ci sono gli spazi. Dal modo in cui il tutto verrebbe visualizzato suppongo che si debba implementare la prima versione. Usando una funzione di appoggio invece che una variabile si può fare così:
Codice:
#include "ctype.h"
#include "stdio.h"

int strange_read();
int strange_read_state_2();

int main(void)
{
    int scartati = strange_read();
    printf("\nscartati=%d", scartati);
}

int strange_read()
{
    int ch = getc(stdin);
    if (ch == EOF || !isalpha(ch))
    {
        return 0;
    }

    if (islower(ch))
    {
        putc(ch, stdout);
        return strange_read_state_2();
    }
    return 1 + strange_read();
}

int strange_read_state_2()
{
    int ch = getc(stdin);
    if (ch == EOF || !isalpha(ch))
    {
        return 0;
    }
    putc(ch, stdout);
    if (isupper(ch))
    {
        return strange_read();
    }
    return strange_read_state_2();
}

Di fatto ho implementato una sorta di automa.

Re: [C] Dubbio esercizio funzione ricorsiva

MessaggioInviato: 25/11/2018, 21:17
da nick_10
Grazie a entrambi per le risposte.
Molte delle cose scritte però non le comprendo :roll:
Forse perché non ho fatto molte delle cose che avete scritto, ad esempio l'uso di altre librerie

Re: [C] Dubbio esercizio funzione ricorsiva

MessaggioInviato: 26/11/2018, 00:50
da Super Squirrel
In realtà il codice che ho postato non utilizza nessuna funzione/libreria particolare, semplicemente è scritto in C++.
Questa sarebbe la traduzione in C:
Codice:
#include <stdio.h>

int fun(int prev_is_lower)
{
    char c;
    printf("--> ");
    scanf(" %c", &c);
    int curr_is_upper = c >= 'A' && c <= 'Z';
    if(curr_is_upper || (c >= 'a' && c <= 'z'))
    {
        if(!(curr_is_upper && !prev_is_lower))
        {
            printf("%c\n", c);
        }
        return !prev_is_lower * curr_is_upper + fun(!curr_is_upper);
    }
    return 0;
}

int main()
{
    printf("CARATTERI SCARTATI: %d", fun(0));
    return 0;
}

o anche semplificando un po' la parte logica:
Codice:
#include <stdio.h>

int fun(int prev_is_lower)
{
    char c;
    printf("--> ");
    scanf(" %c", &c);
    int curr_is_upper = c >= 'A' && c <= 'Z';
    int curr_is_lower = c >= 'a' && c <= 'z';
    if(curr_is_upper || curr_is_lower)
    {
        if(curr_is_lower || (curr_is_upper && prev_is_lower))
        {
            printf("%c\n", c);
        }
        return !prev_is_lower * curr_is_upper + fun(curr_is_lower);
    }
    return 0;
}

int main()
{
    printf("CARATTERI SCARTATI: %d", fun(0));
    return 0;
}


Quasi dimenticavo... e per quanto riguarda la questione che ho sollevato nel P.S. del mio precedente post?

Re: [C] Dubbio esercizio funzione ricorsiva

MessaggioInviato: 26/11/2018, 13:19
da vict85
Quali funzioni non conosci del mio codice?

Re: [C] Dubbio esercizio funzione ricorsiva

MessaggioInviato: 26/11/2018, 22:35
da nick_10
@Super Squirrel per quanto riguarda il tuo P.S. , riesco a mettere più di un carattere perché l'input è da dare nella forma "idis" con tutte le lettere attaccate

@vict85 espressione del tipo "EOF" o "isalpha"...scusa la mia ignoranza ma mai incontrate :roll:

Re: [C] Dubbio esercizio funzione ricorsiva

MessaggioInviato: 27/11/2018, 10:06
da vict85
EOF sta per end of file, getc, getchar, fgetc e varie funzioni simili lo ritornano in caso di errore. Ha probabilmente più senso usarlo con i file. E siccome isalpha(EOF)==0 avrei anche potuto non metterlo.

isalpha, islower e isupper sono le funzioni dello standard per testare rispettivamente se un carattere è una lettera dell'alfabeto, se è minuscola e se è maiuscola. Se cerchi isalpha cppreference su Google ti trovi tutte le info (c'è la documentazione sia per il c++ che per il c).

Re: [C] Dubbio esercizio funzione ricorsiva

MessaggioInviato: 28/11/2018, 13:50
da nick_10
Grazie mille anche per gli spunti! Molto interessanti, ci studierò su