Ir ao conteúdo
  • Cadastre-se

C++ Pesquisa Sequencial em C++


Visitante
Ir à solução Resolvido por Lucca Rodrigues,

Posts recomendados

Olá a todos, estou tentando entender porque no código abaixo que é feito para realizar uma busca em um vetor numérico, eu obtenho o tamanho do vetor, mas ao percorrer ele no laço, o valor da posição zero que é o 8, não é encontrado. Vejam.

#include<iostream>
using namespace std;

int main(){
	setlocale(LC_ALL,"");
	
	int valor, posicao, vet[] = {8,0,5,1,7,2,4,9,3,6,10};
	
	posicao=0;
	
	cout << "Digite o valor a procurar: ";
	cin >> valor;
	
	for(int a=0; a<sizeof(vet)/sizeof(int); a++){
		
		if(valor == vet[a]){
			posicao = a;
		}
	}
	
	if(posicao != 0){
		cout << "\nEncontrado na posição: " << posicao;
	}else{
		cout << "\nNão encontrado!!!";
	}
	return 0;
}

Não consigo entender o que rola, vejam os resultados e comparem a posição retornada com o vetor do código acima:

image.png.2167502b5341a08750da6f0557e8a925.png

image.png.a3d8d8d3aedd48fab2343bf775678caa.png

 

Agora quando quero encontrar o 8, diz que ele não existe no vetor.

image.png.2b311bd274fe396f30f500bfc9c50116.png

Era para dizer que ele existe na posição 0(zero) do vetor.

 

Alguém tem ideia do que deixei de considerar no código para estar dando esse problema?

 

Um detalhe se eu mando imprimir vet[0], aí o 8 aparece na tela.

Já tentei partir de valor negativo, -1 e nada.

 

Se alguém souber matar essa charada pra mim, agradeço!

Link para o comentário
Compartilhar em outros sites

  • Solução

@fspjonny Olhe aqui:

1 hora atrás, fspjonny disse:

if(posicao != 0){
	cout << "\nEncontrado na posição: " << posicao;
}

Se o número 8 ta na posição 0 do vetor, e você atribui essa posição 0 à variável posicao, embora o número tenha sido encontrado, ela não vai passar nesse teste.

Você pode tentar imprimir logo de cara a posição se valor == vet[a], daí depois de imprimir, poderia atribuir 12 ao índice 'a', e verificar depois que sair do laço se 'a' < 12, pois 'a' é incrementado no laço até atingir valor 11 e só poderia ter valor 12 caso a atribuição fosse feita, ou seja, caso o número seja encontrado.

Não esqueça de incluir a biblioteca locale.h, você está usando funções dela.

 

Teste isso:

#include <iostream>
#include <locale.h>

using namespace std;

