Vai al contenuto
PLC Forum


Problema Con Programmino Banale In C


biondina

Messaggi consigliati

Ciao a tutti.
Ho un problema banale ma che non riesco proprio a risolvere.
L'esercio mi chiede:
" Il programma ha una lista collegata con puntatori, ordinata in senso crescente.
Devo scrivere la funzione che incrementa ordinatamente di 1 gli elementi della lista fino a ritrovare un elemento il cui valore incrementato è
maggiore di una soglia data in ingresso. Gli elementi a partire dal primo che supera la soglia fino all'ultimo devono essere cancellati liberando la memoria. La funzione deve restituire come valore di ritorno il numero di elementi cancellati "
Il mio problema è che se ad esempio inserisco la lista 2 4 6 8 10 12 e come soglia inserisco valore 8 (presente nella lista) mi ritorna il numero di cancellazioni è 3 che è giusto; ma se inserisco valore 7 (che non c'è nella lista) mi ritorna un valore tipo 229134. Perchè? :muro:
Sotto riporto il programma
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

struct list {
int value;
struct list * next_ptr;
};

void init( struct list ** ptrptr );
void visit( struct list * ptr );
void pre_insert( struct list ** ptrptr, int value );
void ord_insert(struct list ** ptrptr, int value);
int camb_list(struct list*ptrptr,int thres);
int delete_list_el (struct list**ptrptr);


void init( struct list ** ptrptr ){
*ptrptr = NULL;
}

void visit( struct list * ptr )
/* visita della lista*/
{
while ( ptr != NULL ) {
printf( "%d ", ptr->value );
ptr = ptr->next_ptr;
}
}


void pre_insert( struct list ** ptrptr, int value )
/* inserisce in testa*/
{
struct list * tmp_ptr;

tmp_ptr = *ptrptr;
*ptrptr = (struct list *) malloc( sizeof(struct list));
(*ptrptr)->value = value;
(*ptrptr)->next_ptr = tmp_ptr;
}
void ord_insert(struct list ** ptrptr, int value)
/* inserisce in ordine*/
{ while(*ptrptr!=NULL && (*ptrptr)->value<value)
{ptrptr=&((*ptrptr)->next_ptr);
}
pre_insert(ptrptr,value);
}
int camb_list (struct list*ptrptr,int thres)
/*incrementa valori della lista per 1, fino a trovare uno >= di soglia. se trova un elemento > lo cancella dalla lista */
{ int num_canch;
while (ptrptr!=NULL && (ptrptr)->value<=thres)
{ (ptrptr)->value=(ptrptr)->value+1;
if ((ptrptr)->value>=thres){
num_canch=delete_list_el(&ptrptr);
}
else
ptrptr=(ptrptr)->next_ptr;
}
return num_canch;
}
Modificato: da Gabriele Riva
Inserito tag CODE
Link al commento
Condividi su altri siti


Perchè?

Perchè non esegui correttamente il ciclo.

Devi eseguire il ciclo sino a che non hai analizzato tutti gli elemeti del vettore.

All'interno del ciclo inserisci il test >soglia, se la condizione è vera cancelli l'elemento del vettore ed incrementi il contatore cancellazioni.

Link al commento
Condividi su altri siti

All'interno del ciclo inserisci il test >soglia, se la condizione è vera cancelli l'elemento del vettore ed incrementi il contatore cancellazioni.

Ma io pensavo che una volta trovato un elemento maggiore tutti gli altri saranno ance maggiori perchè la lista è ordinata. Allora posso fare la cancellazione da questo elemento fino alla fine del lista. Invece devo cancellare uno per uno finche non arrivo al ultimo el giusto?

Link al commento
Condividi su altri siti

Puoi anche cancellarli assieme, ma devi contarli.

Comunque il tuo programma può essere scritto molto più compattamente.

Cos'è un esercizio scolastico?

Link al commento
Condividi su altri siti

Fondamenti di programmazione, primo anno d'università. Sono riuscita a far la funzionare bene, cambiando il ciclo in modo che scorre tutti gli elementi della lista. Grazie :)

Link al commento
Condividi su altri siti

  • 3 weeks later...

Poi dovresti avere Strutture dati avanzate e algoritmi .

comunque se la lista è ordinata come dici tu appena al primo che e' maggiore ti fermi .

Per essere ordinata pero bisogna che inserita ordinatamente

Inizia col creare qualche menu di inserimento dove chiedi se inserire e quale valore inserire .

Il malloc dovrebbe essere giusto , questa funzione alloca una certa area di memoria , che come ben sai e' presa a caso nella memoria del calcolatore, e poi viene gestita la lista con i puntatori .

Che compilatore usi , Codeblocks?

A prescindere dal comp. mettiti in debug e cerca di capire i riferimenti dei puntatori , io usavo stamparli a video .

Se il malloc crea un array o un array di array gli indirizzi di ogni array sono regolarmente disposti fino a che non salti per andare alla riga successiva.

Fai il debug e stampa indirizzo e valore dell'elemento ogni volta che ti muovi .

Poi vedrai che al secondo anno con java o c++ le cose saranno diverse :)

Controlla bene all'interno del ciclo , puo essere che sganci un elemento e lo riagganci male o con riferimento sbagliato in quanto in questo caso puoi andare solo avanti , hai solo il puntatore next .

Prova in modo piu semplice e gestire una coda o una stack , lifo e fifo

