Ir ao conteúdo
  • Cadastre-se

C++ Problema com desafio de String


Posts recomendados

Eu estou tentando resolver um problema no site URI Judge Online, na qual este desafio consiste em ler uma senha e identificar se ela possuí os critérios exigidos de validação de senha. O enunciado da questão 2253 encontra-se logo abaixo:

 

Rolien e Naej são os desenvolvedores de um grande portal de programação. Para ajudar no novo sistema de cadastro do site, eles requisitaram a sua ajuda. Seu trabalho é fazer um código que valide as senhas que são cadastradas no portal, para isso você deve atentar aos requisitos a seguir:

> A senha deve conter, no mínimo, uma letra maiúscula, uma letra minúscula e um número;

> A mesma não pode ter nenhum caractere de pontuação, acentuação ou espaço;

> Além disso, a senha pode ter de 6 a 32 caracteres.

Entrada

A entrada contém vários casos de teste e termina com final de arquivo. Cada linha tem uma string S, correspondente a senha que é inserida pelo usuário no momento do cadastro.

Saída

A saída contém uma linha, que pode ser “Senha valida.”, caso a senha tenha cada item dos requisitos solicitados anteriormente, ou “Senha invalida.”, se um ou mais requisitos não forem atendidos.

 

Citação

ENTRADA                                                               SAÍDA

URI Online Judge                                                    Senha invalida.

AbcdEfgh99                                                             Senha valida.

URIOnlineJudge12                                                  Senha valida.

URI Online Judge 12                                               Senha invalida.

Aass9                                                                       Senha invalida.

Aassd9                                                                     Senha valida.

 

Eu já fiz dois códigos diferentes para resolver esse problema, mas eu não estou conseguindo resolver ele, sendo que todos os casos de teste que consigo fazer estão dando certo.

 

O primeiro código que eu escrevi estava dando 10% de erro, mas percebi que estava faltando o ponto final na mensagem de "Senha válida" e "Senha inválida". Então eu fiz a inclusão, só que agora só por causa disso está dando 100% de erro, sendo que todos os casos de testes estão retornando com a resposta certa. O PRIMEIRO CÓDIGO SE ENCONTRA LOGO ABAIXO.

 

#include <cstdio>
using namespace std;
//função para descobrir se é maiuscula
int maiscula (char a) {
	if (a>='A' and a<='Z') {	
		return 0;
	}else {
		return 1;
	}
}

//função para descobrir se é minuscula
int minuscula (char a) {
	if (a>='a' and a<='z') {
		return 0;
	}else {
		return 1;
	}
}

//função para descobrir se é número
int number (char a) {
	if (a>='0' and a<='9') {
		return 0;
	} else {
		return 1;
	}
}

//função para determinar se existe um caracter estranho, como espaço ou pontuação.
int caracteres (char a) {
	if (a>='A' and a<'Z') {
		return 1;
	}else if (a>='a' and a<='z'){
		return 1;
	}else if (a>='0' and a<='9') {
		return 1;
	}else if (a=='\n'){
	    return 1;
	}else {
		return 0;
	}
}

// função principal 
int main () {
	char senha[32];
	int tamanho,validade=0;
	
  	//leitura da string e termina com quebra de linha, além de registrar o tamanho da string na variável tamanho
	for (int i=0;;i++) {
		scanf("%c",&senha[i]);
		if (senha[i]=='\n') {
			tamanho=i;
			break;
		}
	}
  	//análise da string de caracter por caracter até encontrar a primeira letra maiúscula, ao achar e se achar, a variável validade aumenta uma unidade
	for (int i=0;i<=tamanho;i++) {
		if (maiscula(senha[i])==0){
			validade+=1;
			break;
		}
	}
  	//análise da string de caracter por caracter até encontrar a primeira letra minuscula, ao achar e se achar, a variável validade aumenta uma unidade
	for (int i=0;i<=tamanho;i++) {
		if (minuscula(senha[i])==0){
			validade+=1;
			break;
		}
	}
  	//análise da string de caracter por caracter até encontrar um caracter estranho, ao achar e se achar, a variável validade decaí uma unidade
	for (int i=0;i<=tamanho;i++) {
		if (caracteres(senha[i])==0){
			validade-=1;
			break;
		}else if (i==tamanho) {
          	// se não encontrar em momento nenhum um caracter estranho até a última vez do loop, a validade aumenta uma unidadade
			validade+=1;
		}
	}
  	//análise da string de caracter por caracter até encontrar o primeiro número, ao achar e se achar, a variável validade aumenta uma unidade
	for (int i=0;i<=tamanho;i++) {
		if (number(senha[i])==0){
			validade+=1;
			break;
		}
	}
  	//Se a senha estiver no intervalo de tamanho de 6 até 32, a validade aumenta uma unidade
	if (tamanho>=6 and tamanho<=32) {
		validade+=1;
	}
  
  	//caso o somatório da validade resulte em 5, atendeu todos os critérios e pode ser considerada com senha valida, senão será considerada senha invalida
	if (validade==5){
		printf("Senha valida\n");
	}else{
		printf("Senha invalida\n");
	}

	return 0;
}

Como eu disse, esse código com a mensagem sem o ponto final está dando 10% de erro, mas quando coloco esse ponto final, fica dando 100% de erro. Só que a própria Uri Judge Online disse que tem que ter o ponto final.

Então eu resolvi apagar tudo que eu fiz e refazer o código de outra maneira sem utilizar funções, só que continua dando um erro de 100% no site, mas quando faço os casos de teste tanto no site, quanto outros inventados e até casos de teste no DeBug, está dando os resultados que deveriam ser dados. Vejam o SEGUNDO CÓDIGO.

 

#include <cstdio>
using namespace std;
int main () {
	char senha[32];
	int validade=0,tamanho;
  	
  	//leitura da string até a quebra de linha
	
  	for (int i=0;;i++) {
		scanf("%c",&senha[i]);
		if(senha[i]=='\n') {
			tamanho=i;
			break;
		}
	}
	
  	// se o tamanho dela estiver no intervalo de 6 até 32, validade aumenta
	if (tamanho>=6 and tamanho<=32) {
		validade+=1;
	}
	// quando achar a primeira maiuscula, validade aumenta
	for (int i=0;i<=tamanho;i++) {
		if (senha[i]>='A' and senha[i]<='Z') {
			validade+=1;
			break;
		}
	}
	// quando achar a primeira minuscula, validade aumenta
	for (int i=0;i<=tamanho;i++) {
		if (senha[i]>='a' and senha[i]<='z') {
			validade+=1;
			break;
		}
	}
	//quando achar o primeiro número, validade aumenta
	for (int i=0;i<=tamanho;i++) {
		if (senha[i]>='0' and senha[i]<='9') {
			validade+=1;
			break;
		}
	}
	//quando achar um caracter normal, nada aumentará, mas quando achar um diferente, validade cai 32 unidades
	for (int i=0;i<=tamanho;i++) {
		if (senha[i]>='0' and senha[i]<='9') {
		}else {
			if (senha[i]>='a' and senha[i]<='z') {
			}else {
				if (senha[i]>='A' and senha[i]<='Z' or senha[i]=='\n') {
				}else {
					validade=validade-32;
					break;
				}
			}
		}
	}
	//se o somatório da validade chegar em 4, então senha será valida, senão, senha será invalida
	if (validade>=4){
		printf("Senha valida.\n");
	}else {
		printf("Senha invalida.\n");
	}
	return 0;
}

E mesmo com esse código diferente e refeito está dando errado, como eu já disse, todos casos de teste estão dando corretamente. O que está acontecendo para esse erro gigantesco está sendo apontado pela URI Online Judge ?

Link para o comentário
Compartilhar em outros sites

@AnsiC Então, o desafio pede que só possa ter letras e números na senha, logo, não pode ser uma senha do tipo @Ass999 porque tem um símbolo, então já que qualquer outro caracter é proibido na senha, na função de caracteres estranhos do primeiro e segundo código eu coloquei que se não for letra maiúscula, se não for letra minúscula e se não for número, então é outro caracter qualquer, logo o espaço está incluído nisso e a validade diminui.

adicionado 4 minutos depois

@AnsiC Outra coisa que eu percebi na hora que eu tava mandando o post e que acho que o erro tá ali, é que eu percebi que tá escrito que são vários casos de teste até o Fim de Arquivo, ou seja, aquele while (scanf("%d",variável) != EOF). Mas como eu faço isso pra string que a leitura é com loop? Eu não sei como fazer esse while pra string 

Link para o comentário
Compartilhar em outros sites

3 horas atrás, Mateus Souza Silva de Mari disse:

int maiscula (char a) { if (a>='A' and a<='Z') { return 0; }else { return 1; }

Dica


Esse código pode ficar assim

int maiuscula (char a) { 
    return ( (a>= 'A'  && a <= 'Z') ;

}

 

Não precisa do if para condições booleanas ok ? 

A mesma técnica se aplica a testar se algarismo e se é letra minúscula.

 

Para testar se é caracter inválido, basta pensar assim : ou é minúscula, ou é maiúscula ou é  algarismo. Se não for nenhum dos 3, buzina.

 

Então a funçao seria 

int valido ( char coisa ) { 

    return ( maiuscula(coisa) or minuscula(coisa) or number(coisa) ;

 

Pronto, agora é só testar tamanhos, essas coisas.

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!