int main(){
	setlocale(LC_ALL,"Portuguese");
	
	int valor, a, vet[] = {8,0,5,1,7,2,4,9,3,6,10};
	
	cout << "Digite o valor a procurar: ";
	cin >> valor;
	
	for(a=0; a<sizeof(vet)/sizeof(int); a++){
		
		if(valor == vet[a]){
			cout << "\nEncontrado na posição: " << a;
			a = 12;
          		break;
		}
	}
	
	if(a < 12){
		cout << "\nNão encontrado!!!";
	}
	return 0;
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

9 minutos atrás, Lucca Rodrigues disse:

@fspjonny Olhe aqui:

Se o número 8 ta na posição 0 do vetor, e você atribui essa posição 0 à variável posicao, embora o número tenha sido encontrado, ela não vai passar nesse teste.

Ok, bem sacado, mas porque com um valor negativo não rola de buscar -1, 0, 1, 2, ....

 

Eu cheguei a inicializar a =-1; no for....na minha ideia, seria como ler um negativo e incrementar para o primeiro positivo do range, ou isso não rola?

 

Outra coisa você está atribuindo na mão o valor 12 porque o vetor tem 11, mas e se ele crescer? tipo uns 23 elementos?

o que fiz aqui foi jogar no lugar de 12 o sizeof(vet)/sizeof(int), e lá no outro if a < 12, o mesmo sizeof, mas comparando se a era exatamente igual (if a == sizeof(vet)/sizeof(int)){...}

 

Obrigado pela dica!😄

adicionado 7 minutos depois
43 minutos atrás, Lucca Rodrigues disse:

Não esqueça de incluir a biblioteca locale.h, você está usando funções dela.

 

Se for por causa do setlocale, não precisa, desde que eu deixe como vazio "" a localidade, eu só quero a formatação de caracteres, por isso o compilador entende e pega o UTF-8 com base no sistema e passa a aceitar acentuação, então não preciso carregar uma biblioteca a mais para um só dado UTF-8.

👍

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@fspjonny

1 hora atrás, fspjonny disse:

Ok, bem sacado, mas porque com um valor negativo não rola de buscar -1, 0, 1, 2, ....

A primeira posição de um vetor tem índice zero, não há lógica em buscar por um elemento abaixo da posição inicial.

 

1 hora atrás, fspjonny disse:

Outra coisa você está atribuindo na mão o valor 12 porque o vetor tem 11, mas e se ele crescer? tipo uns 23 elementos?

Daí é só mudar o valor que está sendo atribuído ao índice 'a'...

Note que não faz diferença atribuir qualquer valor, desde que seja >= 12 nesse caso. O valor tem que ser >= 12 pra não passar no teste do if(), que se encontra abaixo do laço no programa que mandei. De qualquer forma, tem um comando break lá pra sair do laço logo depois de atribuído 12 ao índice 'a', mas funcionaria sem ele.

Uma outra possibilidade seria inicializar uma variável com 0, atribuir 1 à ela se o número inserido for encontrado, e verificar se ela tem valor 0 depois do laço, se tiver, o número não foi encontrado.

 

1 hora atrás, fspjonny disse:

o que fiz aqui foi jogar no lugar de 12 o sizeof(vet)/sizeof(int), e lá no outro if a < 12, o mesmo sizeof, mas comparando se a era exatamente igual (if a == sizeof(vet)/sizeof(int)){...}

sizeof(vet)/sizeof(int) = (11*4)/4 = 11, não 12.

Substitua por 11 e tente digitar um valor que não se encontra no vetor pra ver o que acontece... O índice 'a' teria que sair do loop com valor >= 12 caso o número tenha sido encontrado, para não passar no teste seguinte.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

2 horas atrás, fspjonny disse:

Se for por causa do setlocale, não precisa, desde que eu deixe como vazio "" a localidade, eu só quero a formatação de caracteres, por isso o compilador entende e pega o UTF-8 com base no sistema e passa a aceitar acentuação, então não preciso carregar uma biblioteca a mais para um só dado UTF-8

 

Tentei entender essa frase, mas não consegui.

 

2 horas atrás, Lucca Rodrigues disse:

setlocale(LC_ALL,"Portuguese");

 

Se você vai chamar isso precisa do #include de algum modo como @Lucca Rodrigues te disse. Ou coloca explicitamente ou inclui algo que inclua aquilo.

 

Eu sempre escrevo isso (e raramente leio isso) ;) mas vamos lá: essas rotinas set_coisas() sempre tem uma irmã get_coisas(). No caso de setlocale() é a getlocale() e num mundo ético e bem comportado você usa getlocale() antes e salva o valor em uso. Define o que precisa para roda seu programa com setlocale(). E ao final restaura e deixa tudo como estava antes.

 

Entenda que essa mudança de locale permanece depois que seu programa roda, e isso é invasivo e chato. 

 

Em geral programas de console mudam coisas, como cores de texto e fundo, locale, fontes, tamanho do buffer para apagar aquela barra de scroll do lado direito em muitos casos, e outras coisas como a pagina de código em uso na console. E se espera que restaurem tudo ao final, porque o sistema não faz isso.

 

"o compilador entende e pega o UTF-8 com base no sistema e passa a aceitar acentuação" que seria isso? O sistema não faz isso. E mesmo que defina com locale não quer dizer que vai funcionar, porque a fonte em uso na console pode não ter as letras que você quer. . . 

 

adicionado 31 minutos depois

Sobre seu programa

 

  • evite usar 
    	for(a=0; a<sizeof(vet)/sizeof(int); a++)

    Se você sabe que essas coisas não vão mudar dentro do loop não é certo fazer TODA VEZ a mesma conta, que vai dar o mesmo resultado. Esse operador de pós-incremento também é o menos eficiente de todos, já que envolve um valor temporário. Resista também a chamar funções aí como a clássica strlen() a menos que o tamanho da string possa mudar dentro do loop, pela mesma razão: Vai chamar sempre a função para o mesmo resultado...
     

  • Como seu programa só retorna achou/não achou veja esse exemplo
     

    #include<iostream>
    using namespace std;
    
    int main() {
    	int valor = 0;
    	int vet[]{ 8,0,5,1,7,2,4,9,3,6,10 };
    
    	int N = sizeof(vet) / sizeof(int);
    	cout << "Digite o valor a procurar: ";
    	cin >> valor;
    
    	for (int a = 0; a < N; a += 1)
    		if (vet[a] == valor)
    		{
    			cout << "Elemento " << valor <<
    				" encontrado na posição " << a
    				<< endl;
    			return a;
    		};
    
    	cout << "Elemento " << valor <<
    		" nao encontrado" << endl;
    	return -1;
    };

    Que talvez seja mais compacto, eficiente e fácil de ler

adicionado 32 minutos depois

Em C++ o uso de = na inicialização não é recomendado. Existe apenas por compatibilidade para facilitar a migração de programas em C

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

5 horas atrás, fspjonny disse:

Não consigo entender o que rola, vejam os resultados e comparem a posição retornada com o vetor do código acima

 Uma coisa que "rola" é você tem que iniciar posição com um valor que não possa corresponder a um índice válido. Como os índices começam em 0 e posicao também, quando o cara digitar 8 deveria retornar 0 porque achou na posição 0, mas seu programa vai achar que não tem o valor. Porque? Porque ao sair do loop posicao vai ser 0. Use o tamanho do vetor + 1, ou um valor negativo para iniciar posicao.

 

E entenda que seu programa lê sempre o vetor todinho, fazendo aquela divisão toda vez, para ter o mesmo resultado. E mesmo que o valor tenha sido encontrado já na primeira iteração. Qual o propósito de continuar procurando por algo que já achou?

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

20 minutos atrás, arfneto disse:

 Uma coisa que "rola" é você tem que iniciar posição com um valor que não possa corresponder a um índice válido. Como os índices começam em 0 e posicao também, quando o cara digitar 8 deveria retornar 0 porque achou na posição 0, mas seu programa vai achar que não tem o valor. Porque? Porque ao sair do loop posicao vai ser 0. Use o tamanho do vetor + 1, ou um valor negativo para iniciar posicao.

 

E entenda que seu programa lê sempre o vetor todinho, fazendo aquela divisão toda vez, para ter o mesmo resultado. E mesmo que o valor tenha sido encontrado já na primeira iteração. Qual o propósito de continuar procurando por algo que já achou?

 

 

OK, mas eu citei que fiz isso acima, até uma variável de nome posição com valor 1 atribui, não deu certo, mas com o código acima e as dicas do colega, funcionou, depois de feito uns ajustes.

 

Link para o comentário
Compartilhar em outros sites

2 minutos atrás, fspjonny disse:

OK, mas eu citei que fiz isso acima, até uma variável de nome posição com valor 1 atribui, não deu certo, mas com o código acima e as dicas do colega, funcionou, depois de feito uns ajustes

 

Entendo. Se mostrar o que fez provavelmente posso te dizer porque não funcionou, mas sem ver tal código não sei :) 

 

Bom que funcionou afinal. Considere as coisas que eu escrevi para incluir nos seus próximos programas. E as outras respostas também.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, arfneto disse:

 

Tentei entender essa frase, mas não consegui.

Se você vai chamar isso precisa do #include de algum modo como @Lucca Rodrigues te disse. Ou coloca 

Podes olhar no meu código que iniciou a postagem e não o locale.h no include

E as acentuações funcionam perfeitamente, de acordo com a forma que expliquei, o porquê de funcionar?, não sei, sei que funciona assim também, mas não é para toda biblioteca que isso rola não 99% delas tem que ser chamadas no include, mas algumas que ficam no 1%, não precisam....os porquês não sei lhe dizer, nunca estudei C++ a fundo, só vi na faculdade e olhe lá....

 

1 hora atrás, arfneto disse:

Eu sempre escrevo isso (e raramente leio isso) ;) mas vamos lá: essas rotinas set_coisas() sempre tem uma irmã get_coisas(). No caso de setlocale() é a getlocale() e num mundo ético e bem comportado você usa getlocale() antes e salva o valor em uso. Define o que precisa para roda seu programa com setlocale(). E ao final restaura e deixa tudo como estava antes.

Normal de toda classe, ter seu setters e getters

 

1 hora atrás, arfneto disse:

Entenda que essa mudança de locale permanece depois que seu programa roda, e isso é invasivo e chato. 

Não entendi como assim invasivo e chato?....é apenas a codificação UTF-8 para formatar meus caracteres....é bom entender isso, mas por hora tô confuso dessa afirmação. Me explica depois.

 

1 hora atrás, arfneto disse:
  • evite usar 
    
    	for(a=0; a<sizeof(vet)/sizeof(int); a++)

    Se você sabe que essas coisas não vão mudar dentro do loop não é certo fazer TODA VEZ a mesma conta, que vai dar o mesmo resultado.

  •  

Eu pesquisei, essa dai dá sempre a conta certa, ela te retorna o tamanho do vetor, embora isso ai só preste em vetor estático, em vetor dinâmico acho que muda...

adicionado 2 minutos depois
3 minutos atrás, arfneto disse:

 

Entendo. Se mostrar o que fez provavelmente posso te dizer porque não funcionou, mas sem ver tal código não sei :) 

difícil, fou uma série de refatorações de código, mas tá funcionando conforme é destinado a fazer.

 

3 minutos atrás, arfneto disse:

Bom que funcionou afinal. Considere as coisas que eu escrevi para incluir nos seus próximos programas. E as outras respostas também.

Sim, sempre considero, o bom é que venho aqui depois e olho o que foi dito e vou atrás de entender, claro que uma ajudinha(spoiler), nesses casos é bem vindo por ser mais rápido...kkkk

Link para o comentário
Compartilhar em outros sites

3 minutos atrás, fspjonny disse:

E as acentuações funcionam perfeitamente

 

Não, não funcionam perfeitamente. Vai sempre depender das coisas que te expliquei. São várias possibilidades de dar errado e a maneira de controlar é a que te expliquei. Não vou repetir aquilo, mas por exemplo se a fonte em uso não tem as letras que quer não vai mostrar. De jeito nenhum. Então você tem que ver qual é. Ou deixar pra lá e correr o risco.

 

5 minutos atrás, fspjonny disse:

Normal de toda classe, ter seu setters e getters

 

Não são classes. São funções como as documentadas em https://docs.microsoft.com/en-us/windows/console/console-functions acessíveis em várias linguagens.

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

2 horas atrás, Lucca Rodrigues disse:

@fspjonny

 

De qualquer forma, tem um comando break lá pra sair do laço logo depois de atribuído 12 ao índice 'a', mas funcionaria sem ele.

Dificilmente uso breaks no programa, você sai deles sem limpar a memória com return 0 indicando que o programa não precisa mais alocar memória para nada, assim me foi explicado.

 

adicionado 8 minutos depois
1 minuto atrás, arfneto disse:

 

Não, não funcionam perfeitamente. Vai sempre depender das coisas que te expliquei. São várias possibilidades de dar errado e a maneira de controlar é a que te expliquei. Não vou repetir aquilo, mas por exemplo se a fonte em uso não tem as letras que quer não vai mostrar. De jeito nenhum. Então você tem que ver qual é. Ou deixar pra lá e correr o risco.