ciao

Walter

p.s. se hani problemi scrivi pure vedro di imandarti qualche file .c

Link al commento
Condividi su altri siti

  • 3 weeks later...
Fondamenti di programmazione, primo anno d'università.

... Per caso avevi l'esame il 14 febbraio?... quale università frequenti? :smile:

Il malloc dovrebbe essere giusto , questa funzione alloca una certa area di memoria , che come ben sai e' presa a caso nella memoria del calcolatore,

Su altri sistemi operativi non so, ma su Windows non è affatto presa a caso, viene allocata nell'Heap dello stesso segmento di memoria del programma, si espande verso gli indirizzi più alti andando incontro allo stack (che si espande al contrario verso gli indirizzi più bassi), e quando questi si incontrano si ottiene il famigerato messaggio "Memoria Insufficiente". La memoria allocabile è limitata, e non dipende dalla quantità di RAM presente nel PC.

Link al commento
Condividi su altri siti

ma su Windows non è affatto presa a caso, viene allocata nell'Heap dello stesso segmento di memoria del programma,

Questo è il peccato originale di Windows; addirittura sino alla XP non c'era controllo sulla porzione dati ed invece della segnalazione di errore c'era il crash.

Nei multi task più seri le allocazioni tra dati e programma son ben differenziate.

Link al commento
Condividi su altri siti

nikki , l'esame di algoritmi e strutture dati l'ho dato l'anno scorso in aprile , e mi son preparato per oltre due mesi

Ora la stessa cosa con architettura & ingegneria del software , design patterns ect .

Conoscere e sapere usare i design pattern e' quello che differenzia un bravo programmatore smanettone da un professionista progettista architetto del software.

Lo ripeto , essere ingegneri non e' com enon esserlo , un buon perito elettronico o informatico e' sempre uno o piu gradini sotto ad un discreto ingegnere

Io frequento un'universitò telematica , gli esami li diamo allo iulm , nel mi caso , di milano .Poi per i dipendenti telecom le varie sedi , poi c'e' roma , napoli , palermo , firenze ....ci sono diversi poli tecnologici che ospitano le nostre sessioni

Devi studiare , non ti regalano la laurea , e rispetto ad università tradizionali no nsiamo da meno , ho avuto modo di assistere o dare ripetizioni in basi di dati e linguaggio C a studenti del politecnico ect , e sono veramente ridicoli .....

Modificato: da walterword
Link al commento
Condividi su altri siti

essere ingegneri non e' com enon esserlo , un buon perito elettronico o informatico e' sempre uno o piu gradini sotto ad un discreto ingegnere

Ciao Walterword,

visto che sei così giovane ti voglio dare un consiglio da buon "vecchietto"... :smile: non sottovalutare mai chi hai davanti e soprattutto non giudicare mai una persona dal suo titolo di studio.

Ho conosciuto ingegneri laureati con ottimi voti che nel lavoro erano dei veri incapaci, e viceversa ho conosciuto diplomati e addirittura autodidatti che sono in grado di dare le paghe alla maggiorparte degli ingegneri... del resto come recita il famoso proverbio: "non è l'abito che fa il monaco". Quello che fa diventare buoni informatici o elettronici non è la scuola ma la passione. La scuola impone uno studio per superare un esame, la passione richiama lo studio per pura sete di conoscenza. :smile:

La maggiorparte di coloro che studiano senza passione rimuovono i concetti studiati poco dopo aver superato l'esame, l'appassionato invece li conserva e li coltiva vita natural durante.

A volte, in una persona senza titoli ma affermata sul lavoro, si attribuisce il merito solo all'esperienza sul campo. Spesso invece non è così, ci sono persone che non hanno mai smesso di studiare, seppur non dovendo sostenere esami e di conseguenza non avendo riconoscimenti o titoli.

Scusami per la paternale ma era importante :lol: .

Comunque non avevo chiesto a te quale università frequentavi, la domanda era rivolta a "biondina" perchè nel codice che ha postato ho riconosciuto esattamente alcune parti di codice tratti dal testo "Fondamenti di programmazione" di Enrico Vicario, che sta studiando anche mia figlia che frequenta il primo anno di università. Visto che l'autore del libro ha una cattedra in questa università ho pensato che potessero essere addirittura compagne di corso. :lol:

Link al commento
Condividi su altri siti

visto che sei così giovane ti voglio dare un consiglio da buon "vecchietto"...

Nikiki, non conosco la tua età, ma conosco Walter e non è proprio giovanissimo ;) , anzi. Potrebbe essere mio figlio, ma sono io che oramai sono praticamente un vecchio, anche se è un aggettivo che non si usa più.

Per il resto condivido e sottoscrivo il tuo ragionamento.

Link al commento
Condividi su altri siti

Livio potresti essere mio nonno :D

Nikki ho 43 anni ed ho passato gli ultimi 15 anni a progettare , sviluppare e mettere in servizio impianti un po in giro per il mondo

Tra e plc e .Net posso dire che se avessi avuto le conoscenze che ho ora avrei sicuramente fatto diversamente molte cose.

Per il fatto del discorso del giudicare o la questione dell'abito e dell'ordine dei monaci mi astengo , ho gia dato in altre discussioni

;)

Livio perceh no ci incontraimo con ifach ? un apizzetta in compagnia ....ricordo che mi dovevi venire e trovare una volta ... :(

Modificato: da walterword
Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...