PROBLEMA selection sort su array struct

toni1705

Nuovo Utente
98
9
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:

bigendian

Utente Attivo
748
431
OS
Linux
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]);
    }
}
 

toni1705

Nuovo Utente
98
9
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 :(
 

toni1705

Nuovo Utente
98
9
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.
:)
 

bigendian

Utente Attivo
748
431
OS
Linux
Credo tu ti sia espresso male. Ne io ne gli altri qui "devono" nulla a nessuno. Soluzione rimossa. Da parte mia mai piu compitini.
 

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 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).
 
  • Mi piace
Reazioni: toni1705

toni1705

Nuovo Utente
98
9
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:

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

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili