PROBLEMA selection sort su array struct

Pubblicità

toni1705

Nuovo Utente
Messaggi
98
Reazioni
9
Punteggio
28
Ciao stavo provando a svolgere un piccolo esercizio puramente didattico volevo ordinare dei dati registrati in un'array di struct
il fatto è che esegue i primi 2 spostamenti poi stampa.. righe senza contenuti

C:
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "Intestazione.h"
#pragma warning(disable : 4996)
#define MAX_CLASSES 22
#define n 22

struct Persona
{
    int id;
    char nome[20];
    char cognome[20];

};
typedef struct Persona persona;
static persona p1[22];
void stampa()
{
    int i;
    for (i = 0;i < n;i++)
    {

        printf("\n%d %s %s", p1[i].id, &p1[i].nome, &p1[i].cognome);
    }
}



void minvalind(persona a[], int N, int* minarray, int* imin);
static void scambiare(persona* c1, persona* c2);
void selectmin()

{
    int i, minarray, imin;
    for (i = 0;i < n-1;i++)
    {
        minvalind(&p1[i], n- i, &minarray, &imin);
        //printf("\nmin:%d imin:%d", minarray, imin);
        scambiare(&p1[i], &p1[imin +i]);
    }
}

main()
{
    char buf[100],*res;
    FILE *fd;
    fd=fopen("dati.txt", "r");
    if (fd != NULL)
    {
        printf(    "file aperto\n");
    }
    int x=0;
    while (!feof(fd))
    {
        fscanf(fd, "%d %s %s", &p1[x].id, &p1[x].nome, &p1[x].cognome);
        x++;
       
   
    }

   

   
        stampa();
        selectmin();
        stampa();
   
}


 void minvalind( persona a[],  int N, int* minarray, int* imin)
{
    int i;
    *imin = 0;
    *minarray = a[0].id;
    for (i = 1;i < n;i++)
    {
        if (p1[i].id < *minarray)
        {
            *minarray = a[i].id;
            *imin = i;
        }


    }
}

static void scambiare(persona* c1, persona* c2)
{
    persona t = *c1;
    *c1 = *c2;
    *c2 = t;
}

C:
101    GIOVANNI    SCARPATO
100    GIANFRANCO    CONTINIELLO
20    ROBERTA    CONTINIELLO
19    ANNA    GALLO
18    PATRIZIA    LAFEROLA
17    ANTONIO    FORMISANO
16    UMBERTO    SAVARESE
15    LEOPOLDO    ACAMPORA
14    ANTONIO    MAROTTA
13    CARMINE    RUOCCO
12    CARLO    BRUCO
11    CLAUDIO    CONTE
10    RENATO    APRILE
9    SILVIA    DINAPOLI
8    ANGELA    CURTIS
7    RODOLFO    GALEOTAFIORE
6    ROBERTO    DORATO
5    ALFONSO    LIGUORI
4    LUIGI    ALBERO
3    MICHELE    AMABILE
2    NICOLA    AMATO
1    ALBERTO    RUSSO
 
Ultima modifica:
Alcune note, userei

printf("\n%d %s %s", p1.id, p1.nome, p1.cognome);
fscanf(fd, "%d %s %s", &p1[x].id, p1[x].nome, p1[x].cognome);

Eviterei sempre i typedef, ottimo offuscatori.

Il tuo errore sta in selectmin, cambiandola cosi pare funziopnare

Codice:
void selectmin()

{
    int i, minarray, imin;
    for (i = 0;i < n-1;i++)
    {
        minvalind(&p1[i], n- i, &minarray, &imin);
        printf("\nmin:%d imin:%d", minarray, imin);

        scambiare(&p1[i], &p1[imin]);
    }
}
 
Alcune note, userei

printf("\n%d %s %s", p1.id, p1.nome, p1.cognome);
fscanf(fd, "%d %s %s", &p1[x].id, p1[x].nome, p1[x].cognome);

Eviterei sempre i typedef, ottimo offuscatori.

Il tuo errore sta in selectmin, cambiandola cosi pare funziopnare

Codice:
void selectmin()

