Iprogrammer (Normal User)
Newbie
Messaggi: 2
Iscritto: 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++ |
/* * 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[i] = 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[i]) { // sposta da vett[i] in poi di un posto sulla destra // prima di inserire il nuovo_dato fai_spazio(i, vett, num_dati_ord); vett[i] = 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], i, dati_ordinati); } void stampa_vettore(const int *vett, int lung) { for (int i = 0; i < lung; ++i) printf("%d ",vett[i]); 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. Qualcuno può aiutarmi?
Grazie.
|
|
Carlo (Member)
Guru
Messaggi: 1344
Iscritto: 29/01/2018
|
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++ |
#include <stdio.h> #include <stdlib.h> #define MAX_INPUT 10 void stampa_vettore(const int *vett, int lung) { for (int i = 0; i < lung; ++i) printf("%d ", vett[i]); printf("\n"); } int main(int argc, char **argv) { int dati_input[MAX_INPUT] = { 0 }; dati_input[0] = 5; dati_input[1] = 8; dati_input[2] = 2; dati_input[3] = 1; dati_input[4] = 6; dati_input[5] = 98; dati_input[6] = 65; dati_input[7] = 3; dati_input[8] = 12; dati_input[9] = 43; int provv, c1, c2 = 0; for (c1 = 1; c1 < MAX_INPUT; c1++) { provv = dati_input[c1]; c2 = c1 - 1; while ((dati_input[c2] > provv) && (c2 >= 0)) { dati_input[c2 + 1] = dati_input[c2]; c2--; } dati_input[c2 + 1] = provv; } printf("Sort insertion \n"); stampa_vettore(dati_input, MAX_INPUT); return 0; }
|
Ultima modifica effettuata da Carlo il 28/04/2020 alle 0:49
in programmazione tutto è permesso |
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
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à. |
|
Carlo (Member)
Guru
Messaggi: 1344
Iscritto: 29/01/2018
|
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à...
in programmazione tutto è permesso |
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
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à. |
|
Ultimo (Member)
Guru
Messaggi: 877
Iscritto: 22/05/2010
|
int num_dati = sizeof(dati_non_ordinati) / sizeof(dati_non_ordinati[0]);
questa linea che cosa dovrebbe eseguire?
If ok Then GOTO Avanza else GOTO Inizia
|
|
Ultimo (Member)
Guru
Messaggi: 877
Iscritto: 22/05/2010
|
Postato originariamente da Carlo:
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à... |
Carlo nel C si usano i puntatori
puntano per riferimento allo spazio di memoria occupato
If ok Then GOTO Avanza else GOTO Inizia
|
|
Carlo (Member)
Guru
Messaggi: 1344
Iscritto: 29/01/2018
|
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 |
|
Ultimo (Member)
Guru
Messaggi: 877
Iscritto: 22/05/2010
|
Si avrebbe dovuto scrivere:
if (num_dati_ord == 0) { // il vettore è vuoto, facile
vett[0] = nuovo_dato;
return;
If ok Then GOTO Avanza else GOTO Inizia
|
|