sabansa01
10-06-2021, 11:18
Ciao, sono alle prime armi con la programmazione e sto avendo problemi con un programma che non riesco a far funzionare, mi ci sto sbattendo da giorni...
La traccia consiste nel costruire un programma che si rifa al cifrario di cesare. In particolare si prende in input una stringa del tipo 4<parola-altraparola. Stringa all'interno della quale il primo carattere è detto "chiave", il secondo "direzione", i trattini separano le parole e il punto indica la fine della frase. La "traduzione" avviene, per ogni lettera della parola, prendendo la lettera che si trova *chiave* posti indietro/avanti (dipende dalla direzione) dell'alfabeto. Se ad esempio la lettera da tradurre è z e dobbiamo andare di tre posti avanti, si ricomincerà dalla a e viceversa.
Più semplicemente, se l'input è "3>come-stai." , l'output sarà frph vwdl
Scusate se mi sono spiegato male.
Comunque il mio codice è questo:
Qui trovo la chiave
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
int caesar_key(char *input)
{
int in, key;
in = input[0];
key = 48 - in;
return key;
}
Qui trovo la direzione
int caesar_direction(char *input)
{
int direction;
if(input[1] == '<')
direction = 0;
if(input[1] == '>')
direction = 1;
return direction;
}
Qui traduco l'input
char *caesar_code(int key, int direction, char *input)
{
char *out;
int end, i = 2;
do
{
for(; input[i]!='-' && input[i]!='.'; i++)
{
if(direction==0)
{
if(input[i] >= ('a' + key))
out[i-2] = input[i]-key;
else
out[i-2] = 'z' - ((key-(input[i]-'a'))-1);
}
else if(direction==1)
{
if(input[i] <= ('z' - key))
out[i-2] = input[i] + key;
else
out[i-2] = 'a' + ((key-('z'- input[i]))+1);
}
else
{
printf("\nERRORE - caesar_direction non riconosciuta\n");
return NULL;
}
}
if (input[i] == '-')
{
out[i-2] == ' ';
i++;
end = 0;
}
else if(input[i] == '.')
{
return out;
end = 1;
}
else
{
printf("\nERRORE - . o - non trovato\n");
return NULL;
}
}while(end == 0);
}
E questo è il main
int main()
{
char *input, *output;
int key, direction;
input = (char*)malloc(sizeof(char[MAX]));
output = (char*)malloc(sizeof(char[MAX]));
printf("Scrivere la parola da tradurre: ");
scanf("%s", input);
key = caesar_key(input);
direction = caesar_direction(input);
output = caesar_code(key, direction, input[MAX]);
printf("\nTraduzione:\t%s", output);
return 0;
}
Il problema si pone già al momento dello scanf: premo invio dopo aver scritto l'input, rimane fermo 3 secondi senza scrivere niente, e si chiude il programma.
Ovviamente ho già trovato altri modi per scrivere il programma, però per me è un esercitazione e vorrei capire cosa ho sbagliato, dato che ciò che ho trovato è strutturato in modo totalmente diverso da come ho fatto io.
Grazie per l'attenzione:)
La traccia consiste nel costruire un programma che si rifa al cifrario di cesare. In particolare si prende in input una stringa del tipo 4<parola-altraparola. Stringa all'interno della quale il primo carattere è detto "chiave", il secondo "direzione", i trattini separano le parole e il punto indica la fine della frase. La "traduzione" avviene, per ogni lettera della parola, prendendo la lettera che si trova *chiave* posti indietro/avanti (dipende dalla direzione) dell'alfabeto. Se ad esempio la lettera da tradurre è z e dobbiamo andare di tre posti avanti, si ricomincerà dalla a e viceversa.
Più semplicemente, se l'input è "3>come-stai." , l'output sarà frph vwdl
Scusate se mi sono spiegato male.
Comunque il mio codice è questo:
Qui trovo la chiave
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
int caesar_key(char *input)
{
int in, key;
in = input[0];
key = 48 - in;
return key;
}
Qui trovo la direzione
int caesar_direction(char *input)
{
int direction;
if(input[1] == '<')
direction = 0;
if(input[1] == '>')
direction = 1;
return direction;
}
Qui traduco l'input
char *caesar_code(int key, int direction, char *input)
{
char *out;
int end, i = 2;
do
{
for(; input[i]!='-' && input[i]!='.'; i++)
{
if(direction==0)
{
if(input[i] >= ('a' + key))
out[i-2] = input[i]-key;
else
out[i-2] = 'z' - ((key-(input[i]-'a'))-1);
}
else if(direction==1)
{
if(input[i] <= ('z' - key))
out[i-2] = input[i] + key;
else
out[i-2] = 'a' + ((key-('z'- input[i]))+1);
}
else
{
printf("\nERRORE - caesar_direction non riconosciuta\n");
return NULL;
}
}
if (input[i] == '-')
{
out[i-2] == ' ';
i++;
end = 0;
}
else if(input[i] == '.')
{
return out;
end = 1;
}
else
{
printf("\nERRORE - . o - non trovato\n");
return NULL;
}
}while(end == 0);
}
E questo è il main
int main()
{
char *input, *output;
int key, direction;
input = (char*)malloc(sizeof(char[MAX]));
output = (char*)malloc(sizeof(char[MAX]));
printf("Scrivere la parola da tradurre: ");
scanf("%s", input);
key = caesar_key(input);
direction = caesar_direction(input);
output = caesar_code(key, direction, input[MAX]);
printf("\nTraduzione:\t%s", output);
return 0;
}
Il problema si pone già al momento dello scanf: premo invio dopo aver scritto l'input, rimane fermo 3 secondi senza scrivere niente, e si chiude il programma.
Ovviamente ho già trovato altri modi per scrivere il programma, però per me è un esercitazione e vorrei capire cosa ho sbagliato, dato che ciò che ho trovato è strutturato in modo totalmente diverso da come ho fatto io.
Grazie per l'attenzione:)