{
    int i, minarray, imin;
    for (i = 0;i < n-1;i++)
    {
        minvalind(&p1[i], n- i, &minarray, &imin);
        printf("\nmin:%d imin:%d", minarray, imin);

        scambiare(&p1[i], &p1[imin]);
    }
}
no mi continua a dare i valori stampati in modo errato :(
 
Considera sempre che se il compitino per casa te lo fa un altro, a te poco serve.


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

#pragma warning(disable : 4996)
#define MAX_CLASSES 22
#define n 22

struct persona
{
    int id;
    char nome[20];
    char cognome[20];
};

static struct persona p1[22];

void stampa()
{
    int i;

    for (i = 0;i < n;i++) {
        printf("\n%d %s %s", p1[i].id, p1[i].nome, p1[i].cognome);
    }
}

static void scambiare(struct persona* c1, struct persona* c2)
{
    struct persona t = *c1;

    *c1 = *c2;
    *c2 = t;
}

void riordina()
{
    int i, q, min, v;

    for (q = 0; q < n; q++) {
        for (i = q, v = 10000; i < n ; i++) {
            if (p1[i].id < v) {
                v = p1[i].id;
                min = i;
            }
        }
        scambiare(&p1[q], &p1[min]);
    }
}

int main()
{
    char buf[100], *res;
    FILE *fd;
    int x = 0;

    fd=fopen("dati.txt", "r");
    if (fd != NULL) {
        printf("file aperto\n");
    } else {
        fprintf(stderr, "impossibile aprire il file\n");
        return -1;
    }

    while (!feof(fd)) {
        fscanf(fd, "%d %s %s", &p1[x].id, p1[x].nome, p1[x].cognome);
        x++;
    }

    stampa();
    riordina();
    stampa();

    return 0;
}
Non ho mai chiesto di farmi il compitino da casa.
Ho postato il codice sorgente , i dati, e lo sviluppo. Secondo tutti questj elementi dovevi aiutarmi a capire dove sbagliassi.
È un esercizio per me .la soluzione non mi è servita.
:)
 
Credo tu ti sia espresso male. Ne io ne gli altri qui "devono" nulla a nessuno. Soluzione rimossa. Da parte mia mai piu compitini.
 
Non ho mai chiesto di farmi il compitino da casa.
Ho postato il codice sorgente , i dati, e lo sviluppo. Secondo tutti questj elementi dovevi aiutarmi a capire dove sbagliassi.
È un esercizio per me .la soluzione non mi è servita.
:)

Ma quindi alla fine hai risolto o no?
Se hai risolto, pubblica per favore cosa hai fatto. ?

Io avevo notato un problema leggendo l'altro giorno da smartphone, poi non ho più pubblicato. Comunque:
C:
 minvalind(&p1[i], n- i, &minarray, &imin);

ma come parametri quella funzione ha:

C:
void minvalind( persona a[],  int N, int* minarray, int* imin)

e come condizione del for usi n, che è in realtà la define in cima (quindi non usi mai N).
 
Credo tu ti sia espresso male. Ne io ne gli altri qui "devono" nulla a nessuno. Soluzione rimossa. Da parte mia mai piu compitini.
guarda credo tu stia sbagliando proprio approccio. qui era stata richiesta una supervisione per effettivamente far funzionare il programma. è una cosa che stavo provando da solo. nulla di scuola. ho 26 anni e la scuola ormai è un ricordo lontano.
Ma quindi alla fine hai risolto o no?
Se hai risolto, pubblica per favore cosa hai fatto. ?

Io avevo notato un problema leggendo l'altro giorno da smartphone, poi non ho più pubblicato. Comunque:
C:
 minvalind(&p1[i], n- i, &minarray, &imin);

ma come parametri quella funzione ha:

C:
void minvalind( persona a[],  int N, int* minarray, int* imin)

e come condizione del for usi n, che è in realtà la define in cima (quindi non usi mai N).
no ancora non ho risolto. sto cercando di capire perchè mi fa solo i primi 2 scambi .provo a vedere subito il tuo suggerimento e magari aggiorno il thread. ( su un semplice array di int funziona tranquillamente.)
Nulla proprio non funziona credo l'errore sia nella minvalind.
perchè se provo a fare lo scambio manuale di due dati tramite swap funziuona tranquillamente.
 
Ultima modifica:
Pubblicità
Pubblicità
Indietro
Top