Até onde sei o windows trabalha com a fonte Lucida console por padrão, então todo e qualquer programa que roda no console do windows usa essa por default, tem até como mudar e ai neste caso acho que faz sentido usar o locale.h para dar um suporte no caso dessa troca.

Foi como expliquei ao compilar o compilador do C++ pega a fonte local e assum ela de boa.

 

Queria eu ter um conhecimento mais profundo de C++ para te dizer porque está funcionando no meu código sem precisar fazer o include, mas sobre isso não tenho bagagem, eu já ví algumas pessoas fazerem e nunca deu problema, sei até que pode haver, mas mantendo os dados default, acho que não tem problema....mas você está certo, o correto seria amarrar estas pontas que ficam soltas.

 

1 minuto atrás, arfneto disse:

 

 

Não são classes. São funções como as documentadas em https://docs.microsoft.com/en-us/windows/console/console-functions acessíveis em várias linguagens.

 

 

Isso, usei o termo errado, em orientação a objeto nem função se chama método, então geter e seter, passam a integrar métodos de classes.

Link para o comentário
Compartilhar em outros sites

11 minutos atrás, fspjonny disse:

Não entendi como assim invasivo e chato?....é apenas a codificação UTF-8 para formatar meus caracteres....é bom entender isso, mas por hora tô confuso dessa afirmação. Me explica depois

 

Provavelmente você está vendo seu programa de computador como algo seu em seu computador para seu uso exclusivo. E em geral programas de computador tem uma vida diferente dessa: eles começam a ser usados quando ficam prontos e são pagos ou licenciados ou algo assim. E vão rodar em outros computadores e é invasivo e chato e pode custar dinheiro se você alterar uma configuração no terminal de alguém e não restaurar ao final de seu programa para que fique tudo exatamente como estava antes. Pode custar seu emprego ou seu contrato, no mínimo.

 

15 minutos atrás, fspjonny disse:

Eu pesquisei, essa dai dá sempre a conta certa, ela te retorna o tamanho do vetor, embora isso ai só preste em vetor estático, em vetor dinâmico acho que muda

 

Eu sei o que o operador sizeof() retorna. Não sei o que precisou pesquisar, mas eis o que tentei te dizer: TODA VEZ que seu programa entrar naquele loop ele vai testar a condição de saída do for. E é uma divisão: de um valor constante por um valor constante. O tamanho do int só vai mudar se você compilar com outro modelo. O tamanho do vetor só vai mudar se você alterar o código. E a divisão entre eles vai dar sempre o mesmo número: 11 no seu caso. A vida toda.

 

Não sou eu que vou corrigir seu código ou te dar uma nota. Apenas entenda que é bobagem. Não precisa pesquisar.

 

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Bom no final de tudo o código ficou assim e funcionando....kkkk

#include<iostream>
using namespace std;

int main(){
	setlocale(LC_ALL,"");
	
	int a, valor, posicao, vet[] = {8,0,5,1,7,2,4,9,3,6,10,16,21,25,29};
	
	posicao=0;
	
	cout << "Digite o valor a procurar: ";
	cin >> valor;
	
	for(a=0; a<sizeof(vet)/sizeof(int); a++){
		
		if(valor == vet[a]){
			
			cout << "\nEncontrado na posição: " << a;
			a = sizeof(vet)/sizeof(int);
		}
	}
	
	if(a == sizeof(vet)/sizeof(int)){
		cout << "\nNão encontrado!!!";
	}
	return 0;
}

image.png.97cd46b67395040deadabd8385e73f06.png

o 8 finalmente aparece

image.png.25685327ec1d221f6b28f040d6d80abf.png

aumentei na mão o valor dos vetores que de 11 valores subiu para 15 e automaticamente o esquema do sizeof() faz as contas certas e devolve a quantidade de valores dentro do vetor.

 

adicionado 8 minutos depois
3 minutos atrás, arfneto disse:

 

Provavelmente você está vendo seu programa de computador como algo seu em seu computador para seu uso exclusivo. E em geral programas de computador tem uma vida diferente dessa: eles começam a ser usados quando ficam prontos e são pagos ou licenciados ou algo assim. E vão rodar em outros computadores e é invasivo e chato e pode custar dinheiro se você alterar uma configuração no terminal de alguém e não restaurar ao final de seu programa para que fique tudo exatamente como estava antes. Pode custar seu emprego ou seu contrato, no mínimo.

