Programmare in C o C++?

Messaggioda astrolabio95 » 16/03/2019, 12:16

Salve a tutti,

Sono uno studente di ing. Aerospaziale alle prese con gli ultimi esami della triennale.
Tra questi figura per me il temutissimo Elementi di Informatica da 6 CFU..

Ho seguito questo corso tempo fa, con un professore che usava la programmazione in C accompagnato da Eclipse come IDE.
Purtroppo non sono mai riuscito a dare l'esame, e nel frattempo è cambiato professore.
Questo nuovo professore, anche se accetta programmi in C, ha basato il corso sull'utilizzo del C++ accompagnato da DevC++ come IDE.

Avendo buone conoscenze del linguaggio C, ho affrontato ieri l'esame ma con scarsi risultati, tant'è che mi sono ritirato.

A detta del professore, che ha capito la mia situazione, avrei potuto risolvere brillantemente l'esame usando il C++, perché strutturalmente il mio programma era buono ma, siccome la traccia era basata tutta su array di caratteri, ho fatto un po' di casini in quanto la funzione scanf dà un po' di difficoltà in questo senso e, all'epoca, trattammo solo stringhe con annessa libreria.

Vi chiedo, concettualmente è complicato il C++?
Cioè, mi conviene imparare da zero questo linguaggio, oppure devo approfondire meglio la questione array di caratteri in C?
Il fatto è che il linguaggio C lo padroneggio abbastanza bene quando si tratta di gestioni di sequenze e gestioni anagrafiche, e se questo tipo di approccio fosse trasportabile in C++ sarebbe ottimo...

Grazie a tutti.
astrolabio95
Junior Member
Junior Member
 
Messaggio: 100 di 296
Iscritto il: 27/11/2015, 19:39

Re: Programmare in C o C++?

Messaggioda vict85 » 16/03/2019, 12:57

Il tuo post mi lascia un po' perplesso, prima dici che hai "buone conoscenze del linguaggio C" e poi affermi che il problema è che "la traccia era basata tutta su array di caratteri". Comprendo che il tuo problema è che il tuo vecchio professore ti ha insegnato le stringhe usando una qualche libreria, ma le stringhe come array di caratteri sono un concetto del C e non propriamente del C++ in cui, in genere, si usa la classe string della libreria standard. Detto questo se il problema è che non sapevi lavorare sulle stringhe senza le varie strlen, strcpy, direi che il tuo problema è di tipo algoritmico e non di linguaggio (perché le persone usando strlen e strcpy per semplicità e non perché non sappiano implementarne una1).

Tra l'altro non mi sembra che il nuovo professore ti insegni il C++ usato davvero a livello professionale e quindi se lo vuoi studiare solo per l'esame è inutile (e ti confonderebbe solo di più). Quello che penso insegni il tuo professore, penso sia il sottoinsieme C del C++ più qualche funzione come cout e cin che permettono un I/O più intuitivo.

Per curiosità, la traccia qual era?

Note

  1. Una seconda ragione potrebbe essere per performance dato che quelle funzioni potrebbero essere state scritte in assembly usando SSE/SSE2/AVX o altre istruzioni non facilmente utilizzabili dal C.
vict85
Moderatore
Moderatore
 
Messaggio: 9565 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: Programmare in C o C++?

Messaggioda astrolabio95 » 16/03/2019, 13:23

vict85 ha scritto:Il tuo post mi lascia un po' perplesso, prima dici che hai "buone conoscenze del linguaggio C" e poi affermi che il problema è che "la traccia era basata tutta su array di caratteri". Comprendo che il tuo problema è che il tuo vecchio professore ti ha insegnato le stringhe usando una qualche libreria, ma le stringhe come array di caratteri sono un concetto del C e non propriamente del C++ in cui, in genere, si usa la classe string della libreria standard. Detto questo se il problema è che non sapevi lavorare sulle stringhe senza le varie strlen, strcpy, direi che il tuo problema è di tipo algoritmico e non di linguaggio (perché le persone usando strlen e strcpy per semplicità e non perché non sappiano implementarne una[nota]Una seconda ragione potrebbe essere per performance dato che quelle funzioni potrebbero essere state scritte in assembly usando SSE/SSE2/AVX o altre istruzioni non facilmente utilizzabili dal C.).

