Oppure

Loading
27/04/20 19:40
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.
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 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.
aaa
27/04/20 22:32
Carlo
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:
	

#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 27/04/20 22:49
in programmazione tutto è permesso
28/04/20 4:33
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.
Ultima modifica effettuata da nessuno 28/04/20 4: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à.
28/04/20 10:55
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à... :D
in programmazione tutto è permesso
28/04/20 12:50
nessuno
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à.
28/04/20 13:34
Ultimo

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

28/04/20 13:39
Ultimo
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à... :D


Carlo nel C si usano i puntatori

puntano per riferimento allo spazio di memoria occupato
If ok Then GOTO Avanza else GOTO Inizia

28/04/20 19:14
Carlo
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 28/04/20 19:23
in programmazione tutto è permesso