Mas eu não precisei mudar nada no windows, é a compilação padrão, teclo F11, ele me gera o executável e roda, e tá rodando em qualquer PC windows.

 

3 minutos atrás, arfneto disse:

 

Eu sei o que o operador sizeof() retorna. Não sei o que precisou pesquisar, mas eis o que tentei te dizer: TODA VEZ que seu programa entrar naquele loop ele vai testar a condição de saída do for. E é uma divisão: de um valor constante por um valor constante. O tamanho do int só vai mudar se você compilar com outro modelo. O tamanho do vetor só vai mudar se você alterar o código. E a divisão entre eles vai dar sempre o mesmo número: 11 no seu caso. A vida toda.

 

Não sou eu que vou corrigir seu código ou te dar uma nota. Apenas entenda que é bobagem. Não precisa pesquisar.

 

Então eu reduzi meu vetor agora para 5 digitos e continua a operar

image.png.1bf7f74a8c563adc64fa8397698ec194.png

 

Vetor com 5 digitos e mesmo código

image.png.41a24935b9eb147d69b3af12233195ae.png

aumentei o vetor e tudo ok ainda

image.png.77d1dd8083241ce8af972909a5e6240e.png

 

Queria entender o ponto que você quer chegar, onde vai dar erro?

adicionado 16 minutos depois

image.thumb.png.5991c2494322550a325691ecb87b7e7b.png

 

image.png.af27045dbf7d6359d69e57fc3a26030b.png

  • Triste 1
Link para o comentário
Compartilhar em outros sites

16 minutos atrás, fspjonny disse:

Até onde sei o windows trabalha com a fonte Lucida console por padrão, então todo e qualquer programa que roda no console do windows usa essa por default

 

Não. Um programa de console do Windows que não altere a fonte em uso vai usar a fonte que está em uso. Só isso. Não faz diferença qual o padrão. E o padrão do IDE pode não ser o da console. E nem todo programa vai rodar na console, pode rodar no terminal do Windows, que é um ambiente bem diferente. E é o ambiente recomendado pelo fabricante desde 2018 para rodar programas de console. E a fonte padrão nesse caso é Cascadia Code.

 

Você não pode simplesmente assumir que a fonte em uso seja a que você acha que vai ser o padrão. 

 

22 minutos atrás, fspjonny disse:

Isso, usei o termo errado, em orientação a objeto nem função se chama método, então geter e seter, passam a integrar métodos de classes

 

Isso nada tem a ver com orientação a objetos. São funções e essa é a nomenclatura. São parte da Windows API e a documentação está no link que te mostrei.

for(a=0; a<sizeof(vet)/sizeof(int); a++){
		
		if(valor == vet[a]){
			
			cout << "\nEncontrado na posição: " << a;
			a = sizeof(vet)/sizeof(int);
		}
	}

break é o comando para fazer isso. E nem é necessário: se leu o exemplo que te mostrei sabe que pode mostrar a posição e retornar simplesmente. 

 

28 minutos atrás, fspjonny disse:

Dificilmente uso breaks no programa, você sai deles sem limpar a memória com return 0 indicando que o programa não precisa mais alocar memória para nada, assim me foi explicado

 

Pois é: te foi explicado mas não faz sentido. Não é assim e nada tem a ver uma coisa com a outra. Você tem um livro? Seu curso adota um livro? 

 

E de todo modo se quer usar uma coisa assim não é espero fazer uma divisão em cima de dois valores constantes DE NOVO. Apenas use um valor grande, como INT_MAX, ou 0x80FFffFF que dá na mesma.

 

17 minutos atrás, fspjonny disse:

aumentei na mão o valor dos vetores que de 11 valores subiu para 15 e automaticamente o esquema do sizeof() faz as contas certas e devolve a quantidade de valores dentro do vetor

 

Sim, os computadores são assim: sizeof() do vetor vai retornar sempre 60 nesse caso. sizeof(int)  vai retornar sempre 4 assumindo um int de 32 bits.

 

