Ir ao conteúdo

Posts recomendados

Postado

Bom dia, eu consegui desenvolver a logica da questão, o problema é que depois de mostrar os valores, eu tenho que apagar o que há no vetor, para não utilizar o resultado anterior  no próximo caso de teste

 

Link da questão

 

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
	int i, j, vetor[12], c = 0, teste, k;
	char nome[100];
	char primeiro[7] = {'a', 'k', 'u', 'G', 'Q'}, segundo[7] = {'b', 'l', 'v', 'I', 'S'};
	char terceiro[7] = {'E', 'O', 'Y', 'c', 'm', 'w'}, quarto[7] = {'F', 'P', 'Z', 'd', 'n', 'x'};
	char quinto[6] = {'J', 'T', 'e', 'o', 'y'}, sexto[7] = {'D', 'N', 'X', 'f', 'p', 'z'};
	char setimo[6] = {'A', 'K', 'U', 'g', 'q'}, oitavo[6] = {'C', 'M', 'W', 'h', 'r'};
	char nono[6] = {'B', 'L', 'V', 'i', 's'}, deimo[5] = {'H', 'R', 'j', 't'};

	scanf("%d", &teste);
	for(k = 0; k < teste; k++)
	{
		setbuf(stdin, NULL);
		gets(nome);
		int tam = strlen(nome);
		for(i = 0; i < tam; i++)
		{
			for(j = 0; j < 7; j++)
			{
				if(nome[i] == primeiro[j])
				{
					vetor[c++] = 0;
				}
			}
			for(j = 0; j < 7; j++)
			{
				if(nome[i] == segundo[j])
				{
					vetor[c++] = 1;
				}
			}
			for(j = 0; j < 7; j++)
			{
				if(nome[i] == terceiro[j])
				{
					vetor[c++] = 2;
				}
			}
			for(j = 0; j < 7; j++)
			{
				if(nome[i] == quarto[j])
				{
					vetor[c++] = 3;
				}
			}
			for(j = 0; j < 6; j++)
			{
				if(nome[i] == quinto[j])
				{
					vetor[c++] = 4;
				}
			}
			for(j = 0; j < 7; j++)
			{
				if(nome[i] == sexto[j])
				{
					vetor[c++] = 5;
				}
			}
			for(j = 0; j < 6; j++)
			{
				if(nome[i] == setimo[j])
				{
					vetor[c++] = 6;
				}
			}
			for(j = 0; j < 6; j++)
			{
				if(nome[i] == oitavo[j])
				{
					vetor[c++] = 7;
				}
			}
			for(j = 0; j < 6; j++)
			{
				if(nome[i] == nono[j])
				{
					vetor[c++] = 8;
				}
			}
			for(j = 0; j < 5; j++)
			{
				if(nome[i] == deimo[j])
				{
					vetor[c++] = 9;
				}
			}
		}
		for(i = 0; i < 12; i++)
		{
			printf("%d", vetor[i]);
		}
		printf("\n");
		for(i = 0; i < 12; i++)
		{
			vetor[i] = 0;
		}/* quando eu faço isso só o primeiro resultado é o certo,
			            os outros resultados são apenas zeros/*

	}
	return 0;
}

 

  • Curtir 1
Postado

pra zerar um vetor/array você pode fazer assim --> 

 

ZeroMemory(vetor, 10); // o vetor a ser zerado e o tamanho dele em bytes

ou 

memset(vetor, 0, 10); // o vetor a ser preenchido, o vetor será preenchido com esse valor (0 no caso)
                      // e o tamanho do vetor em bytes

 

ambos fazem exatamente a mesma coisa, ZeroMemory é implementado com memset..

  • Curtir 1
  • Amei 1
Postado
int main()
{
	int vetor[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

	memset(vetor, 0, sizeof(vetor));

	for ( size_t i = 0; i < sizeof(vetor) / 4; i++ )
	{
		std::cout << vetor[i] << std::endl;
	}

	system("pause");
	return 0;
}

compile isso e verá que o vetor é zerado.. o problema provavelmente é na sua implementação, mostre o source desse seu segundo exemplo, se puder.

 

 

  • Curtir 1
Postado

Bom eu consegui zerar o vetor.

Olha ai imagem ai, só que o vetor não recebe mais valores, só fica mostrando zeros.

ojfsof.png.e180d6d996d690f943de2ea53fda9f2b.png

adicionado 2 minutos depois

Zerei o valor do vetor depois de mostrar na tela, vou colocar a parte do meu código que fiz a alteração

 

for(i = 0; i < 12; i++)
{
	printf("%d", vetor[i]);
}
printf("\n");
memset(vetor, 0, sizeof(vetor));

 

Será que utilizei memset(vetor, 0, sizeof(vetor)); no lugar errado? @Derleyvolt

  • Curtir 1
Postado

o código está correto, primeiro ele mostra o conteúdo do vetor, ou seja, joga o conteúdo na tela e depois zera o valor.. essa seria a sua intenção, não? caso não, eu ainda entendi qual a real dúvida, a dúvida inicial era como zerar o conteúdo de um array/vetor.. poste o código completo com as alterações que você fez, e me diga como você espera/quer que ele funcione. tenho a noite toda, sem pressa.

  • Curtir 1
Postado

Eu comentei o código, do que ele vai fazer.

 

/*Bom o objetivo dessa questão e que cada letra tem um determinado numero*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
	int i, j, vetor[100], c = 0, teste, k;  /*vetor[100] dando do tamanho vetor, c, contador para incrementar
	o valor, quando encontar uma letra que tem na frase dado a letra ele vai atriburi o valor para o vetor*/
	char nome[100];
	char primeiro[7] = {'a', 'k', 'u', 'G', 'Q'}, segundo[7] = {'b', 'l', 'v', 'I', 'S'};
	char terceiro[7] = {'E', 'O', 'Y', 'c', 'm', 'w'}, quarto[7] = {'F', 'P', 'Z', 'd', 'n', 'x'};
	char quinto[6] = {'J', 'T', 'e', 'o', 'y'}, sexto[7] = {'D', 'N', 'X', 'f', 'p', 'z'};
	char setimo[6] = {'A', 'K', 'U', 'g', 'q'}, oitavo[6] = {'C', 'M', 'W', 'h', 'r'};
	char nono[6] = {'B', 'L', 'V', 'i', 's'}, deimo[5] = {'H', 'R', 'j', 't'};

	//preenchendo o vetor com as letrar


	scanf("%d", &teste);
	for(k = 0; k < teste; k++)
	{
		setbuf(stdin, NULL);
		gets(nome);
		int tam = strlen(nome);
		for(i = 0; i < tam; i++)
		{
			for(j = 0; j < 7; j++)
			{
				if(nome[i] == primeiro[j])  /*aqui eu comparo se na frase tem determinada letra, se ela tiver
											vai ser atribuido um valor numerico para o vetor, c++, para incrementar*/
				{
					vetor[c++] = 0;
				}
			}
			for(j = 0; j < 7; j++)
			{
				if(nome[i] == segundo[j])
				{
					vetor[c++] = 1;
				}
			}
			for(j = 0; j < 7; j++)
			{
				if(nome[i] == terceiro[j])
				{
					vetor[c++] = 2;
				}
			}
			for(j = 0; j < 7; j++)
			{
				if(nome[i] == quarto[j])
				{
					vetor[c++] = 3;
				}
			}
			for(j = 0; j < 6; j++)
			{
				if(nome[i] == quinto[j])
				{
					vetor[c++] = 4;
				}
			}
			for(j = 0; j < 7; j++)
			{
				if(nome[i] == sexto[j])
				{
					vetor[c++] = 5;
				}
			}
			for(j = 0; j < 6; j++)
			{
				if(nome[i] == setimo[j])
				{
					vetor[c++] = 6;
				}
			}
			for(j = 0; j < 6; j++)
			{
				if(nome[i] == oitavo[j])
				{
					vetor[c++] = 7;
				}
			}
			for(j = 0; j < 6; j++)
			{
				if(nome[i] == nono[j])
				{
					vetor[c++] = 8;
				}
			}
			for(j = 0; j < 5; j++)
			{
				if(nome[i] == deimo[j])
				{
					vetor[c++] = 9;
				}
			}
		}
		for(i = 0; i < 12; i++)
		{
			printf("%d", vetor[i]);
		}
		printf("\n");  //mostro o vetor
		memset(vetor, 0, sizeof(vetor));
		/*Queria limpar o vetor para que eu pudese realizar os proximos testes*/
		/*Só que depois que o zero o valor do vetor ele não recebe mais nenhum valor*/

	}
	return 0;
}

@Derleyvolt

  • Curtir 1
Postado

Okay.. primeiro, a variável contadora, c, precisa ser zerada..

           

segundo, dependendo do seu compilador, o vetor virá com lixo de memória, você precisa zerar ele, assim ->

 

int vetor[100] = {}; // isso zera o vetor. se tiver usando uma versão mais antiga, provavelmente não vai funcionar

ou 

int vetor[100];

memset(vetor, 0, sizeof(vetor));

 

  • Curtir 1
Postado

@diogo moura Você quer fazer isso?

 

#include <cstdio>
#include <cstdlib>

#define TAMANHO 10

int main()
{
	int vetor[10] = { 1,1,1,1,1,1,1,1,1,1};


    printf("Vetor Inicial: ");
	for ( int i = 0; i < TAMANHO; i++ )
	  printf(" %d", vetor[i]);

	//zera vetor
	for ( int i = 0; i < TAMANHO; i++ )
	  vetor[i] = 0;

	printf("\n\nVetor Zerado: ");
	for ( int i = 0; i < TAMANHO; i++ )
	  printf(" %d", vetor[i]);

	return 0;
}

 

Postado

Sim, depois reutilizar o vetor, o problema agora é que o resultados que a questão está fornecendo eu consigo encontrar, só que o juiz está acusando 10 % de erro, sendo que já testei todos os nomes possiveis, e deram certo@CiroboyBR

  • Curtir 1
