Ir ao conteúdo

Posts recomendados

Postado

To com problema na parte de testar se a senha é valida e no total de outros caracteres( parte 6 e 7). também to com algum erro de parametros no codigo, ou seja, to fudidasso. 

 

exercicio é o seguinte: 

 

" Leia um texto de até 50 caracteres correspondente ao cadastro de uma senha. Verifique se a senha é válida para cadastro. Para isso implemente, as funções abaixo: a. Implemente a função totalCaracteres que recebe como parâmetro uma string e retorna o total de caracteres válidos nessa string. (não utilizar strlen). b. Implemente a função contaNumero que recebe como parâmetro uma string e retorna a quantidade de caracteres numéricos (algarismo entre 0-9) que aparecem na string. (Obs.: utilize os valores da tabela ASCII para fazer as comparações). c. Implemente a função contaLetraMaiuscula que recebe como parâmetro uma string e retorna a quantidade de caracteres que são letras maiúsculas (A-Z). (Obs.: utilize os valores da tabela ASCII para fazer as comparações). d. Implemente a função contaLetraMinuscula que recebe como parâmetro uma string e retorna a quantidade de caracteres que são letras minúsculas (a-z) (Obs.: utilize os valores da tabela ASCII para fazer as comparações). e. Implemente a função contaSimbolo que recebe como parâmetro uma string e retorna a quantidade de caracteres que são símbolos conforme a lista abaixo: i. se for qualquer símbolo da tabela ASCII a partir do símbolo de exclamação ( ! ) - código ASCII 33 até a ponto ( . ) - código ASCII 46. ii. interrogação (?) - código ASCII 63 iii. arroba ( @ ) - código ASCII 64 iv. sublinhado ( _ ) - código ASCII 95 f. No main, escreva um programa que leia uma string de tamanho máximo 50. Utilizando as funções anteriormente escritas, conte e mostre: i. o total de caracteres ii. total de algarismos numéricos iii. total de letras maiúsculas iv. total de letras minúsculas v. total de símbolos vi. total de outros caracteres (nem letra, nem número, nem símbolo). vii. Verifique e informe se a senha é válida ou não: a. Válida: no mínimo 8 caracteres, com pelo menos: um caractere do tipo numérico, uma letra maiúscula, uma letra minúscula e um símbolo. Não pode ter outro tipo de caractere além dos descritos." 

 

//Brian Nicolas Dias Costa
#include <stdio.h>
#include <stdlib.h>
#include <string.h>



/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int totalCaracteres(char senha[50]){
	int i, total;
	for(i=0; i<50; i++){
		if(senha[i] != '\0'){
			total++;
		}else{
			return total;
		}
	}
	return total;
}

int contaNumero(char senha[50]){
	int i, num;
	for (i=0; i =! '\0'; i++){
		if(senha[i] >47 && senha[i]< 58){
			num++;
		
		}else{
			return num;
		}
	}
	return num;
}

int contaLetraMaiuscula(char senha[50]){
	int i, maiuscula;
	for (i=0; i =! '\0'; i++){
		if(senha[i] >= 65 && senha[i] <= 90){
			maiuscula++;
		
		}else{
			return maiuscula;
		}
	}
	return maiuscula;
}

int contaLetraMinuscula(char senha[50]){
	int minuscula, i;
	for (i=0; i =! '\0'; i++){
		if(senha[i] >= 97 && senha[i] <= 122){
			minuscula++;
		
		}else{
			return minuscula;
		}
	}
	return minuscula;	
}

int contaSimbolo(char senha[50]){
	int simbolo, i;
	for (i=0; i =! '\0'; i++){
		if(senha[i] >= 33 && senha[i] <= 46){
			simbolo++;
		}else if(senha[i] == 63 || senha[i] == 64 || senha[i] == 95){
			simbolo++;
		}
	}
	return simbolo;
}



int main(int argc, char *argv[]) {
	char senha[50];
	printf("Digite sua senha\n");
	scanf("%s", &senha[50]);
	printf("Total de caracteres: %d\n", totalCaracteres(senha[50]));
	printf("Total de caracteres numericos: %d\n", contaNumero(senha[50]));
	printf("Total de letras maiusculas: %d\n", contaLetraMaiuscula(senha [50]));
	printf("Total de letras minusculas: %d\n", contaLetraMinuscula(senha [50]));
	
		
	return 0;
}

 

  • Amei 1
Postado

@Brian Nicolas    seu código não está Compilando , você está enviando o caractere da posição cinquenta da variável senha , para a função , que recebe uma string ,  e isso é um erro , e tem outro , como esse nessa função

int contaNumero(char senha[50])
{
    int i, num=0;
    for (i = 0; i = !'\0'; i++)
    {
        if (senha[i] > 47 && senha[i] < 58)
        {
            num++;
        }
        else
        {
            return num;
        }
    }
  return num;
}

o loop for não funcionará certo assim ,não , e essa parte de seu código poderia ser assim  :

int contaNumero(char senha[50])
{
    int i, num=0;
    for (i = 0; sebha[i] != '\0'; i++)     // aqui percorre a string até encontrar o 
    {                                      // caracter nulo '\0' finalizador de string
        if (senha[i] > 47 && senha[i] < 58)// nesse intervalo de ASCII estão os digitos
        {
            num++;                         // incrementa a quantidade de dígitos
        }
/*      else                               // esse trecho é desnescessário e além de ser errado
        {                                  // pois termina o Loop caso o primeiro caractere esteja fora dessa faixa
			printf("valor de i %d\n", i); Sleep(3000);
			return num;
		}   */ 
    }
  return num;
}

 

  • Curtir 1
Postado

@Brian Nicolas   sua função main poderia se assim  :

#define _CRT_SECURE_NO_WARNINGS       // para usar scanf e strcpy bem no visuaL studio
#include <iomanip>                    // biblioteca da Linguagem C++ para trabalhar com vetores
int totalCaracteres( char senha[50] );// protótipo da função que é melhor ser colocada depois da função main
int main(int argc, char* argv[])
{
	char senha[50];
	printf("Digite sua senha --: ");
	scanf("%s",senha);
	printf("Total de caracteres -----------: %d\n",     totalCaracteres(senha) );// envia a string
	printf("Total de caracteres numericos -: %d\n",         contaNumero(senha) );
	printf("Total de letras maiusculas ----: %d\n", contaLetraMaiuscula(senha) );
	printf("Total de letras minusculas ----: %d\n", contaLetraMinuscula(senha) );
    return 512;                        // nada não , 
}
int totalCaracteres( char senha[50] )  // recebendo a string enviada por parâmetro
{
    printf("aqui na funcao totalCaracteres a senha %s\n",senha);
    int i, total=0;
    for (i = 0; senha[i] != '\0'; i++) // percorre a string até encontrar o caractere nulo '\0' finalizador de string
        total++;                       // incrementa
    return total;                      // retorna o total de caracteres da string
}

 

  • Curtir 1
Postado
5 horas atrás, Brian Nicolas disse:

scanf("%s", &senha[50]);

 

  • scanf() não é o que devia usar para ler do teclado. scanf() tem esse nome por uma razão: o objetivo: scan formatted input. O teclado não é isso.
     
  • scanf() retorna um int com o total de valores lidos. TESTE. Leia o manual.
     
  • scanf() espera um endereço para onde transferir os dados que ler. 
     
        char senha[50];

        Se senha é char[50] aposto que pretende ler a senha e colocar a partir de senha[0]. Então porque escreveu &senha[50]? Só vai cancelar o seu programa.

 

2 horas atrás, Brian Nicolas disse:

e como faço para em vez de enviar a posiçao 50, enviar a string completa?

 

Ao ler coloque os dados a partir do início...

 

5 horas atrás, Brian Nicolas disse:

Verifique e informe se a senha é válida ou não

 

Ignorou essa parte?

 

Seu enunciado é bem claro. Escreva as funções nessa ordem. Só isso.
 

Citação

Se a senha é válida o tamanho dela é igual à soma das letras números e símbolos aceitos, tudo que suas funções já computaram... Basta somar e comparar com o tamanho, que você também já calculou... Não há razão para complicar.

 

O que é a senha válida?

 

Uma expressão. Em C zero é falso, o resto é verdadeiro. Então...
 

    int senha_valida = totalCaracteres(senha) == (
        contaNumero(senha) + 
        contaLetraMaiuscula(senha) +
        contaLetraMinuscula(senha) +
        contaSimbolo(senha)
    );

 

Uma linha só. Escrevi em mais apenas para o editor do forum não cortar o texto. Claro, podia ser uma função mas o enunciado não inclui essa. E aí 
 

if ( senha_valida )
	printf( "senha '%s' valida!\n");
else
	printf( "senha '%s' invalida!\n");

 

esse if() mostra se a senha é válida. Claro que aquela linha anterior podia estar dentro do if e nem precisava de uma variável para isso. Mas assim é mais fácil de ler.
 

Faça o simples e escreva em torno dos dados

 

Complicado:
 

int contaLetraMinuscula(char senha[50]){
	int minuscula, i;
	for (i=0; i =! '\0'; i++){
		if(senha[i] >= 97 && senha[i] <= 122){
			minuscula++;
		
		}else{
			return minuscula;
		}
	}
	return minuscula;	
}

 

Simples:
 

int contaLetraMinuscula(char* senha)
{
    int n = 0; // contador
    char* p = &senha[0]; // primeira letra da senha
    while( *p != 0) // 0 marca o fim da string
    {
        if( *p >=  97 && *p <= 122 ) n += 1;
        p += 1; // proxima letra
    }
    return n;
}

 

Faça o simples, em todas as funções.

 

 

  • Curtir 1
  • Obrigado 1
Postado

O codigo ficou o seguinte: 

//Brian Nicolas Dias Costa
#include <stdio.h>
#include <stdlib.h>
#include <string.h>



/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int totalCaracteres(char* senha);
int contaNumero(char* senha);
int contaLetraMaiuscula(char* senha);
int contaLetraMinuscula(char* senha);
int contaSimbolo(char* senha);



int main(int argc, char *argv[]) {
	char senha[50];
	printf("Digite sua senha\n");
	gets(senha);
	printf("Total de caracteres: %d\n", totalCaracteres(senha));
	printf("Total de caracteres numericos: %d\n", contaNumero(senha));
	printf("Total de letras maiusculas: %d\n", contaLetraMaiuscula(senha));
	printf("Total de letras minusculas: %d\n", contaLetraMinuscula(senha));
	printf("Total de simbolos: %d\n", contaSimbolo(senha));
	//testa se a senha é valida ou não
	int senha_valida = totalCaracteres(senha) == (contaNumero(senha) + contaLetraMaiuscula(senha) + contaLetraMinuscula(senha) + contaSimbolo(senha));
	if(senha_valida){
		printf("Senha valida\n");
	}else{
		printf("Senha invalida\n");
	}
	
		
	return 0;
}

int totalCaracteres(char* senha){
	int i, total;
	for(i=0; i<50; i++){
		if(senha[i] != '\0'){
			total++;
		}else{
			return total;
		}
	}
	return total;
}

int contaNumero(char* senha){
int n = 0; // contador
    char* p = &senha[0]; // primeira letra da senha
    while( *p != 0) // 0 marca o fim da string
    {
        if( *p >= 48 && *p <= 57 ) n += 1;
        p += 1; // proxima letra
    }
    return n;
}

int contaLetraMaiuscula(char* senha){
	int n = 0; // contador
    char* p = &senha[0]; // primeira letra da senha
    while( *p != 0) // 0 marca o fim da string
    {
        if( *p >=  65 && *p <= 90 ) n += 1;
        p += 1; // proxima letra
    }
    return n;
}

int contaLetraMinuscula(char* senha){
	int n = 0; // contador
    char* p = &senha[0]; // primeira letra da senha
    while( *p != 0) // 0 marca o fim da string
    {
        if( *p >=  97 && *p <= 122 ) n += 1;
        p += 1; // proxima letra
    }
    return n;
}

int contaSimbolo(char* senha){
	int n = 0; //contador
	char* p = &senha[0]; //primeira letra da senha
	while( *p != 0){ // 0 = fim da string
		if( *p >= 33 && *p <= 46) n++;
			p++;
		if(*p == 63 || *p == 64 || *p == 95)n++;
			p++; //proxima letra
		
	}
	return n;

}

 

E ja que você disse aquela parada do scanf, resolvi usar gets pra ler a string

  • Curtir 1
Postado
1 hora atrás, Brian Nicolas disse:

gets(senha);

 

Má ideia. gets() na prática não existe mais em alguns compiladores, e foi condenada há uns 15 anos e marcada como insegura e obsoleta. Use fgets(), que resolve o problema ingênuo de gets(): tem um limite para o tamanho da entrada.
 

Escreva o simples
 

    fgets( senha, 50, stdin );


Se seu compilador aceitou isso e não te deu mensagens avisando, está compilando com as opções erradas. Use -Wall no mínimo.

 

totalCaracteres()

 

int totalCaracteres(char* senha){
	int i, total;
	for(i=0; i<50; i++){
		if(senha[i] != '\0'){
			total++;
		}else{
			return total;
		}
	}
	return total;
}

 

 

Em 09/12/2020 às 01:17, arfneto disse:

Faça o simples, em todas as funções.

 

