View Full Version : [C] Esercizio Vettore 2 - principiante
cicciopantera
20-02-2015, 15:21
Altro problema in C:
-Acquisire da tastiera elementi interi non nulli che compongono il vettore V (il valore nullo introdotto da tastiera interrompe l'acquisizione e non appartiene al vettore acquisito);
-Acquisire da tastiera un valore intero non nullo VAL e verificare col metodo dicotomico che sia presente nel vettore V;
-Se VAL risulta presente in V, stampare i due valori adiacenti a VAL (quello a sinistra e quello a destra).
Ho lavorato così
#include <stdio.h>
#define MAX 100
void Input_vettore (int V[], int* N)
{
int m, t=0;
for (m=0;m<MAX;m++)
{
printf("Inserire l'elemento V[%d]", m);
scanf ("%d", &t);
if (t!=0) V[m]=t;
else break;
}
*N=m;
}
void Selection_sort(int V[], int N)
{
int i, j, temp=0;
for (i=0;i<N-1;i++)
{
for (j=i+1;j<N;j++)
if (V[i]>V[j])
{
temp= V[i];
V[i]=V[j];
V[j]=temp;
}
}
}
void Ricerca_dicotomica(int V[], int N)
{
int sn=0, dx=(N-1), VAL=0, pos=-1, ct=0;
do
{
printf ("Inserire l'elemento VAL da ricercare= \n");
scanf ("%d", &VAL);
}
while (VAL==0);
do
{
ct=((sn+dx)/2);
if (VAL==V[ct])
{
pos=ct;
printf ("Il valore e' presente nel vettore, Il valore alla sua sinistra e'= %d\nIl valore alla sua destra e'= %d\n", V[pos-1], V[pos+1]);
system ("PAUSE");
}
else if (V[ct]<VAL) dx=ct-1;
else sn=ct+1;
}
while (sn<dx);
if (pos=-1)
{
printf("Il valore non e' presente nel vettore\n");
system ("PAUSE");
}
}
void main()
{
int V[MAX], N;
Input_vettore (V,&N);
Selection_sort (V,N);
Ricerca_dicotomica (V,N);
}
Ma ho un errore nel momento in cui inserisco come VAL proprio uno dei due estremi dell'array ottenendo l'output "Il valore non è presente nel vettore"; come posso ovviare a tale bug?
Grazie:)
monte.cristo
20-02-2015, 15:40
Innanzitutto, c'è un possibile errore in questa parte di codice
if (VAL==V[ct])
{
pos=ct;
printf ("Il valore e' presente nel vettore, Il valore alla sua sinistra e'= %d\nIl valore alla sua destra e'= %d\n", V[pos-1], V[pos+1]);
system ("PAUSE");
}
perchè prendere l'elemento che si trova prima e dopo VAL all'interno dell'array senza nessun controllo può portare a stampare valori inattendibili se VAL è uno dei due estremi del vettore
cicciopantera
20-02-2015, 15:42
Capisco...come posso risolvere?:)
monte.cristo
20-02-2015, 16:10
Capisco...come posso risolvere?
Bè, ti ho già detto in che punto si trova il possibile errore e quali sono le condizioni che possono dare un risultato non previsto. Direi che trovare la soluzione è compito di chi fa l'esercizio perchè sta imparando il linguaggio. ;)
cicciopantera
20-02-2015, 16:35
Provo e riprovo, sono in altomare...
cicciopantera
20-02-2015, 18:00
Non penso sia una tragedia greca effettuare una correzione, d'altronde i professori correggono non dicono "correggi tu"....o sbaglio?
Oceans11
20-02-2015, 18:55
Non penso sia una tragedia greca effettuare una correzione, d'altronde i professori correggono non dicono "correggi tu"....o sbaglio?
Correggono loro, ma ti abbassano il voto ;)
Il problema te l'hanno già fatto notare (abbastanza chiaramente direi) prendere l'elemento che si trova prima e dopo VAL all'interno dell'array senza nessun controllo può portare a stampare valori inattendibili se VAL è uno dei due estremi del vettore
Io leggo la frase e mi dico subito "bene, controlliamo se VAL è uno dei due estremi del vettore". (In caso affermativo evito di stampare uno dei due estremi "inesistenti"
cicciopantera
20-02-2015, 19:10
#include <stdio.h>
#define MAX 100
void Input_vettore (int V[], int* N)
{
int m, t=0;
for (m=0;m<MAX;m++)
{
printf("Inserire l'elemento V[%d] ", m);
scanf ("%d", &t);
if (t!=0) V[m]=t;
else break;
}
*N=m;
}
void Selection_sort(int V[], int N)
{
int i, j, temp=0;
for (i=0;i<N-1;i++)
{
for (j=i+1;j<N;j++)
if (V[i]>V[j])
{
temp= V[i];
V[i]=V[j];
V[j]=temp;
}
}
}
void Ricerca_dicotomica(int V[], int N)
{
int sn=0, dx=(N-1), VAL=0, pos=-1, ct=0;
do
{
printf ("Inserire l'elemento VAL da ricercare=\n");
scanf ("%d", &VAL);
}
while (VAL==0);
if (VAL==V[sn])
{
pos=sn;
printf ("Il valore e' presente nel vettore, Il valore alla sua sinistra non esiste\nIl valore alla sua destra e'= %d\n", V[sn+1]);
system ("PAUSE");
}
else if(VAL==V[dx])
{
pos=dx;
printf ("Il valore e' presente nel vettore, Il valore alla sua sinistra e'= %d\nIl valore alla sua destra non esiste\n", V[dx-1]);
system ("PAUSE");
}
else do
{
ct=((sn+dx)/2);
if (VAL==V[ct])
{
pos=ct;
printf ("Il valore e' presente nel vettore, Il valore alla sua sinistra è= %d\nIl valore alla sua destra è= %d\n", V[pos-1], V[pos+1]);
system ("PAUSE");
}
else if (V[ct]<VAL) dx=ct-1;
else sn=ct+1;
}
while (sn<dx);
if (pos=-1)
{
printf("Il valore non e' 'presente nel vettore\n");
system ("PAUSE");
}
}
void main()
{
int V[MAX], N;
Input_vettore (V,&N);
Selection_sort (V,N);
Ricerca_dicotomica (V,N);
}
Ho fatto così e dovrebbe andare; ci sono errori?
Oceans11
21-02-2015, 10:44
/* PROBLEMA RISOLTO: Andavano inseriti due if e all'else finale andava collegato il do del caso comune*/
#include <stdio.h>
#define MAX 100
void Input_vettore (int V[], int* N)
{
int m, t=0;
for (m=0;m<MAX;m++)
{
printf("Inserire l'elemento V[%d] ", m);
scanf ("%d", &t);
if (t!=0) V[m]=t;
else break;
}
*N=m;
}
void Selection_sort(int V[], int N)
{
int i, j, temp=0;
for (i=0;i<N-1;i++)
{
for (j=i+1;j<N;j++)
if (V[i]>V[j])
{
temp= V[i];
V[i]=V[j];
V[j]=temp;
}
}
}
void Ricerca_dicotomica(int V[], int N)
{
int sn=0, dx=(N-1), VAL=0, pos=-1, ct=0;
do
{
printf ("Inserire l'elemento VAL da ricercare=\n");
scanf ("%d", &VAL);
}
while (VAL==0);
if (VAL==V[sn])
{
pos=sn;
printf ("Il valore e' presente nel vettore, Il valore alla sua sinistra non esiste\nIl valore alla sua destra e'= %d\n", V[sn+1]);
system ("PAUSE");
}
else if(VAL==V[dx])
{
pos=dx;
printf ("Il valore e' presente nel vettore, Il valore alla sua sinistra e'= %d\nIl valore alla sua destra non esiste\n", V[dx-1]);
system ("PAUSE");
}
else do
{
ct=((sn+dx)/2);
if (VAL==V[ct])
{
pos=ct;
printf ("Il valore e' presente nel vettore, Il valore alla sua sinistra è= %d\nIl valore alla sua destra è= %d\n", V[pos-1], V[pos+1]);
system ("PAUSE");
}
else if (V[ct]<VAL) dx=ct-1;
else sn=ct+1;
}
while (sn<dx);
if (pos=-1)
{
printf("Il valore non e' 'presente nel vettore\n");
system ("PAUSE");
}
}
void main()
{
int V[MAX], N;
Input_vettore (V,&N);
Selection_sort (V,N);
Ricerca_dicotomica (V,N);
}
Ho fatto così e dovrebbe andare; ci sono errori?
scusa, ma l'hai testato il codice?
almeno hai provato a compilarlo?
cicciopantera
21-02-2015, 11:23
Si funzionante senza bug; chiedevo nel caso in cui ci fossero elementi superflui o altro, non so...
Complessità di questo?
Oceans11
21-02-2015, 16:10
Si funzionante senza bug; chiedevo nel caso in cui ci fossero elementi superflui o altro, non so...
Complessità di questo?
if (pos=-1)
secondo me non funziona :mbe:
cicciopantera
21-02-2015, 17:48
Si ha senso, se pos rimane a -1 e non è stato aggiornato al ct allora non ci sarà sicuramente nessun valore; penso il ragionamento fili....
Oceans11
21-02-2015, 18:47
$ gcc -Wall -c es.c
es.c:66:2: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
if (pos=-1)
ok, non il miglior warning del mondo, ma ci puoi arrivare al problema.
lorenzo001
22-02-2015, 12:38
Basta che ti chiedi perché per quella parentesi l'avviso parla di
assignment
cicciopantera
22-02-2015, 12:40
non capisco...
lorenzo001
22-02-2015, 13:04
Prendi due if del tuo codice e mettile a confronto. Che differenze noti?
cicciopantera
22-02-2015, 14:48
intendi forse: pos==-1 e non con un solo " = "?
lorenzo001
22-02-2015, 15:56
Tu che dici? Ti sembra la stessa cosa?
cicciopantera
22-02-2015, 15:59
No no, hai pienamente ragione
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.