Postado

@diogo moura    o código está certo funciona bem,  mas o uri não aceita, pelo jeito é apenas um detalhe mínimo que ainda não percebemos o que é, tentei com esse outro código, mas também deu 10% de erro . esse código aqui :

#include <string.h>
#include <stdio.h>
int main(){
    char s[200];
    int n,i,k,l;
    scanf("%d",&n);
    while(n--){
        fflush(stdin);
        gets(s);
        l=strlen(s);
        for(i=0,k=0; i<l&&k<12; i++){
            if     (s[i]=='G'||s[i]=='Q'||s[i]=='a'||s[i]=='k'||s[i]=='u'           ) printf("0");
            else if(s[i]=='I'||s[i]=='S'||s[i]=='b'||s[i]=='l'||s[i]=='v'           ) printf("1");
            else if(s[i]=='E'||s[i]=='O'||s[i]=='Y'||s[i]=='c'||s[i]=='m'||s[i]=='w') printf("2");
            else if(s[i]=='F'||s[i]=='P'||s[i]=='Z'||s[i]=='d'||s[i]=='n'||s[i]=='x') printf("3");
            else if(s[i]=='J'||s[i]=='T'||s[i]=='e'||s[i]=='o'||s[i]=='y'           ) printf("4");
            else if(s[i]=='D'||s[i]=='N'||s[i]=='X'||s[i]=='f'||s[i]=='p'||s[i]=='z') printf("5");
            else if(s[i]=='A'||s[i]=='K'||s[i]=='U'||s[i]=='g'||s[i]=='q'           ) printf("6");
            else if(s[i]=='C'||s[i]=='M'||s[i]=='W'||s[i]=='h'||s[i]=='r'           ) printf("7");
            else if(s[i]=='B'||s[i]=='L'||s[i]=='V'||s[i]=='i'||s[i]=='s'           ) printf("8");
            else if(s[i]=='H'||s[i]=='R'||s[i]=='j'||s[i]=='t'                      ) printf("9");
            if(s[i]!=' ')
                k++;
        }
        printf("\n");
    }
    return 0;
}

@diogo moura    qual compilador você está usando ?  eu uso o codeblock que é bom , mas ele é todo em inglês, e pela imagem que você postou seu compilador parece ser em português , creio que seria  melhor .

Postado

Bom dia pessoa,

Esse problema de simples scan, porém quando envolve conceitos e principalmente quando distorce-os a coisa fica complicada depois de 5 falhas de 10% finalmente percebi a jogada. :thumbsup:

 

 

Dica: Caracteres em branco não conta!

GG!

Capturar.PNG

  • Curtir 1
Postado

@diogo moura Eu fiz a minha própria MyScanf usando fgetc( stdin ); Porém você pode usar qualquer uma dessas aí.

Quando tiver de conta a quantidade de caracteres capturados, não conte os espaços em braco, nesta conta não vale os caracteres de espaço.

32 minutos atrás, diogo moura disse:

você falou que Caracteres em branco não contam, como eu faria isso

Retire os espaços da string capturada, exemplo:

ENTRE: o rato roeu a roupa de margarida
GRAVE: oratoroeuaroupademargarida 

 

 

 

Spoiler: Código da Solução

 :thumbsup:

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