Tra l'altro non mi sembra che il nuovo professore ti insegni il C++ usato davvero a livello professionale e quindi se lo vuoi studiare solo per l'esame è inutile (e ti confonderebbe solo di più). Quello che penso insegni il tuo professore, penso sia il sottoinsieme C del C++ più qualche funzione come cout e cin che permettono un I/O più intuitivo.

Per curiosità, la traccia qual era?


Ciao ti ringrazio per la risposta.

Ecco la traccia:


Immagine


La mia difficoltà è stata quella di inizializzare il vettore di caratteri, immettendo il carattere uno alla volta tramite

for (i=0;i<n;i++)
scanf ("%c", &V[i])

ma evidentemente è una metodologia sbagliata!

Col vecchio prof utilizzavo getchar() per le stringhe, ma qui non potevo usare questo approccio qui.

Inoltre la traccia non permetteva l'accesso alle librerie string.h ma bisognava fare tutto da soli...

Dalle slide del professore vedo invece che inizializza con cin e cout, senza specificare alcun identificatore.
astrolabio95
Junior Member
Junior Member
 
Messaggio: 101 di 296
Iscritto il: 27/11/2015, 19:39

Re: Programmare in C o C++?

Messaggioda astrolabio95 » 18/03/2019, 11:50

vict85 ha scritto:Tra l'altro non mi sembra che il nuovo professore ti insegni il C++ usato davvero a livello professionale e quindi se lo vuoi studiare solo per l'esame è inutile (e ti confonderebbe solo di più). Quello che penso insegni il tuo professore, penso sia il sottoinsieme C del C++ più qualche funzione come cout e cin che permettono un I/O più intuitivo.


Hai proprio centrato il punto!
Quindi mi conviene restare sul C?
astrolabio95
Junior Member
Junior Member
 
Messaggio: 102 di 296
Iscritto il: 27/11/2015, 19:39

Re: Programmare in C o C++?

Messaggioda vict85 » 18/03/2019, 17:49

Si, ritengo che non vi sia alcun reale vantaggio a passare al C++. La prima parte del problema sarebbe uguale se fosse con i numeri al posto dei caratteri. Devo ammettere che non comprendo il testo del punto 5 e che non condivido l'approccio generale al problema.

Uno dei problemi del testo è che non dice come i caratteri sono immessi da tastiera, insomma in che formato. Comunque per i caratteri è meglio usare getchar( ).
vict85
Moderatore
Moderatore
 
Messaggio: 9569 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: Programmare in C o C++?

Messaggioda astrolabio95 » 18/03/2019, 18:07

vict85 ha scritto:Si, ritengo che non vi sia alcun reale vantaggio a passare al C++. La prima parte del problema sarebbe uguale se fosse con i numeri al posto dei caratteri. Devo ammettere che non comprendo il testo del punto 5 e che non condivido l'approccio generale al problema.

Uno dei problemi del testo è che non dice come i caratteri sono immessi da tastiera, insomma in che formato. Comunque per i caratteri è meglio usare getchar( ).


Ti ringrazio per la risposta.
Quindi mi conviene trattare questo array come se fosse un vettore di interi?
E quindi devo ''dire'' al programma di inserire, alla fine dell'immissione, il carattere '\0'?

Il fatto è che la funzione getchar() non gli è andata a genio, da qui il ''suggerimento'' di presentarmi al prossimo appello..
astrolabio95
Junior Member
Junior Member
 
Messaggio: 103 di 296
Iscritto il: 27/11/2015, 19:39

Re: Programmare in C o C++?

Messaggioda astrolabio95 » 18/03/2019, 18:55

Secondo te questo approccio può essere corretto?


Codice:
#include <stdio.h>
#define MAX_C 20

int main(void) {
  char V [MAX_C];
  int n;
  int i;
  char invio; // Mi serve per raccogliere l'invio battuto dall'utente

  printf ("\nQuanti caratteri desideri inserire? ");
  scanf ("%d", &n);
 
  for (i=0;i<n;i++) {
    printf ("\nInserisci %d° carattere: ", i+1);
    scanf ("%c", &invio);
    scanf ("%c", &V[i]);
  }
 
 for (i=0; i<n; i++) {
   printf ("\nIl %d° carattere e': %c\n", i+1, V[i]);
 }
  return 0;
}
astrolabio95
Junior Member
Junior Member
 