E seu programa continua, a cada iteração do for, dividindo 60 por 4 para dar 15. Sério? Não entendeu que o problema é você dividir em toda vez no loop uma constante por outra para testar o valor que vai ser SEMPRE o mesmo? Não precisa pesquisar isso.

 

Link para o comentário
Compartilhar em outros sites

Bom dia!

Não mexi uma vírgula para manipular o sistema, foi compilado com o padrão do windows.

image.png.552a781e981cd41b91abaa9e5c92fc23.png

 

E não estou com isso afirmad que o que você me disse está errado, só estou mstrando que funciona de qualquer forma, tendo em vista que é só acentuação, vou descomentar a linha do mesmo código.

image.png.6ddcbabe8302ada546fdcc908ec85fe1.png

Se não deveria funcionar porque está funcionando?

 

Eu fiquei na dúvida sobre o que você me explicou e eu trouxe só executável desse teste e rodei em outros dois PC's o resultado foi o mesmo que você vê aqui no post, sai tudo acentuado corretamente.

 

Uma coisa que não tenho como testar, mas acho que aí sim vai dar m...seria tentar fazer isso em outras plataformas como Mac e Linux, pois eu não sei como eles lidam com o carregamento ou não dessa biblioteca.

 

Não quis ser rude ou tentar por abaixo conhecimento de ninguém, só são dúvidas minhas mesmo de quem tá precisando tapar buracos com C++ de sistema legado, mas como veja que a conversa tá ganhando animosidade conforme os comentários evoluem, eu quero deixar bem claro que não quero discutir ou ser ofencivo com os colegas e muito menos receber tal tratamento.

 

Está tudo resolvido, tá funcionando! e em pouco tempo não vou precisar mais mexer com C++, vou voltar a fazer o que fazia antes que é da minha área de conhecimento.

 

Obrigado @Lucca Rodrigues e @arfneto 😁👍

Link para o comentário
Compartilhar em outros sites

1 hora atrás, fspjonny disse:

E não estou com isso afirmad que o que você me disse está errado, só estou mstrando que funciona de qualquer forma, tendo em vista que é só acentuação, vou descomentar a linha do mesmo código

 

Você ainda não entendeu. Não adianta insistir com isso.

Você está mostrando o resultado de um programa no seu computador. Não acrescenta nada. 

Eu estou insistindo nessa explicação porque é a realidade de muita gente. Quando se está aprendendo se tem essa noção de que o programa ficou pronto, você entrega e ele é esquecido. Mas a realidade como te expliquei é o contrário disso.

 

1 hora atrás, fspjonny disse:

Se não deveria funcionar porque está funcionando?

 

 

Você apenas não entendeu ainda o que eu expliquei. 

 

1 hora atrás, fspjonny disse:

Eu fiquei na dúvida sobre o que você me explicou e eu trouxe só executável desse teste e rodei em outros dois PC's o resultado foi o mesmo que você vê aqui no post, sai tudo acentuado corretamente

 

2 horas atrás, fspjonny disse:

só estou mstrando que funciona de qualquer forma, tendo em vista que é só acentuação, vou descomentar a linha do mesmo código


De nada adianta. Usando o seu programa de pesquisa no vetor no meu computador, um micro absolutamente comum:
 

image.png.b3309dc576a0ecea9a06710588682ed7.png

 

Note que escreve página e código certo mas na saída do programa o 'ã' e o 'ç' de posição são trocados por outra coisa.

 

Essa é a realidade. Se você não programar e garantir essas coisas não sabe o que vai sair. Essas coisas são a página de saída da console e a fonte em uso na console no mínimo. Rodou seu programa no terminal do Windows? Ele usa outra fonte, como já te expliquei.

 

2 horas atrás, fspjonny disse:

Uma coisa que não tenho como testar, mas acho que aí sim vai dar m...seria tentar fazer isso em outras plataformas como Mac e Linux, pois eu não sei como eles lidam com o carregamento ou não dessa biblioteca

 

Se se refere ao locale() é igualzinho no Linux e no MacOS. Mas não é suficiente para garantir a acentuação: Ainda é preciso saber a fonte em uso. No entanto todo o resto é diferente e não existem as mesmas funções. O Linux, que é Unix e o MacOS que é derivado do Linux que é Unix, como o Android que era Linux, não tem o conceito de console. Não existe nada disso. A tal "console" é um terminal, com interface derivada dos VT-100 da Digital dos anos 70/80. E a programação é totalmente distinta. No entanto vem convergindo fortemente nos últimos anos e você já pode usar no Windows há anos.

 

image.png.5943ab039c125e5f9a5ca956257167ed.png

 

Na verdade o modelo Linux é o recomendado de programação para a console no Windows desde 2018. Ainda não tem traduzido no site mas pode ler em https://devblogs.microsoft.com/commandline/new-experimental-console-features/

 

image.png.ef8583ddc879f7fcab30417de5889a47.png

 

 

O título já mostra a realidade de hoje: "olhando para trás e seguindo adiante". Isso porque o modelo do Linux é dos anos '80 e o da console dos anos '90. Com os computadores migrando aos milhões para a nuvem, votando ao modelo em uso nos 70/80 com os mainframes, muitas máquinas não tem interface gráfica mais. Por isso a console ficou assim importante.

Se você cria um computador na Amazon, na Azure ou no Google Cloud ou qualquer outro pode ter uma máquina Windows ou Linux. E ela não vai ter interface gráfica. Se você abrir uma conta para desenvolver no Cloud9 para rodar seus programas não vai ter também.  Daí vem o interesse em programar para a console usando um mesmo paradigma.

 

De volta à console do Windows


Se não fizer o normal não há como garantir que vá rodar no próximo computador. Rodou no Terminal do Windows, cuja fonte é outra? Rodou em algum que tenha a página 437 em uso na console? Aquela que tem aquelas linhas e blocos e que é muito comum desde os '90? Se você pegar um programa comum desses de console que ao rodar não define e restaura as coisas ao final como eu te expliquei vai descobrir que no lugar dos acentos saem outras coisas. 

 

Eu não estou dando a minha opinião. Apenas expliquei a realidade de escrever essas coisas. Rodou em um computador de teste gerado com uma versão normal de Windows em outro idioma? Tipo o inglês por exemplo? 

 

Sem saber a página de código da console e a fonte não dá pra saber se vai ter os acentos. Assim é.

 

2 horas atrás, fspjonny disse:

Não quis ser rude ou tentar por abaixo conhecimento de ninguém, só são dúvidas minhas mesmo de quem tá precisando tapar buracos com C++ de sistema legado, mas como veja que a conversa tá ganhando animosidade conforme os comentários evoluem, eu quero deixar bem claro que não quero discutir ou ser ofencivo com os colegas e muito menos receber tal tratamento

 

["ofensivo"]

Claro.

Espero também que não leve a mal nada do que escrevi.  Apenas entenda que o modelo de programação é esse que te expliquei, e procure incorporar essas coisas que te expliquei, em especial sobre

  • evitar cálculos sobre constantes em iterações como um loop for, A/B sempre vai dar o mesmo resultado em um computador. e
  • permanecer num loop por todos os valores possíveis mesmo depois de ter identificado na primeira iteração a condição de saída desejada
  • e esqueça aquela coisa do break dentro do loop. break e continue estão presentes em praticamente todos os loops em várias linguagens, como Pascal, C, C++, java, javascript, C#, Visual Basic e a lista segue.

 

 

 

 

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

 

Pra te ajudar a entender a diferença já que esqueci a tela aberta
 

image.png.c170c074fbb5f61ba9bcfe18ba0ef416.png

 

Entenda que para o mesmo programa as letras mudam. Espero que tenha entendido. Na página 437 as letras são grepas, Tau e Pi. Na 850 são outros símbolos. Na 1252 outros, os que você espera. E nem mudei para a 65001, padrão do Terminal com a fonte Cascadia Code ...

 

E nem mudei a fonte...

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

Como se tornar um desenvolvedor full-stack

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!