Newsgroup: it.comp.lang.c
Titolo: Aiutate un principiante

Sono al primo anno di ingegneria e ho un proglema con il passaggio di 
vettori è il lavoro ricorsivo.
Il problema è quello del libro "d&d c corso completo" esercizio 6.33
Un palindromo è una stringa che si legge allo stesso modo da sinistra a 
destra e da destra a sinistra.Alcuni esempi sono "radar", "able was i ere i 
saw elba". Scrivere una funzione ricorsiva testpalindrome che restituisca 
1,qualora la stringa immagazinata nel vettore sia un palindromo, e 0 in caso 
contrario.la
 funzione dovrà ignorare gli spazi e la punteggiatura 
eventualmente presenti nella stringa:
il codice cho ho pensato è:
#include <stdio.h>
int testpalindrome(char [],int,int);
int main(){
int dimensione=20,i=1,verifica=0;
char stringa[dimensione];
printf("Inserisci una stringa: ");
scanf("%s",stringa);
while(stringa[verifica]!='\0'){
         verifica++;
         dimensione=verifica;
         printf("%d",dimensione);
}
verifica=testpalindrome(stringa,i,dimensione);
if(verifica==1)
   printf("Palindromo");
else
   printf("non palindromo");
}
int testpalindrome(char stringa[],int i,int dimensione){
char copia[dimensione];
if(stringa[i]!='\0'){
   copia[dimensione]=stringa[i];
   if(stringa[i]==copia[dimensione]){
      printf("%c  %c",stringa[i],stringa[dimensione-i]);
      testpalindrome(stringa,i++,dimensione--);
      return 1;
   }
   else
   return 0;
}
else
  printf("Fine");
}
il problema è che non funziona. vi prego di aiutarmi, dimenticavo non posso 
utilizzare per risolvere il problema i puntatori, in pratica il libro mi 
dice di risolvere i problemi con le conoscenze che ho appreso sino al 
capitolo 6.

 il problema č che non funziona. 
"non funziona" non significa nulla. Magari, spiega piuttosto che errore 
da. E impara ad usare un debugger qualunque! :D
-- 
Mat/tia Belletti - Undergraduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://mbellett.web.cs.unibo.it/
Jabber: RedGlow  - Linux registered user 299762 @ machine 213003

 Questo lo accetta solo il C99 - sarebbe meglio usare un #define.
...
Premetto che non intendo polemizzare. Ma pensi che sia corretto 
consigliare di non seguire lo standard corrente per attenersi a quello 
precedente ? Capisco  le possibili questioni di portabilita' in 
ambilenti che non dispongano di un compilatore c99 ma troppo 
conservatorismo mi sembra controproducente. Tutto sommato lo standard 
esiste per garantire la massima portabilita' e 5 anni mi sembrano un 
tempo ragionevole per cominciare ad usare le potenzialita' del nuovo 
standard. O no ?
Giorgio


Che vuoi farci, sono ancora vecchia maniera :)
Scherzi a parte, mi pare sia uno standard che ancora non venga molto 
seguito. Inerzia, che noi dovremmo combattere? Forse. Cmq, come noti, ho 
specificato che era C99, non ho detto che era un errore, proprio perche' 
non ho poi nulla in contrario se uno vuole scrivere seguendo quello 
standard.


...

#include <string.h>
int testpalindrome(char *stringa, int indice,int dimensione)
{
   int opposto = (dimensione - 1) - indice; // carattere speculare
   if (opposto <=indice)  return 1; // ho superato la meta della stringa
 
   if(stringa[opposto]!=stringa[dimensione]) return 0;
   return testpalindrome(stringa,i+1,dimensione) 
}
void main()
{
  char parola[30];
  scanf("%s",parola);
  int risultato=testpalindrome(parola,0,strlen(parola));
}

 vettori è il lavoro ricorsivo.
dal codice che hai postato mi sembra che ignori
che la numerazione degli elementi dei vettori parte
da 0.
Se una stringa e' lunga 3 caratteri, ABC allora
in posizione 0 ci sara' A, in posz. 1 ci sara' B,
in posizione 2 ci sara' C e in posizione 3 ci sara'
il carattere zero che indica la fine della stringa.
la tua funzione mi sembra essessivamente complicata.
Visto che stiamo facendo un esercizio (e l'efficienza
e' gia' andata a farsi benedire...) e poi non mi
sembra che che tu ti occupi del problema di
ignorare spazi e punteggiatura.
int testpal(char s[], int a, int z)
{
   while (a<=z && !isalpha(s[a])) a++;
   while (a<=z && !isalpha(s[z])) z--;
   if (s[a]==s[z]) return testpal(s,a+1,z-1);
   else return 0;
}
la funziona isalpha controlla che il carattere sia
alfabetico e la trovi in ctype.h
In alternativa, anche se non e' portabile, ma
con alta probabilita' funziona sulla tua macchina e quindi per
un esercizio va bene,
puoi definire
int isalpha(char c)
{
   return (c<='z' && c>='a') || (c<='Z' && c>='z');
}
in pratica passiamo alla funzione il riferimento
al vettore e due indici che indicano il primo
e l'ultimo carattere.
i due cicli while servono a saltare gli eventuali
caratteri non alfabetici.
Dopo di che si confrontano i caratteri.
Se sono uguali si passa a testare la stringa "interna"
ottenuta eliminando il primo e l'ultimo carattere.
se sono diversi allora non e' palindroma.
La funzione andra' invocata con
v = testpal(s,0,strlen(s)-1);
ciao,
e.