Isso não é o simples, e nem funciona. Está errado:

  • está testando duas coisas ao invés de uma só: não precisa testar (i<50). Use fgets() e o compilador vai garantir isso pra você. Ou use gets() e o compilador vai garantir isso pra você: se passar de 50 vai cancelar seu programa e não vai chegar nesse if(). Inútil de todo modo.
     
  • Basta contar de um em um até achar o zero.
     
  • Entenda que fgets() ou mesmo gets() garantem que tem um '\n' o tal newline ao final da string. Leu o manual? Imagino que não queira incluir isso no tamanho da string e se é o caso precisa diminuir um na conta
     
  • está declarando mais de uma variável por linha e isso não é assim bom: só atrapalha você e quem vai ler o programa
     
  • não está inicializando todas as variáveis e isso é um erro. E é um erro MESMO porque total tinha que ser zerado antes de começar a somar nele
     
  • está declarando i, a variável de controle do loop que não devia ter escrito, fora do loop. Isso é outro erro. Levou décadas para a comunidade convencer o comitê que controla a linguagem C para permitir a declaração DENTRO do for. Só que isso foi em '89. Sim, 1989. É muito arriscado e ingênuo deixar uma variável com o nome "i" válida durante todo o programa
     
  • qual a razão de escrever '\0' e não simplesmente 0 ?
     
  • tem dois return sem necessidade

Testou isso uma vez ao menos?

 

E eu te mostrei o simples. Era só copiar. Como eu disse, todas essas funções são iguais.

 

Compare com o simples:
 

int strlen(char* p)
{
    int n = 0; // contador
    while( *p != 0 ) 
    {   n += 1;
        p += 1; // proxima letra
    }
    return n;
}

 

Sim, você pode usar o mesmo nome que a função da biblioteca. É até o simples: está reescrevendo uma função que o mundo inteiro conhece e para fazer exatamente a mesma coisa que strlen() faz... E se depois mudar de ideia e quiser usar a de string.h não precisa mudar o programa ;) : basta apagar a definição da que escreveu.

 

E usando aqui:

  • um único teste
  • uma única variável, o óbvio contador, iniciando em zero

O comum e mais simples ainda é escrever:
 

int strlen(char* p)
{
    int n = 0; // contador
    while( *p++ != 0 ) n += 1;
    return n;
}

 

Usando o operador de incremento ++ para avançar o ponteiro dentro do loop e depois de comparar. Não escrevo assim porque é mais difícil de ler. O código é o mesmo.

 

Teste seus programas

 

Provavelmente vai querer tirar o ENTER do final da string.

 

Entenda que pode usar a própria função que escreveu para apagar o '\n' que fica ao final da string que leu com gets() ou fgets(), já que é garantido que será o último caracter da string. É o que todo mundo faz quando precisa da string sem o ENTER: teste[strlen(teste)-1] = 0; 

 

Deixar o ENTER ao final --- ou mesmo colocar um se não tinha na entrada --- não é um erro de fgets(): é uma comodidade porque é uma garantia e se pode usar puts() e mostrar a string em seguida.

 

Eis um exemplo que testa essas funções:

 

 #include "stdio.h"

int contaLetraMinuscula(char*);
int strlen(char*);
int totalCaracteres(char*);

int main(void)
{
    char teste[50];
    printf( "String: ");
    fgets( teste, 50, stdin );

    teste[strlen(teste)-1] = 0;

    printf( "'%s' tem %d minusculas\n", teste, contaLetraMinuscula(teste));
    printf( "'%s' tem %d letras [usando totalCaracteres()]\n", teste, totalCaracteres(teste));
    printf( "'%s' tem %d letras [usando strlen()]\n", teste, strlen(teste));

    return 0;
};

int contaLetraMinuscula(char* senha)
{
	int n = 0; // contador
    char* p = &senha[0]; // primeira letra da senha
    while( *p != 0)
    {
        if( *p >=  97 && *p <= 122 ) n += 1;
        p += 1; // proxima letra
    }
    return n;
}

int totalCaracteres(char* senha)
{
	int i, total;
	for(i=0; i<50; i++){
		if(senha[i] != '\0'){
			total++;
		}else{
			return total;
		}
	}
	return total;
}

int strlen(char* p)
{
	int n = 0; // contador
    while( *p++ != 0 ) n += 1;
    return n;
}

 

image.png.1b0425edfcf56c46d49178b770b8224b.png

  • Curtir 1
  • Obrigado 1
Postado
2 horas atrás, Brian Nicolas disse:

a professora especificou no enunciado do exercicio para não usarmos strlen(), esse é o unico motivo para eu não estar usando...

 

????

 

Eu apenas escrevi uma função com o mesmo nome... Em duas versões. E te expliquei porque.

 

int strlen(char* p)
{
	int n = 0; // contador
    while( *p++ != 0 ) n += 1;
    return n;
}


Entendeu o que está  errado na função que escreveu?

 

  • Curtir 1

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...