Messaggio: 104 di 296
Iscritto il: 27/11/2015, 19:39

[C++, C] Re: Programmare in C o C++?

Messaggioda vict85 » 18/03/2019, 22:18

:roll: L'uso di scanf per i caratteri è qualcosa che proprio non lo posso vedere. Il modo in cui si dovrebbe gestire la lettura di dati dalla console è quello di leggere i dati riga per riga e di interpretarli. Per capirci questo è come implementerei la prima parte:

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

int carica_numero();
char carica_carattere( int i );

void print_reverse( char * restrict v, int N );

int main(void)
{
    int N = carica_numero( );
    if( N == 0 )
    {
        return EXIT_FAILURE;
    }

    char * V = (char*)malloc( N + 1 );
    if( !V )
    {
        fputs("Errore nell'allocazione della memoria\n", stderr);
        return EXIT_FAILURE;
    }

    int i = 0;
    do
    {
        char c = carica_carattere( i );
        if( c == '\n' )
        {
            free( V );
            return EXIT_FAILURE;
        }
        V[i] = c;
    } while( ++i != N );
    V[i] = '\0';

    print_reverse( V, N );

    free(V);
}

int carica_numero()
{
    char buffer[30];
    fputs("Quanti caratteri desideri inserire:\t", stdout);
    if( fgets(buffer, sizeof(buffer), stdin) == NULL)
    {
        fputs("Errore nella lettura dei dati\n", stderr);
        return 0;
    }
    int N = 0;
    if (sscanf(buffer, "%d", &N) == 1 && N > 0)
    {
        printf("Hai inserito %d\n", N);
        return N;
    }
    fputs("Il valore inserito non e' valido.\n", stderr);
    return carica_numero( );
}

char carica_carattere( int i )
{
    char buffer[4];
    printf("Inserire il carattere %d-esimo:\t", i);
    if( fgets(buffer, sizeof(buffer), stdin ) == NULL )
    {
        fputs("Errore nella lettura dei dati\n", stderr);
        return '\n';
    }
    if( buffer[1] == '\n' && buffer[2] == '\0' )
    {
        return buffer[0];
    }
    fputs("Errore inserimento carattere."
          " Per favore inserisci un singolo carattere"
          " e poi premi invio.\n", stderr);
    return carica_carattere( i );
}

void print_reverse( char * restrict v, int N )
{
    if( !v || N == 0 ) return;
    while( N-- )
    {
        putchar( v[N] );
    }
    puts("");
}


Ovviamente io ho fatto attenzione a tutta una serie di errori che generalmente vengono ignorati negli esami come il tuo.
Ultima modifica di vict85 il 19/03/2019, 22:08, modificato 1 volta in totale.
vict85
Moderatore
Moderatore
 
Messaggio: 9571 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: Programmare in C o C++?

Messaggioda astrolabio95 » 19/03/2019, 14:30

vict85 ha scritto::roll: L'uso di scanf per i caratteri è qualcosa che proprio non lo posso vedere. Il modo in cui si dovrebbe gestire la lettura di dati dalla console è quello di leggere i dati riga per riga e di interpretarli. Per capirci questo è come implementerei la prima parte:

Ovviamente io ho fatto attenzione a tutta una serie di errori che generalmente vengono ignorati negli esami come il tuo.


Ti ringrazio per la risposta precisa, è davvero molto molto di più di quello trattato durante il corso ma ho capito la "logica"..
astrolabio95
Junior Member
Junior Member
 
Messaggio: 105 di 296
Iscritto il: 27/11/2015, 19:39

Re: Programmare in C o C++?

Messaggioda vict85 » 19/03/2019, 15:33

Secondo me ti fai solo spaventare dall'uso della memoria dinamica (malloc e free) e dalle librerie di I/O che non conosci. Ti basta leggere cosa fanno qui https://en.cppreference.com/w/c/io .

Per il resto il C++ che ti chiede il professore non è comunque molto difficile da imparare perché richiederà praticamente solo di guardarti come usare cout e cin . D'altra parte cin ha dei difetti in comune con scanf, ma è per certi versi più facile da usare.
vict85
Moderatore
Moderatore
 
Messaggio: 9576 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Prossimo

Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite