PDA

View Full Version : Ordinare un array tramite puntatori in C


The DeViL's
16-04-2004, 16:52
ragazzi io sono arrivato a qst punto..ordina qlk numero poi a volte da tutti 0 non riesco a capire dove sbaglio mi sapete aiutare?

----------------------------------------------------------------------------------

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

void main()
{
int vet[100],*pv,*ps,i,n,c,max,temp;
pv=&vet[0];
ps=&vet[1];
clrscr();
printf("Inserire il numero di elementi da generare: ");
scanf("%d",&n);
max=n;
randomize();
for(i=0;i<=n-1;i++)
vet[i]=random(100);
printf("\n\nPremere un tasto per visualizzare i numeri generati\n\n");
getch();
for(i=0;i<=n-1;i++)
printf("%d ",vet[i]);
printf("\n\nPremere invio per visualizzare i numeri ordinati\n\n");
for(c=0;c<=n-1;c++,pv++)
for(i=0;i<=max-1;i++,ps++,max--)
if(*pv>*ps)
{
temp=*pv;
*pv=*ps;
*ps=temp;
}
for(i=0;i<=n-1;i++)
printf("%d ",vet[i]);
}

-----------------------------------------------------------------------------------


grazie a tutti;)

supertonno
16-04-2004, 19:15
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

void main()
{
int vet[300],*pv,*ps,*temp3,i,n,c,max,temp;
pv=&vet[0];
ps=&vet[1];
// clrscr();
printf("Inserire il numero di elementi da generare: ");
scanf("%d",&n);
max=n;
srand( (unsigned) time ( NULL ) );
for(i=0;i<=n-1;i++)
vet[i]=rand();
printf("\n\nPremere un tasto per visualizzare i numeri generati\n\n");
getch();
for(i=0;i<=n-1;i++)
printf("%d ",vet[i]);

printf("\n\nPremere invio per visualizzare i numeri ordinati\n\n");
temp=0;
temp3=pv;
for(c=0;c<=n-1;c++){
pv=temp3;
temp3++;
ps=pv+1;
for(i=0;i<=(max-2-c);i++,ps++){
if(*pv>*ps)
{
temp=*pv;
*pv=*ps;
*ps=temp;
}
}
}
for(i=0;i<=n-1;i++)
printf("%d ",vet[i]);
}

The DeViL's
16-04-2004, 19:15
up mi serve per domani vi prego!!

supertonno
16-04-2004, 19:16
Avevi fatto 1 po do confusione con i puntatori.
Scusa una cosa.
Come facevano as andarti le istruzioni
randomize,
random,
clrscr,
che se non ricordo male non sono di Pascal?

cionci
16-04-2004, 19:25
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

void main()
{
int vet[100],*pv,*ps,i,n,c,max,temp;
clrscr();
printf("Inserire il numero di elementi da generare: ");
scanf("%d",&n);
max=n;
randomize();
for(i=0; i<n; i++)
vet[i]=random(100);
printf("\n\nPremere un tasto per visualizzare i numeri generati\n\n");
getch();
for(i=0; i<n; i++)
printf("%d ",vet[i]);
printf("\n\nPremere invio per visualizzare i numeri ordinati\n\n");

pv = &vet[1];
for(c=1; c<n; c++,pv++)
{
ps = &vet[0];
for(i=0; i<n-1; i++,ps++)
if(*pv<*ps)
{
temp=*pv;
*pv=*ps;
*ps=temp;
}
}
for(i=0; i<n; i++)
printf("%d ",vet[i]);
}

Attenzione a non prendere brutte abitudini con il Turbo C ;) random, randomize, clrscr, getch non funzioni standard...

The DeViL's
16-04-2004, 19:32
cm no sono tutte funzioni della libreria conio.h

The DeViL's
16-04-2004, 19:34
Originariamente inviato da cionci

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

void main()
{
int vet[100],*pv,*ps,i,n,c,max,temp;
clrscr();
printf("Inserire il numero di elementi da generare: ");
scanf("%d",&n);
max=n;
randomize();
for(i=0; i<n; i++)
vet[i]=random(100);
printf("\n\nPremere un tasto per visualizzare i numeri generati\n\n");
getch();
for(i=0; i<n; i++)
printf("%d ",vet[i]);
printf("\n\nPremere invio per visualizzare i numeri ordinati\n\n");

pv = &vet[1];
for(c=1; c<n; c++,pv++)
{
ps = &vet[0];
for(i=0; i<n-1; i++,ps++)
if(*pv<*ps)
{
temp=*pv;
*pv=*ps;
*ps=temp;
}
}
for(i=0; i<n; i++)
printf("%d ",vet[i]);
}

