+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 8 su 8

[C] Input caratteri ed elenco ordinato senza ripetizioni

  1. #1
    Giovannir non è in linea Novello
    Salve a tutti, vi spiego subito il mio problema.
    vorrei realizzare un programma, che prendendo da tastiera una serie di lettere, le elenchi in ordine di priorità senza ripetere lettere già elencate in precedenza.

    al mio via, vengono premute delle lettere, vedendole su schermo in una riga:

    asdfjgkdjg // così per es.

    successivamente voglio che il programma li elenchi in questo modo:

    a
    s
    d
    f
    j
    g
    k

    eliminando dall'elenco le lettere già posizionate.

    ho provato ad utilizzare una stringa che contenga ciò che digito da tastiera.
    e poi successivamente elencarli solamente, ma sembra che si incasini il programma.
    avete qualche idea?

  2. #2
    L'avatar di bottomap
    bottomap non è in linea Amanuense
    Ciao,

    La sezione Presentazioni e Saluti non è la più indicata per proporre domande di carattere tecnico.
    Inoltre è bene che tu dia un'occhiata al regolamento e, come consigliato, che tu dia un titolo significativo alla discussione e proponga gli spezzoni significativi del codice che stai cercando di utilizzare.

    Riguardo alla sezione, sposto io per questa volta. Stai più attento in futuro.
    ℹ️ Leggi di più su bottomap ...

  3. #3
    Giovannir non è in linea Novello
    Hai perfettamente ragione, per questo mi scuso. ho riletto attentamente il regolamento.

    Purtroppo il mio problema principale è quello di non riuscire a scomporre ed elencare le lettere che prendo da tastiera.
    Penso si debba utilizzare una stringa. Ma non riesco a scrivere il programma.

  4. #4
    L'avatar di bottomap
    bottomap non è in linea Amanuense
    Ciao,

    Riguardo al problema in sé, al volo mi vengono in mente due strade:

    1) Più prolissa e sicuramente ridondante, che però ti pone davanti il problema di implementare un piccolo algoritmo di ricerca e, opzionalmente, di ordinamento:
    In sostanza ottieni in un buffer la stringa di input e cominci a scorrerla.
    Mantieni un buffer dei caratteri che hai già stampato a schermo (o memorizzati in un ulteriore buffer per una stampa successiva) ed ogni volta, prima di stampare un nuovo carattere, lo cerchi in tale buffer per verificare se lo stesso è già stato stampato.
    Opzionalmente, se mantieni il buffer dei caratteri già stampati ordinato, la ricerca potrebbe beneficiarne.

    2) Più performante, con uno spreco maggiore di memoria, opzionalmente ottimizzabile:
    Ottieni la stringa in input in un buffer (o la processi via via)
    Mantieni un array di 255 interi inizialmente pieno di zeri
    Utilizzi il carattere come indice all'array. Se il valore dell'array in quel punto è 0, non hai ancora usato il carattere, lo usi (lo stampi o lo piazzi nel buffer di output) ed imposti il valore nell'array ad 1. Se invece il valore è già 1 significa che hai già usato/stampato quel carattere in precedenza.
    La cosa è ottimizzabile se invece di un array di interi lavori con i bit (alla fine hai bisogno di 1 solo bit per rappresentare l'informazione e non di 8).
    Ulteriore ottimizzazione è ridurre la dimensione dell'array. Dei 255 possibili codici ascii, solo una parte saranno ricevuti da tastiera, quindi puoi diminuire il dominio dei possibili indici e di conseguenza la dimensione dell'array stesso.

    Ciaociao
    ℹ️ Leggi di più su bottomap ...

  5. #5
    Giovannir non è in linea Novello
    Grazie per la risposta. Diciamo di aver capito come fare, ma nel compilarlo ho qualche dubbio.
    Inoltre mandando in esecuzione questo listato, inserendo le lettere e premendo invio, va in crash, smette di funzionare.

    i=a[1] è possibile farlo? se voglio vedere la seconda cella della stringa a?

    mi scuso se troverete errori grossolani.

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

    int main(int argc, char *argv[])
    {

    char a[100],i;
    printf(" inserire lettere_\b");
    scanf("%s",a);
    i=a[1];
    printf("tasti premuti: %s\n",i);
    system("PAUSE");
    return 0;
    }

  6. #6
    L'avatar di bottomap
    bottomap non è in linea Amanuense
    Ciao,

    Qualche nozione di base, che comunque sottolinea che non hai saldi i fondamenti, per cui conviene (ri)dare un'occhiata agli stessi prima di proseguire:
    - Se ottieni un crash, hai scritto qualcosa di certamente errato. Individuare quale sia di preciso l'errore che porta al crash rappresenta un ottimo esercizio.
    - Le funzioni di input/output della libreria standard utilizzano segnaposto di formato specifici per tipi specifici. In particolare %s viene utilizzato per le stringhe.
    - Mentre un vettore di char è una stringa, un char non è altro che un numero.
    - Gli indici dei vettori in C, come in qualsiasi altro linguaggio moderno partono da zero (0). La seconda cella della stringa è a[1].
    - Un assegnamento (i=a[1]) è sempre possibile se i due tipi sono concordi e se, nel caso degli array, l'elemento in posizione N esiste.
    - Per effettuare operazioni nelle quali scorri carattere per carattere una stringa, o altro tipo di array, dovrai usare un costrutto apposito (un ciclo for, while o do).
    - Il tipo di un dato è un concetto fondamentale in un linguaggio, come il C, fortemente tipizzato. Quest'ultimo punto ti può suonare un po'esotico, ma ti assicuro che rappresenta spesso uno scoglio ostico nella fase di apprendimento, e una distrazione in questo senso è fonte di una buona metà degli errori di programmazione che ho visto (compreso, in maniera relativamente marginale, il crash che descrivi). L'altra metà riguarda usi troppo disinvolti di puntatori e memoria, ma questa è una storia che arriverai ad apprezzare più avanti.

    Certamente non è ancora il momento di affrontare ricerca e ordinamento come ho prospettato più sopra. Forse è bene concentrarsi prima sulle basi e, per cercare un elemento in un array ricorrere ad una normalissima ricerca sequenziale. Rendere modulare il codice ed introdurre funzioni può essere un accorgimento che ti semplifica la vita durante lo sviluppo... fallo non appena sei pronto ad affrontare l'argomento "funzioni".

    Riguardo alla scanf potremmo aprire un capitolo a sé, visto che è una funzione di libreria molto mal congegnata. Se hai necessità di inserire una linea da tastiera in un buffer, semplicemente usa la gets(). Per mantenere la cosa simmetrica, potresti usare l'analoga puts, anche se la printf fa in genere tranquillamente il suo lavoro. Questa, a differenza delle altre "dritte", non è tanto una nozione specifica, quanto frutto di esperienza nell'uso delle stesse... la scanf andrebbe in qualche modo abolita.

    Ciaociao
    ℹ️ Leggi di più su bottomap ...

  7. #7
    Giovannir non è in linea Novello
    Ho provato nuovamente, sono riuscito ad avere l'elenco ordinato delle lettere immesse da tastiera.
    però a volte non capisco per quale motivo,nella 4a riga, mi spunti una lettera che non ho digitato e che non si trova quindi nella cella.
    è una bozza devo ancora migliorarlo.

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

    int main(int argc, char *argv[])
    {

    char a[10],l;
    int i;

    printf("Inserire lettere:\t_\b");
    scanf("%s",a);
    for(i=0;i<=10;i++){
    l=a[i];
    printf("\n%i => %c\n",i,l);
    }
    system("PAUSE");
    return 0;
    }

  8. #8
    L'avatar di bottomap
    bottomap non è in linea Amanuense
    Ciao,

    Il motivo è relativamente semplice... il tuo ciclo viene eseguito per 11 volte, anziché 10 come ti aspettavi, proprio in virtù degli indici 0-based di cui abbiamo parlato. Inoltre, hai strutturato il ciclo in modo che vada avanti per tutte e 10 (11) le posizioni di a, mentre non è detto che in a ci siano 10 caratteri.
    I caratteri strani che vedi sono bytes "sporchi" presenti in memoria.
    Sarebbe più opportuno ciclare finché non trovi il terminatore stringa (carattere '\0' con valore numerico 0) oppure recuperando la lunghezza della stessa con opportuna funzione, sempre della stdlib (la quale, per altro, internamente non fa altro che cercare il terminatore mentre incrementa un contatore).

    Inoltre, 10 è un valore forse un po'piccolo. Se inserisci più di 10 caratteri dovresti ottenere un bel crash. Se non sai a priori la dimensione dei dati inseriti, per adesso è bene abbondare con lo spazio... una riga intera a schermo in modalità console sono 80 caratteri.

    Ricorda anche di prevedere uno spazio aggiuntivo per il terminatore \0. Se vuoi X caratteri, il buffer deve avere dimensione X+1.

    Ciaociao
    Ultima modifica di bottomap; 20-07-2011 09:19 
    ℹ️ Leggi di più su bottomap ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Stampa unione in MsWord per creare un elenco ordinato
    Da hayabusa_65 nel forum Microsoft Word
    Risposte: 1
    Ultimo Post: 03-07-2014, 22:46
  2. Permutazioni senza ripetizioni di 7 numeri
    Da xxx75xxx nel forum Microsoft Excel
    Risposte: 4
    Ultimo Post: 16-04-2013, 21:24
  3. Risposte: 3
    Ultimo Post: 31-05-2011, 13:46
  4. [excel] elenco automatico ordinato
    Da air9one nel forum Microsoft Excel
    Risposte: 2
    Ultimo Post: 27-03-2010, 14:12
  5. [HTML]Elenco li con input checkbox
    Da thefoxwhite nel forum HTML, CSS e JavaScript
    Risposte: 16
    Ultimo Post: 08-04-2006, 10:48