Repository 32bit  Forum
Repository 64bit  Wiki

Un classico: il frasario di Cesare[Risolto!]

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

Un classico: il frasario di Cesare[Risolto!]

Messaggioda Blallo » lun lug 06, 2009 17:32

Codice: Seleziona tutto
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXLN 80

int main()
{
   char strIN[MAXLN], strOUT[MAXLN], strWORK[MAXLN];
   FILE *fpIN, *fpOUT;
   int code, i, c;

   printf("Inserire nome file:");
   scanf("%s",&strIN);
   if((fpIN=fopen(strIN,"r"))==NULL)
   {
      fprintf(stderr,"Errore apertura file");
      return EXIT_FAILURE;
   }
   printf("Inserire codice:");
   scanf("%d",&code);
   printf("Inserire nome output:");
   scanf("%s",&strOUT);
   if((fpOUT=fopen(strOUT,"w"))==NULL)
   {
      fprintf(stderr,"Errore creazione output");
      return EXIT_FAILURE;
   }

   while((fgets(strWORK,MAXLN,fpIN))!=NULL)
   {
      for(i=0;i<strlen(strWORK);i++)
      {   
         c=strWORK[i];
         if(islower(c))
         {
            toupper(c);
            if(c>=('Z'-code+1))
               c='Z'-c+1-code;
            else
               c+=code;
            tolower(c);
            strWORK[i]=(char)c;
         }
         else
         {
            if(c>=('Z'-code+1))
               c='Z'-c+1-code;
            else
               c+=code;
            strWORK[i]=(char)c;
         }      
      }
      fputs(strWORK,fpOUT);
   }

   fclose(fpIN);
   fclose(fpOUT);
   return EXIT_SUCCESS;
}

devo creare un programma che dato un valore mi "sposti" le lettere dell'alfabeto di quel tot di valori e che dato un file di input me lo converta. Ora questo riconosce correttamente le lettere ma me le sostituisce con caratteri "scemi". cosa può essere?
Ultima modifica di Blallo il lun lug 06, 2009 20:09, modificato 1 volta in totale.
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3212
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: Un classico: il frasario di Cesare

Messaggioda Mario Vanoni » lun lug 06, 2009 17:39

man rot13
il codice e` in Slackware,
come spunto ...
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: Un classico: il frasario di Cesare

Messaggioda FireEater » lun lug 06, 2009 17:45

E' normale, stai sommando o sottraendo un valore al codice ASCII della lettera che leggi, se superi la A o la Z vengono stampati altri caratteri...

CONTROLLA QUEL toupper. :evil:

Ciao
FE
Avatar utente
FireEater
Linux 2.6
Linux 2.6
 
Messaggi: 508
Iscritto il: sab feb 05, 2005 0:00
Località: Cagliari <---> Torino
Nome Cognome: Giuseppe M.
Slackware: Current
Kernel: 2.6.32.7-smp
Desktop: kde 4.3.4

Re: Un classico: il frasario di Cesare

Messaggioda m0rdr3d » lun lug 06, 2009 17:55

secondo la documentazione in rete, la funzione toupper non modifica il parametro sul posto, ma ritorna il carattere modificato.
Per cui, nel tuo codice, è come se non facessi la chiamata alla funzione.
Avatar utente
m0rdr3d
Linux 2.4
Linux 2.4
 
Messaggi: 404
Iscritto il: dom dic 24, 2006 13:40
Slackware: Slackware64-current
Kernel: 3.4.*
Desktop: KDE 4.8.2

Re: Un classico: il frasario di Cesare

Messaggioda FireEater » lun lug 06, 2009 18:04

Eh.. ma così non vale :lol: jimmy_page_89 ci sarebbe dovuto arrivare da solo :D

Aldilà della documentazione si nota subito che una variabile allocata sullo stack e passata per valore non può essere modificata da una funzione.
Avatar utente
FireEater
Linux 2.6
Linux 2.6
 
Messaggi: 508
Iscritto il: sab feb 05, 2005 0:00
Località: Cagliari <---> Torino
Nome Cognome: Giuseppe M.
Slackware: Current
Kernel: 2.6.32.7-smp
Desktop: kde 4.3.4

Re: Un classico: il frasario di Cesare

Messaggioda Gugli » lun lug 06, 2009 18:17

Inoltre stai attento anche qui:
Codice: Seleziona tutto
<< scanf("%s",&strOUT);
>> scanf("%s", strOUT);
Gugli
Linux 1.0
Linux 1.0
 
Messaggi: 6
Iscritto il: lun lug 06, 2009 18:15
Slackware: 13.0
Kernel: 2.6.32.7
Desktop: KDE

Re: Un classico: il frasario di Cesare

Messaggioda FireEater » lun lug 06, 2009 18:25

Già... ma probabilmente jimmy_page_89 non ha ancora studiato il significato di "&" e di passaggi per valore o riferimento.
Sono errori normali e se continuerà ad esercitarsi con questo ritmo spariranno presto. :thumbright:
Avatar utente
FireEater
Linux 2.6
Linux 2.6
 
Messaggi: 508
Iscritto il: sab feb 05, 2005 0:00
Località: Cagliari <---> Torino
Nome Cognome: Giuseppe M.
Slackware: Current
Kernel: 2.6.32.7-smp
Desktop: kde 4.3.4

Re: Un classico: il frasario di Cesare

Messaggioda Blallo » lun lug 06, 2009 18:38

m0rdr3d ha scritto:secondo la documentazione in rete, la funzione toupper non modifica il parametro sul posto, ma ritorna il carattere modificato.
Per cui, nel tuo codice, è come se non facessi la chiamata alla funzione.

esattamente questo è il rpoblema...ho risolto uguagliandolo a una variabile int che poi ho provveduto anche a dare in pasto al resto della funzione
ora funziona perfettamente! Grazie!
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3212
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: Un classico: il frasario di Cesare

Messaggioda m0rdr3d » lun lug 06, 2009 19:00

FireEater ha scritto:Eh.. ma così non vale :lol: jimmy_page_89 ci sarebbe dovuto arrivare da solo :D

Aldilà della documentazione si nota subito che una variabile allocata sullo stack e passata per valore non può essere modificata da una funzione.

Infatti ho cercato di dare più un'indicazione che la soluzione, ma forse sono stato un po' troppo generoso ;-)
Ultima modifica di m0rdr3d il lun lug 06, 2009 20:04, modificato 1 volta in totale.
Avatar utente
m0rdr3d
Linux 2.4
Linux 2.4
 
Messaggi: 404
Iscritto il: dom dic 24, 2006 13:40
Slackware: Slackware64-current
Kernel: 3.4.*
Desktop: KDE 4.8.2

Re: Un classico: il frasario di Cesare

Messaggioda Blallo » lun lug 06, 2009 19:45

m0rdr3d ha scritto:Infatti ho cercato di dare più un'indicazione che la soluzione, ma forse sono stato un troppo generoso ;-)

la ringrazio della clemenza e disopnibilità accordatami :mille:
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3212
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti