[C] Programmi in C AIUTO!!!
Salve a tutti,
Scusate se non ho rispettato le varie norme per l'apertura di una discussione ma sono disperato!
Venerdì ho un esame di fondamenti di informatica e avrei un bisogno urgente di qualcuno che possa aiutarmi a implementare queste 2 funzioni
1)
Si definisca una funzione c che riceve in ingresso due array di int e verifica se tali array
sono uguali (due array sono uguali se contengono lo stesso numero di elementi, con gli
stessi valori e nello stesso ordine).
Soluzione:
typedef unsigned short int Boolean;
#define TRUE 1
#define FALSE 0
Boolean is_equal(int * U, int * V, int sizeU, int sizeV) {
int count=0;
if (sizeU != sizeV)
return FALSE;
while(count < sizeU) {
if(U[count] != V[count])
return FALSE;
else
count++;
}
return TRUE;
}
2)
Si definisca la struttura c che rappresenta un elemento di una lista in forma collegata con
puntatori (si assuma che ciascun elemento codifichi un dato di tipo float). Si definiscano
le funzioni c che realizzano l'inserimento in testa e in coda su una tale lista.
Soluzione:
struct list{
float value;
struct list * next_ptr;
};
void pre_insert(struct list** ptrptr, float value) {
struct list* tmp_ptr = *ptrptr;
*ptrptr = (struct list*)malloc(sizeof(struct list));
*ptrptr>value = value;
*ptrptr>next_ptr = tmp_ptr;
}
void suf_insert(struct list** ptrptr, float value) {
while(*ptrptr!=NULL)
prtptr = &((*ptrptr)>next_ptr);
pre_insert(ptrptr, value);
}
devo scrivere due programmi che implementino queste 2 funzioni. qualcuno può aiutarmi?
Scusate se non ho rispettato le varie norme per l'apertura di una discussione ma sono disperato!
Venerdì ho un esame di fondamenti di informatica e avrei un bisogno urgente di qualcuno che possa aiutarmi a implementare queste 2 funzioni
1)
Si definisca una funzione c che riceve in ingresso due array di int e verifica se tali array
sono uguali (due array sono uguali se contengono lo stesso numero di elementi, con gli
stessi valori e nello stesso ordine).
Soluzione:
typedef unsigned short int Boolean;
#define TRUE 1
#define FALSE 0
Boolean is_equal(int * U, int * V, int sizeU, int sizeV) {
int count=0;
if (sizeU != sizeV)
return FALSE;
while(count < sizeU) {
if(U[count] != V[count])
return FALSE;
else
count++;
}
return TRUE;
}
2)
Si definisca la struttura c che rappresenta un elemento di una lista in forma collegata con
puntatori (si assuma che ciascun elemento codifichi un dato di tipo float). Si definiscano
le funzioni c che realizzano l'inserimento in testa e in coda su una tale lista.
Soluzione:
struct list{
float value;
struct list * next_ptr;
};
void pre_insert(struct list** ptrptr, float value) {
struct list* tmp_ptr = *ptrptr;
*ptrptr = (struct list*)malloc(sizeof(struct list));
*ptrptr>value = value;
*ptrptr>next_ptr = tmp_ptr;
}
void suf_insert(struct list** ptrptr, float value) {
while(*ptrptr!=NULL)
prtptr = &((*ptrptr)>next_ptr);
pre_insert(ptrptr, value);
}
devo scrivere due programmi che implementino queste 2 funzioni. qualcuno può aiutarmi?
Risposte
Riguardo la prima trovo il tutto un po’ ‘prolisso’. Una espressione del tipo (a == b) ha in C il tipo int, quindi tanto vale usare quel tipo invece che Boolean.
A questo scopo puoi ritornare un semplice int e procedere come segue
Se proprio sei allergico agli ultimi standard C, sposta l'int i all'inizio e cambia il tipo di commento.
Nel secondo è sbagliato il suf_insert. NON va implementato chiamando pre_insert. Insomma se lo fai chiamando pre_insert non lo stai collegando alla lista, stai semplicemente creando una nuova lista. Inoltre in suf_insert, ptrptr NON deve essere modificato perché è in teoria l'inizio della lista.
[EDIT] Ho corretto un bug del codice e reso forse un po' più comprensibile.
A questo scopo puoi ritornare un semplice int e procedere come segue
int is_equal(int * U, int * V, int sizeU, int sizeV) { int res = (sizeU == sizeV); for(int i = 0; (i != sizeU) && res; ++i) res = (U[i] == V[i]); return res; }
Se proprio sei allergico agli ultimi standard C, sposta l'int i all'inizio e cambia il tipo di commento.
Nel secondo è sbagliato il suf_insert. NON va implementato chiamando pre_insert. Insomma se lo fai chiamando pre_insert non lo stai collegando alla lista, stai semplicemente creando una nuova lista. Inoltre in suf_insert, ptrptr NON deve essere modificato perché è in teoria l'inizio della lista.
[EDIT] Ho corretto un bug del codice e reso forse un po' più comprensibile.
ti ringrazio per la risposta, sono d'accordo con te che le funzioni siano fatte un po' così ma sono le soluzioni che la prof ha dato e devo scrivere un programma che utilizzi le funzioni così come le ha scritte lei. il fatto è che non so come farlo
, la mia conoscenza del c si limita all'aver imparato degli algoritmi a memoria per il suo esame...

Sulla prima la soluzione del professore ci può stare anche se poteva essere fatto più rapidamente, ma il secondo codice è proprio sbagliato. Di fatto potrebbe farti perdere traccia di un numero infinito di elementi. Quel codice sostituisce la lista che avevi con una formata da un solo elemento e non cancella i dati di cui perde traccia.
Comunque sono confuso: la professoressa ti ha fornito delle soluzioni, seppur sbagliate, che cosa esattamente non riesci a fare? Non riesci a fare funzioni di questo tipo?
Comunque sono confuso: la professoressa ti ha fornito delle soluzioni, seppur sbagliate, che cosa esattamente non riesci a fare? Non riesci a fare funzioni di questo tipo?