|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
[C] Esercizi vari su liste
Si scriva una funzione ricorsiva che data una lista di caratteri L calcoli il numero di cifre contenute nella lista.
int conta_cifre(L_PTR L) a->3->f->d->j->4->NULL la funzione restituirà 2 Codice HTML:
#include <stdio.h> struct nodo{ int data; struct nodo *next} int main(){ typedef struct nodo NODO; typedef struct nodo *NEXT; int conta_cifre(NODO L1){ if(L1->data!=NULL){ if((L1->data>='0')&&(L1->data<=9)){ return (L1->data-'0') + conto_cifre(L1->NEXT);} else return conto_cifre(L1->NEXT);} else return 0;} La funzione dovrebbe essere corretta, ma non so se ho dichiarato bene la struttura e ho usato bene i nomi della lista. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
Ho corretto qualcosa
Codice HTML:
#include <stdio.h> struct nodo{ int data; struct nodo *next} int main(){ typedef struct nodo LISTA; typedef struct nodo *L_PTR; int conta_cifre(l_PTR L){ if(L->data!=NULL){ if((L->data>='0')&&(L->data<=9)){ return L->data + conto_cifre(L->next);} else return conto_cifre(L1->next);} else return 0;} |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
Qesto eserczio invece cancella tutti i numeri K e i multipli di K dalla lista
Codice HTML:
#include <stdio.h>
struct nodo{
int data;
struct nodo *ptr;};
int main(){
typedef struct nodo LISTA;
typedef struct nodo *L_PTR;
int cancellamultipli(L_PTR L, int k){
int temp;
int elem=0;
while(L->data!=NULL){
resto=(L->data)%k;
elem=L->data;
if((elem==k)!!(resto==0){
temp=L;
free(temp);}
L=L->next;}
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
HO RISCRITTO IL PRIMO ESERCIZIO
Codice HTML:
#include <stdio.h> struct nodo{ int data; struct nodo *next} int main(){ typedef struct nodo LISTA; typedef struct nodo *L_PTR; int conta_cifre(l_PTR L){ if(L!=NULL){ if((L>='0')&&(L<='9')){ return L + conto_cifre(L->next);} else return conto_cifre(L->next);} else return 0;} |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
|
Quote:
Codice:
int conta_cifre(l_PTR L){
if(L!=NULL){
if((L->data>='0')&&(L->data<='9'))
return 1 + conto_cifre(L->next);
else
return conto_cifre(L->next);
} else
return 0;
}
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
Comq il programma deve sommare tutte le cifre che compaiono nella stringa, non incrementare un contatore.
comq come l'avevo scritta io, tranne per quell'errore L!=NULL avrebbe funzionato? |
|
|
|
|
|
#7 | ||
|
Senior Member
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
|
Quote:
![]() Quote:
Codice:
return L + conto_cifre(L->next); Codice:
return (L->data - '0') + conto_cifre(L->next);
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN |
||
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
si hai ragione, deve solo contare quante cifre ci sono
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
Ne approfitto del topic per chiedervi perchè non funziona questo esercizio che verifica se due vettori hanno esattamente gli stessi elementi. Restituiste 0 se sono diversi e 1 se hanno gli stessi elementi ma anche in posizioni diverse
Codice HTML:
#include <stdio.h>
int main(){
int n;
int m;
int a[n];
int b[m];
int risultato=0;
int x;
int y;
int i;
int j;
printf("Inserisci la lunghezza del vettore a:\n");
scanf("%d", &n);
for(i=0;i<n;i++){
printf("Inserisci un elemento:\n");
scanf("%d", &x);
a[i]=x;}
printf("Inserisci la lunghezza del vettore b:\n");
scanf("%d", &m);
for(i=0;i<m;i++){
printf("Inserisci un elemento:\n");
scanf("%d", &y);
b[i]=y;}
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(a[i]==b[j]){
risultato=1;
break;}}
if(risultato=0){break;}
risultato=0;}
for(j=0;j<m;j++){
for(i=0;i<n;i++){
if(b[j]==a[i]){
risultato=1;
break;}}
if(risultato=0){break;}
risultato=0;}
printf("%d\n", risultato);
while(getchar() != '\n');
printf("Premere INVIO per continuare...");
getchar();}
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
La "mia" soluzione:
Codice:
int conta_cifre (L_PTR ptr)
{
if (ptr != NULL)
return conta_cifre (ptr->next) + (ptr->data >= '0' && ptr->data <= '9');
return 0;
}
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Semi-OT
xbubbax: mi nasce qualche dubbio sul tuo modo di indentare il codice...attento che in questo modo superi molto spesso il limite dei caratteri nella linea. Se in un esercizio il limite non si mette mai, nei progetti seri il limite è sempre imposto fra gli 80 e 100 caratteri.
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Non va affatto bene. La dimensione del vettore è stabilita al momento stesso della dichiarazione. A parte il fatto che la definizione di un array a lunghezza variabile è possibile solo in C++ o nel C99 ma non nel "ANSI C". Comunque quanto valgono n e m?? Non lo sai (non sono inizializzate), quindi la lunghezza degli array è ... boh??
Quindi non serve a nulla fare in seguito: scanf("%d", &n), la allocazione dell'array non è "retroattiva".....
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
andbin sarà sbagliato ma ti assicuro che funziona.
come dovrei scrivere? comq mi interessa soprattutto sapere cosa sbaglio nel resto del programma, cioè nel programma vero e proprio, questi sono dettagli per il numero di righe posso sempre andare a capo, mica devo scrivere tutto su un'unica riga, o no |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
|
Quote:
Io non avrei mai fatto l'operazione del passo ricorsivo, perchè non avrei mai pensato che, in fondo, un valore "booleano" per il C è pur sempre un byte posto ad 1, cioè appunto un int che vale 1 o 0 a seconda del valore del test, e che quindi puoi sommarlo al risultato della ricorsione tranquillamente: è troppo tempo che lavoro in Java e sono diventato "strongly-typed"...
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN |
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Hai voglia a chiamarlo "dettaglio" non sapere quanti elementi sono stati allocati per gli array......
EDIT: avevo risposto qui in passato ad una questione del genere.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) Ultima modifica di andbin : 13-08-2007 alle 11:30. |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Inoltre con il tuo metodo con pochissimi blocchi annidati raggiungi il termine della riga. Se ad esempio avessi una funzione: unsigned double funzioneCheFaQualcosa(unsigned int primo, unsigned int secondo, unsigned int terzo) Quanto spazio ti resta ? Molto poco |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
- il valore boolean FALSE e' associato all'intero di valore 0; - il valore boolean TRUE e' associato a qualsiasi numero diverso da zero; Pertanto un compilatore che decida di ritornare 3, 5 o -1 come esito di una espressione booleana, sarebbe perfettamente accettabile, e magari e' anche probabile che succeda quando si attivano le opzioni di ottimizzazione... In tal caso sarebbe meglio usare un operatore ternario e scongiurare il pericolo.
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
Qualcuno mi aiuta a capire l'altro esercizio?
Ultima modifica di xbubbax : 13-08-2007 alle 14:50. |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
|
Edit
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN Ultima modifica di Mixmar : 13-08-2007 alle 13:40. |
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Gli operatori < (minore), > (maggiore), <= (minore di o uguale a) e >= (maggiore di o uguale a) generano tutti 0 se la relazione specificata è falsa e 1 se è vera. Il tipo del risultato è int.Nella espressione che ho scritto io c'è solo di mezzo un AND logico, il che non cambia nulla sui valori forniti dagli operatori relazionali. Certo, sarebbe altrettanto corretto.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:02.





