Attenzione a non prendere brutte abitudini con il Turbo C ;) random, randomize, clrscr, getch non funzioni standard...


ma è questo quello giusto?

cionci
16-04-2004, 19:36
Originariamente inviato da The DeViL's
cm no sono tutte funzioni della libreria conio.h
Appunto alcune funzioni della libreria conio.h nel C standard sono incluse in stdio.h, altre in stdlib.h, altre in time.h, altre non esistono proprio...come del resto l'include conio.h ;)

cionci
16-04-2004, 19:36
Originariamente inviato da The DeViL's
ma è questo quello giusto?
Sì...ah aspetta...forse ho invertito il verso di ordinamento...

The DeViL's
16-04-2004, 19:38
cionci mi spiegheresti cosa ho sbajato? quel caxxo de prof nn è bono a spiuega e tutte le volte me devo imparà da solo

cionci
16-04-2004, 19:41
Principalmente il fatto che dovevi reinizializzare il puntatore ps ogni volta che terminavi il ciclo + interno...
Poi diminuivi quel max...come mai ?

cionci
16-04-2004, 19:43
Originariamente inviato da supertonno
Avevi fatto 1 po do confusione con i puntatori.
Scusa una cosa.
Come facevano as andarti le istruzioni
randomize,
random,
clrscr,
che se non ricordo male non sono di Pascal?
Sono funzioni proprietarie (e confusionarie) del Borland C++ e Turbo C...

The DeViL's
16-04-2004, 19:44
max lo decrementavo xche il numero di confronti diminuiva ogni volta che pv aumentava...cmq nn ho capito bene quella cosa che devo reinizializzare il ps..ma nn funziona tipo un indice? oppure quello qnd i ridiventa 0 lui va fuori dall array?

cionci
16-04-2004, 20:00
Hai ragione...il numero dei confronti diminuisce...non ci avevo pensato...
Dopo che è finito il ciclo interno ps punta a vet[n-2]...quando si rientra nel ciclo interno viene incrementato e punta a vet[n-1]...poi a vet[n] ed a questo punto sei fuori dal vettore...

The DeViL's
16-04-2004, 20:08
Originariamente inviato da cionci
Hai ragione...il numero dei confronti diminuisce...non ci avevo pensato...
Dopo che è finito il ciclo interno ps punta a vet[n-2]...quando si rientra nel ciclo interno viene incrementato e punta a vet[n-1]...poi a vet[n] ed a questo punto sei fuori dal vettore...


e si nn ci avevo pensato..che casino però sti puntatori!!!

The DeViL's
16-04-2004, 20:09
cionci ma un link a un manuale per imparare la parte dedicata alle connessioni internet con il c...e all utilizzo della rete? ce l hai pls?

cionci
16-04-2004, 20:30
Cerca su google socket tutorial... Mi sembra di aver postato qualche link anche qui...cerca socket con il motore di ricerca...

Comunque l'unico modo per diminuire il numero di cicli è questo:

pv = &vet[1];
for(c=1; c<n; c++,pv++)
{
ps = &vet[0];
for(i=0; i<c; i++,ps++)
if(*pv>*ps)
{
temp=*pv;
*pv=*ps;
*ps=temp;
}
}

supertonno
16-04-2004, 20:34
Il mio funziona.
Problemi:
1- Max non va decrementato nel ciclo interno, ma in quello esterno.
2- I puntatori alla fine di una scansione devono essere riinizzializzati (a differenza degli array), perche rimanevano in coda, e quindi al secondo giro andavi al leggere in posizioni dell'array spagliate.

Il codice e postato in testa.(Prima risposta)

The DeViL's
16-04-2004, 20:55
grazie Ragazzi siete i MEJOOOOOOOO!!! spero di diventare bravo cm a VOI

supertonno
17-04-2004, 00:22
Mi ha fatto piacere aiutarti.