Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - PROBLEMA CODICE INSERTION SORT
Forum - C/C++ - PROBLEMA CODICE INSERTION SORT

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
Iprogrammer (Normal User)
Newbie


Messaggi: 2
Iscritto: 27/04/2020

Segnala al moderatore
Postato alle 21:40
Lunedì, 27/04/2020
Ciao a tutti!
Premetto che ho iniziato da poco a studiare il linguaggio di programmazione C, però sono a conoscenza delle basi fondamentali per capire un semplice codice.
Ho un problema con il codice che dovrebbe effettuare l'insertion sort di alcuni valori di input forniti dall'utente. Il codice è il seguente:


Codice sorgente - presumibilmente C++

  1. /*
  2.  * codice per insertion sort
  3.  * descrizione: https://it.wikipedia.org/wiki/Insertion_sort
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8.  
  9. #define MAX_INPUT 10
  10.  
  11. void estrai_dati(int ac, char **av, int *vett, int *lung)
  12. {
  13.         *lung = ac - 1;
  14.  
  15.         for (int i = 0; i < *lung; ++i)
  16.                 vett[i] = atoi(av[i+1]);
  17. }
  18.  
  19. void fai_spazio(int posizione, int *vett, int lung)
  20. {
  21.         for (int j = lung - 1; j > posizione; ++j)
  22.                 vett[j] = vett[j-1];
  23. }
  24.  
  25. void inserisci(int nuovo_dato, int num_dati_ord, int *vett)
  26. {
  27.         if (num_dati_ord = 0)  { // il vettore è vuoto, facile
  28.                 vett[0] = nuovo_dato;
  29.                 return;
  30.         }
  31.  
  32.         for (int i = 0; i < num_dati_ord; ++i)  {
  33.                 if (nuovo_dato < vett[i])  {
  34.                         // sposta da vett[i] in poi di un posto sulla destra
  35.                         // prima di inserire il nuovo_dato
  36.                         fai_spazio(i, vett, num_dati_ord);
  37.                         vett[i] = nuovo_dato;
  38.                         return;
  39.                 }
  40.         }
  41. }
  42.  
  43. void ordina_dati(const int *dati_non_ordinati, int *dati_ordinati)
  44. {
  45.         int num_dati = sizeof(dati_non_ordinati) / sizeof(dati_non_ordinati[0]);
  46.         for (int i = 0; i < num_dati; ++i)
  47.                 inserisci(dati_non_ordinati[i], i, dati_ordinati);
  48. }
  49.  
  50. void stampa_vettore(const int *vett, int lung)
  51. {
  52.         for (int i = 0; i < lung; ++i)
  53.                 printf("%d ",vett[i]);
  54.         printf("\n");
  55. }
  56.  
  57. int main(int argc, char **argv)
  58. {
  59.         if (argc > MAX_INPUT + 1) {
  60.                 printf("Numero massimo di input %d\n", MAX_INPUT);
  61.                 return -1;
  62.         }
  63.         int dati_input[MAX_INPUT] = {0};
  64.         int dati_ordinati[MAX_INPUT] = {0};
  65.         int num_dati = 0;
  66.  
  67.         estrai_dati(argc, argv, dati_input, &num_dati);
  68.         ordina_dati(dati_input, dati_ordinati);
  69.         stampa_vettore(dati_ordinati, num_dati);
  70.         return 0;
  71. }



Se per esempio inserisco i valori "2 9 1 4 3 6" l'output finale mi restituisce "0 0 0 0 0 0" invece di "1 2 3 4 6 9".
Non capisco dov'è il problema e quali siano gli errori.
Qualcuno può aiutarmi?

Grazie.

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 0:32
Martedì, 28/04/2020
Testo quotato

Postato originariamente da Iprogrammer:
Ciao a tutti!
Premetto che ho iniziato da poco a studiare il linguaggio di programmazione C, però sono a conoscenza delle basi fondamentali per capire un semplice codice.



Di C ne so veramente poco, non so gestire gli input, copiare matrici e cambiarne la dimensione ecc ecc.

Ma visto che queste cose base le sai fare ti propongo un Sort Insertion che avevo già fatto in C#, ma tradotto in C++ per fartelo vedere.
L'esempio è per l'algoritmo, il resto è minimale:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define MAX_INPUT 10
  5.  
  6. void stampa_vettore(const int *vett, int lung)
  7. {
  8.         for (int i = 0; i < lung; ++i)
  9.                 printf("%d ", vett[i]);
  10.         printf("\n");
  11. }
  12.  
  13. int main(int argc, char **argv)
  14. {
  15.         int dati_input[MAX_INPUT] = { 0 };
  16.                
  17.         dati_input[0] = 5;
  18.         dati_input[1] = 8;
  19.         dati_input[2] = 2;
  20.         dati_input[3] = 1;
  21.         dati_input[4] = 6;
  22.         dati_input[5] = 98;
  23.         dati_input[6] = 65;
  24.         dati_input[7] = 3;
  25.         dati_input[8] = 12;
  26.         dati_input[9] = 43;
  27.  
  28.         int provv, c1, c2 = 0;
  29.  
  30.         for (c1 = 1; c1 < MAX_INPUT; c1++)
  31.         {
  32.                 provv = dati_input[c1];
  33.                 c2 = c1 - 1;
  34.                 while ((dati_input[c2] > provv) && (c2 >= 0))
  35.                 {
  36.                         dati_input[c2 + 1] = dati_input[c2];
  37.                         c2--;
  38.                 }
  39.                 dati_input[c2 + 1] = provv;
  40.         }
  41.  
  42.         printf("Sort insertion \n");
  43.         stampa_vettore(dati_input, MAX_INPUT);
  44.  
  45.         return 0;
  46. }


Ultima modifica effettuata da Carlo il 28/04/2020 alle 0:49


in programmazione tutto è permesso
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 6:33
Martedì, 28/04/2020
Guarda che questa


int num_dati = sizeof(dati_non_ordinati) / sizeof(dati_non_ordinati[0]);

se usata all'interno della funzione NON restituisce il numero di elementi del vettore. Passa esplicitamente il numero come argomento dal main.

Ultima modifica effettuata da nessuno il 28/04/2020 alle 6:33


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 12:55
Martedì, 28/04/2020
Testo quotato

Postato originariamente da nessuno:

Guarda che questa


int num_dati = sizeof(dati_non_ordinati) / sizeof(dati_non_ordinati[0]);

se usata all'interno della funzione NON restituisce il numero di elementi del vettore. Passa esplicitamente il numero come argomento dal main.



Domande C
sizeof restituisce la grandezza del vettore in Bytes?
*vett  significa che il vettore è passato per riferimento?
**av che significa? char per riferimento?

nel codice postato da Iprogrammer, dov'è l'input che richiede i dati all'utente?
Il main deve essere chiamato da un programma esterno che passa gli input attraverso argc e **argv?
int main(int argc, char **argv)

Grazie a tutti i volenterosi che possono togliermi queste curiosità... :D


in programmazione tutto è permesso
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 14:50
Martedì, 28/04/2020
No sizeof restituisce la grandezza del tipo di dato dell'oggetto indicato

Per puntatore

Per doppio puntatore

L'input proviene dalla linea di comando a cui si accede con argv argc


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 15:34
Martedì, 28/04/2020

  int num_dati = sizeof(dati_non_ordinati) / sizeof(dati_non_ordinati[0]);


questa linea che cosa dovrebbe eseguire?

:D


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 15:39
Martedì, 28/04/2020
Testo quotato

Postato originariamente da Carlo:

Testo quotato

Postato originariamente da nessuno:

Guarda che questa


int num_dati = sizeof(dati_non_ordinati) / sizeof(dati_non_ordinati[0]);

se usata all'interno della funzione NON restituisce il numero di elementi del vettore. Passa esplicitamente il numero come argomento dal main.



Domande C
sizeof restituisce la grandezza del vettore in Bytes?
*vett  significa che il vettore è passato per riferimento?
**av che significa? char per riferimento?

nel codice postato da Iprogrammer, dov'è l'input che richiede i dati all'utente?
Il main deve essere chiamato da un programma esterno che passa gli input attraverso argc e **argv?
int main(int argc, char **argv)

Grazie a tutti i volenterosi che possono togliermi queste curiosità... :D



Carlo nel C si usano i puntatori

puntano per riferimento allo spazio di memoria occupato


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 21:14
Martedì, 28/04/2020
Testo quotato

Postato originariamente da Ultimo:

Carlo nel C si usano i puntatori

puntano per riferimento allo spazio di memoria occupato  



Si correggo un po' la domanda: se metto l'asterisco significa che è un puntatore? (nessuno dice si)
E se è un puntatore che punta allo spazio di memoria, da qualsiasi parte del prigramma modifico il dato, il dato è modificato per tutti, come fosse una variabile pubblica!

Se non metto l'asterico, invece non è un puntatore?
E la variabile diventa locale?

Il doppio asterisco invece a che serve? (nessuno dice doppio puntatore) mi sfugge il significato.

Non voglio imparare il C, ma saperne qualcosa mi piace.

Non posso entrare nel merito, ma ho anche un'altra perplessità alla riga 27 Iprogrammer scrive:

if (num_dati_ord = 0)  { // il vettore è vuoto, facile
                vett[0] = nuovo_dato;
                return;

non avrebbe dovuto scrivere:

if (num_dati_ord == 0)  { // il vettore è vuoto, facile
                vett[0] = nuovo_dato;
                return;

Per fare un confronto?

Ultima modifica effettuata da Carlo il 28/04/2020 alle 21:23


in programmazione tutto è permesso
PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 22:03
Martedì, 28/04/2020
Si avrebbe dovuto scrivere:

if (num_dati_ord == 0)  { // il vettore è vuoto, facile
                vett[0] = nuovo_dato;
                return;

:pat:


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo