PROBLEMA [C] Problema codice insertion sort

Iprogrammer

Nuovo Utente
1
0
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:
C:
/*
* codice per insertion sort
* descrizione: https://it.wikipedia.org/wiki/Insertion_sort
*/

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

#define MAX_INPUT 10

void estrai_dati(int ac, char **av, int *vett, int *lung)
{
     *lung = ac - 1;

     for (int i = 0; i < *lung; ++i)
          vett = atoi(av[i+1]);
}

void fai_spazio(int posizione, int *vett, int lung)
{
     for (int j = lung - 1; j > posizione; ++j)
          vett[j] = vett[j-1];
}

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

     for (int i = 0; i < num_dati_ord; ++i)  {
          if (nuovo_dato < vett)  {
               // sposta da vett in poi di un posto sulla destra
               // prima di inserire il nuovo_dato
               fai_spazio(i, vett, num_dati_ord);
               vett = nuovo_dato;
               return;
          }
     }
}

void ordina_dati(const int *dati_non_ordinati, int *dati_ordinati)
{
     int num_dati = sizeof(dati_non_ordinati) / sizeof(dati_non_ordinati[0]);
     for (int i = 0; i < num_dati; ++i)
          inserisci(dati_non_ordinati, i, dati_ordinati);
}

void stampa_vettore(const int *vett, int lung)
{
     for (int i = 0; i < lung; ++i)
          printf("%d ",vett);
     printf("\n");
}

int main(int argc, char **argv)
{
     if (argc > MAX_INPUT + 1) {
          printf("Numero massimo di input %d\n", MAX_INPUT);
          return -1;
     }
     int dati_input[MAX_INPUT] = {0};
     int dati_ordinati[MAX_INPUT] = {0};
     int num_dati = 0;

     estrai_dati(argc, argv, dati_input, &num_dati);
     ordina_dati(dati_input, dati_ordinati);
     stampa_vettore(dati_ordinati, num_dati);
     return 0;
}

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.
Il codice non è stato scritto da me però devo sistemarlo cercando di mantenere la stessa struttura cosi com'è ora.

Qualcuno può aiutarmi?
Se qualcuno è in grado di riscriverlo correttamente e postarlo ne sarei veramente grato perchè è da giorni che tento di trovare una soluzione ma non ci sono ancora riuscito! :muro:
 
Ultima modifica da un moderatore:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Non so bene come fai a compilarlo, in quanto si vede ad occhio un errore:

C:
void ordina_dati(const int *dati_non_ordinati, int *dati_ordinati)
{
     int num_dati = sizeof(dati_non_ordinati) / sizeof(dati_non_ordinati[0]);
     for (int i = 0; i < num_dati; ++i)
          inserisci(dati_non_ordinati, i, dati_ordinati);
}

C:
void inserisci(int nuovo_dato, int num_dati_ord, int *vett) {

Viene chiamata la funzione con un parametro che non è un puntatore a const int *.

Ma... assumendo che tu riesca non mi stupisce che ci siano tutti 0.
Le prime righe di inserisci() infatti hanno:

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

In pratica non avviene un confronto ma un assegnamento! Essendo 0 valutato come false, l'if non viene eseguito, e prosegue.
Sotto c'è il for, che non viene ovviamente eseguito vista la condizione (num_dati_ord sarà uguale a 0, così come il contatore del ciclo).
 
  • Mi piace
Reazioni: Mursey

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili