Exercicio de Tipo Abstrato de Dados (TAD)
As informações sobre o EP podem ser encontradas na especificação.
Problema Resumido
O exercicio consiste em criar um TAD para representar Strings
que será utilizado
em dois programas. O primeiro programa é bem simples e busca testar as
funções do TAD enquanto o segundo consiste em criar um programa para para
criptografar um texto segundo Cifra de Vigenère.
Simplificações
O problema apresentado apresenta algumas simplificações:
- O TAD apresenta frases formadas apenas por caracteres de [A .. Z].
- O tamanho máximo da string é de 50 caracteres. (O uso de alocação dinâmica não é obrigatório)
Observações
Entenda como retorno NULL
na especificação uma string vazia.
É obrigatório a implementação de testes de consistência como verificar caracteres válidos, índices de acesso e afins.
A assinatura das funções estão na especificação e não devem ser alteradas com exceção de erro como na operação 5 onde há ausencia de uma virgula, o que resultaria em erro de sintaxe.
As informações acima podem ser vistas na especificação de forma muito mais completa.
Daqui em diante serão apresentados informações e dicas para solução do problema, por isso recomendamos fortemente que antes de acessá-las você tente resolver o exercício sozinho e caso não consiga volte aqui.
Dicas
Mais dicas e afins serão adionadas mais tarde. Coloquei essa dica com pressa devido a duvida de alguns alunos.
Para verificar se um caractere está dentro dos padrões de [A .. Z] podemos
utilizar um
if
(clique aqui para acessar um exemplo)
Os valores de [A .. Z] na tabela asc são ordinais e consecutivos, ou seja,
para verifcar se um caractere está em [A .. Z] basta ver se ele tem valor
maior ou igual a A
e menor ou igual a Z
.
if(c >= 'A' && c <= 'Z') {
// o caractere da variavel c esta entre [A .. Z]
}
A cifra pode ser reduzida a uma equação a ser realizadas com as funções do
TAD
(clique aqui para acessar um exemplo)
Para realizar a cifra vamos usar algumas informações:
- O valor do caractere
A
na tabela ASCII é 65. - Quando o valor da soma entre os caracteres é maior que
Z
é necessário que o valor volte aA
, para isso vamos usar o operador%
(mod) com valor 26, uma vez que, são 26 caracteres distintos. - Para normalizar o valor dos caracteres vamos realizar a operação
- 'A'
nas variáveis da palavra a ser cifrada e- 'A' + 1
nas variáveis da cifra. Dessa forma na palavra a ser cifradaA
tem valor 0,B
tem valor 1… e assim por diante, enquanto na cifraA
tem valor 1,B
tem valor 2 … e assim por diante. - Utilizando isso vamos obter o caractere resultante normalizado, que somado
a
A
temos o caractere resultante.
Matematica da Cifra:
Sendo as variáveis:
CP o caracter da palavra inicial
CC o caracter da cifra
CR o carater resultante normalizado
Temos:
CR = (CP - 'A' + CC - 'A' + 1) % 26 + 'A'
CR = (CP + CC - 2 * 'A' + 1) % 26 + 'A'
Onde substituindo 'A' por seu valor 65 temos:
CR = (CP + CC - 129) % 26 + 65
Código
Código exemplo do EP1.c e saída esperada (clique aqui para acessar um exemplo)
Caso você não tenho utilizado o return NULL
modifique a primeira função.
#include <stdio.h>
#include "TipoString.h"
int main(int argc, char *argv[]) {
TipoString string;
char c;
int verificador;
// tenta criar string e falha, retornando NULL
string = CriaString("HELLO WORLD");
if(GetTamanho(string) == 0) {
printf("A string eh nula\n");
}
// cria uma nova String com o texto HELLOWORLD
string = CriaString("HELLOWORLD");
printf("A string eh: ");
ImprimeString(string);
// tenta pegar o caractere da terceira posicao da string
c = GetChar(string, 3);
printf("O caractere na posicao 3 eh: ");
printf("%c\n", c);
// tenta pegar um caractere fora do limite da string
c = GetChar(string, 43);
printf("O caractere na posicao 43 eh: ");
printf("%c\n", c);
c = GetChar(string, -1);
printf("O caractere na posicao -1 eh: ");
printf("%c\n", c);
// tenta modificar o caractere da quinta posicao da string para um caractere
// invalido
verificador = SetChar(&string, 5, 'a');
if(verificador == 0) {
printf("A string alterada com sucesso\n");
} else {
printf("A string nao foi alterada\n");
}
printf("String apos tentar alterar o 5 caractere para a eh: ");
ImprimeString(string);
// tenta modificar o caractere fora do limtie' da string para um caractere
verificador = SetChar(&string, 30, 'F');
if(verificador == 0) {
printf("A string alterada com sucesso\n");
} else {
printf("A string nao foi alterada\n");
}
printf("String apos tentar alterar o 30 caractere para F eh: ");
ImprimeString(string);
// tenta modidicar o caractere da quarta posicao da string para S
verificador = SetChar(&string, 4, 'S');
if(verificador == 0) {
printf("A string alterada com sucesso\n");
} else {
printf("A string nao foi alterada\n");
}
printf("String apos tentar alteras o 4 caractere para S eh: ");
ImprimeString(string);
// insere 'A's na string ate que nao seja possivel
verificador = 0;
while(verificador == 0) {
verificador = InsereChar(&string, 'A');
if(verificador == 0) {
printf("A string alterada com sucesso\n");
} else {
printf("A string nao foi alterada\n");
}
printf("String apos tentar inserir A eh: ");
ImprimeString(string);
}
return 0;
}
A saída do programa é:
A string eh nula
A string eh: HELLOWORLD
O caractere na posicao 3 eh: L
O caractere na posicao 43 eh: !
O caractere na posicao -1 eh: !
A string nao foi alterada
String apos tentar alterar o 5 caractere para a eh: HELLOWORLD
A string nao foi alterada
String apos tentar alterar o 30 caractere para F eh: HELLOWORLD
A string alterada com sucesso
String apos tentar alteras o 4 caractere para S eh: HELLSWORLD
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
A string alterada com sucesso
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
A string nao foi alterada
String apos tentar inserir A eh: HELLSWORLDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA