Eu t� aqui com uma d�vida cruel. O objetivo do c�digo abaixo �
simplesmente receber strings, linha a linha, e numer�-las antes. At� a�
tudo bem, funciona perfeitamente. Mas eu queria que o programa, quando
encontrasse um cifr�o ($), terminasse a execu��o simplesmente, o que n�o
est� acontecendo de jeito nenhum. Algu�m poderia me dar uma m�o?
Grande abra�o a todos!
#include <stdio.h>
#include <stdlib.h>
int main()
{
int count;
char str[100];
int a;
printf("Editor de texto - teste\n\n");
for(count=1; count<=100; count++) {
if (count<10) printf("0");
printf("%d ", count);
gets(str);
for (a=1; a<=100; a++){
if (str[a]=="\36") break;
}
}
return 0;
}
Olá, amigos dos forums e listas!
Eu tô aqui com uma dúvida cruel. O objetivo do código abaixo é simplesmente receber strings, linha a linha, e numerá-las antes. Até aí tudo bem, funciona perfeitamente. Mas eu queria que o programa, quando encontrasse um cifrão ($), terminasse a execução simplesmente, o que não está acontecendo de jeito nenhum. Alguém poderia me dar uma mão?
Grande abraço a todos!
#include <stdio.h>
#include <stdlib.h>
int main()
{
int count;
char str[100];
int a;
printf("Editor de texto - teste\n\n");
for(count=1; count<=100; count++) {
if (count<10) printf("0");
printf("%d ", count);
gets(str);
for (a=1; a<=100; a++){
if (str[a]=="\36") break;
}
}
return 0;
}
--
Antes de enviar um e-mail para o grupo leia: http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~---------------------------------~----------~--~----~
[&] Colabore com a Pesquisa de Preferência de Conteúdo para Eventos do Grupo C & C++ Brasil:
http://www.surveymonkey.com/s/GBBGTXN
------~----~-------~---~---~---~---~----------------~------------~---------~
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
Emprego & carreira: vag...@ccppbrasil.org
http://groups.google.com/group/dev-guys?hl=en
Em 29/8/2010 15:38, Fabiano Vasconcelos escreveu:
>
> #include <stdio.h>
> #include <stdlib.h>
>
> int main()
> {
> int count;
> char str[100];
> int a;
>
> printf("Editor de texto - teste\n\n");
> for(count=1; count<=100; count++) {
> if (count<10) printf("0");
> printf("%d ", count);
Sugest�o (n�o � erro): voc� pode substituir estas duas linhas por:
printf("%02d",count);
> gets(str);
>
> for (a=1; a<=100; a++){
Aqui tem um erro:
Em C os vetores tem o �ndice iniciado em zero, ent�o o correto �:
for (a=0; a<100; a++){
Outro problema � que voc� continua percorrendo a linha ap�s o fim dela,
onde h� um monte de lixo (caracteres aleat�rios). Se por acaso houver um
caractere '$' no meio deste lixo seu c�digo n�o vai funcionar. Solu��o:
for (a=0; a<100 && str[a] != '\0'; a++){
> if (str[a]=="\36") break;
Dois erros:
1 - Voc� colocou aspas duplas no lugar de aspas simples;
2 - O sequ�ncia '\36' � em octal (base 8) ent�o voc� na verdade est�
procurando o caracter 30 que nunca vai encontrar, o n�mero 36(base 10)
em octal � 44(base 8)
Corre��o:
if (str[a]=='\44') break;
Mas ficaria mais simples assim:
if (str[a]=='$') break;
> }
Outro erro:
O comando 'break' sai do primeiro la�o, mas n�o do segundo. Duas solu��es:
for (a=0; a<100 && str[a] != '\0'; a++){
if (str[a]=='\44')
break;
}
if (a<100 && str[a] != '\0')
break;
}
Ou
for (a=0; a<100 && str[a] != '\0'; a++){
if (str[a]=='\44')
goto fimdolaco;
}
}
fimdolaco:
>
> }
>
> return 0;
> }
>
>
C�digo sugerido completo:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int count;
char str[100];
int a;
printf("Editor de texto - teste\n\n");
for(count=1; count<=100; count++)
{
printf("%02d ", count);
gets(str);
for (a=0; a<100 && str[a] != '\0'; a++){
if (str[a]=='$')
goto fimdolaco;
}
}
fimdolaco:
return 0;
}
Seu código está errado por diversos motivos, vou tentar lista-los para você:
Em 29/8/2010 15:38, Fabiano Vasconcelos escreveu:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int count;
char str[100];
int a;
printf("Editor de texto - teste\n\n");
for(count=1; count<=100; count++) {
if (count<10) printf("0");
printf("%d ", count);
Sugestão (não é erro): você pode substituir estas duas linhas por:
printf("%02d",count);Aqui tem um erro:
gets(str);
for (a=1; a<=100; a++){
Em C os vetores tem o índice iniciado em zero, então o correto é:
for (a=0; a<100; a++){
Outro problema é que você continua percorrendo a linha após o fim dela, onde há um monte de lixo (caracteres aleatórios). Se por acaso houver um caractere '$' no meio deste lixo seu código não vai funcionar. Solução:
for (a=0; a<100 && str[a] != '\0'; a++){Dois erros:
if (str[a]=="\36") break;
1 - Você colocou aspas duplas no lugar de aspas simples;
2 - O sequência '\36' é em octal (base 8) então você na verdade está procurando o caracter 30 que nunca vai encontrar, o número 36(base 10) em octal é 44(base 8)
Correção:
if (str[a]=='\44') break;
Mas ficaria mais simples assim:
if (str[a]=='$') break;
}
Outro erro:
O comando 'break' sai do primeiro laço, mas não do segundo. Duas soluções:
for (a=0; a<100 && str[a] != '\0'; a++){
if (str[a]=='\44')
break;
}
if (a<100 && str[a] != '\0')
break;
}
Ou
for (a=0; a<100 && str[a] != '\0'; a++){
if (str[a]=='\44')
goto fimdolaco;
}
}
fimdolaco:
}
return 0;
}
Código sugerido completo:
printf("%02d ", count);
#include <stdio.h>
#include <stdlib.h>
int main()
{
int count;
char str[100];
int a;
printf("Editor de texto - teste\n\n");
for(count=1; count<=100; count++)
{
gets(str);
for (a=0; a<100 && str[a] != '\0'; a++){
if (str[a]=='$')
goto fimdolaco;
}
}
fimdolaco:
return 0;
}
Mas de qualquer forma ele j� tinha quebrado a cabe�a mesmo :-)
Em 29/8/2010 16:26, Eric Chiesse escreveu:
> M�rcio, s� um coment�rio. Por favor n�o entenda como reclama�ao, n�o
> quero come�ar uma flame.
>
> Pod�amos ter dado ao Fabiano a chance de achar a solu��o final sem dar o
> c�digo pronto.
>
> � s� uma lembran�a pra ajudar o pessoal que t� come�ando.
>
> Mas enfim, cada um com sua abordagem. Sem stress.
>
> Abra�o.
>
> Eric.
>
Pois é, minha falha foi ter listado o código completo no final...
Mas de qualquer forma ele já tinha quebrado a cabeça mesmo :-)
Em 29/8/2010 16:26, Eric Chiesse escreveu:
Márcio, só um comentário. Por favor não entenda como reclamaçao, não
quero começar uma flame.
Podíamos ter dado ao Fabiano a chance de achar a solução final sem dar o
código pronto.
É só uma lembrança pra ajudar o pessoal que tá começando.
Mas enfim, cada um com sua abordagem. Sem stress.
Abraço.
Eric.
meu nome � Fabiano Quebra-cabe�as! :D
Podem ter certeza de que se eu postei aqui � porque eu n�o achei a
solu��o nem em google, nem em Herbert Schildt, nem em nada! Aqui � meu
�ltimo recurso.
Bem, daqui a pouco, quando eu fizer o c�digo funcionar, eu volto pra
comentar mais. T� recebendo o bicho agora.
De cara eu vi algo aqui um pouco estranho, se � que o amigo M�rcio me
permite comentar: � que muitos programadores, inclusive eu (se � que
posso ser rotulado como programador) foram instru�dos com o princ�pio de
NUNCA usar o goto, por ser considerado um mau estilo de programa��o.
Ainda n�o analisei o c�digo pra ver como posso subistitu�-lo, mas sei
que ele n�o � necess�rio. N�o querendo desfazer do seu precios�ssimo
favor, pelo amor de Deus nem sonhe com isso, mas � que a palavra-chave
goto realmente � abominada no meio acad�mico.
Voc� poderia pensar em uma outra solu��o que n�o use goto? Eu vou pensar
aqui e te digo. N�o poste ainda!!! Vou pensar primeiro!!!
Grande abra�o!
Cuidado com dogmas: goto é perigoso, mas tem seus usos (este caso não
é um deles, na minha opinião).
On Sunday, August 29, 2010, Fabiano Vasconcelos <fvasco...@gmail.com> wrote:
> Bem, pessoal, deixa eu me apresentar:
>
> meu nome é Fabiano Quebra-cabeças! :D
> Podem ter certeza de que se eu postei aqui é porque eu não achei a solução nem em google, nem em Herbert Schildt, nem em nada! Aqui é meu último recurso.
>
> Bem, daqui a pouco, quando eu fizer o código funcionar, eu volto pra comentar mais. Tô recebendo o bicho agora.
> De cara eu vi algo aqui um pouco estranho, se é que o amigo Márcio me permite comentar: é que muitos programadores, inclusive eu (se é que posso ser rotulado como programador) foram instruídos com o princípio de NUNCA usar o goto, por ser considerado um mau estilo de programação. Ainda não analisei o código pra ver como posso subistituí-lo, mas sei que ele não é necessário. Não querendo desfazer do seu preciosíssimo favor, pelo amor de Deus nem sonhe com isso, mas é que a palavra-chave goto realmente é abominada no meio acadêmico.
> Você poderia pensar em uma outra solução que não use goto? Eu vou pensar aqui e te digo. Não poste ainda!!! Vou pensar primeiro!!!
>
> Grande abraço!
>
> On 29-08-2010 16:32, Marcio Gil wrote:
>
> Pois é, minha falha foi ter listado o código completo no final...
>
> Mas de qualquer forma ele já tinha quebrado a cabeça mesmo :-)
>
> Em 29/8/2010 16:26, Eric Chiesse escreveu:
>
> Márcio, só um comentário. Por favor não entenda como reclamaçao, não
> quero começar uma flame.
>
> Podíamos ter dado ao Fabiano a chance de achar a solução final sem dar o
> código pronto.
>
> É só uma lembrança pra ajudar o pessoal que tá começando.
>
> Mas enfim, cada um com sua abordagem. Sem stress.
>
> Abraço.
>
> Eric.
Bem, pessoal, deixa eu me apresentar:
meu nome é Fabiano Quebra-cabeças! :D
Podem ter certeza de que se eu postei aqui é porque eu não achei a solução nem em google, nem em Herbert Schildt, nem em nada! Aqui é meu último recurso.
Bem, daqui a pouco, quando eu fizer o código funcionar, eu volto pra comentar mais. Tô recebendo o bicho agora.
De cara eu vi algo aqui um pouco estranho, se é que o amigo Márcio me permite comentar: é que muitos programadores, inclusive eu (se é que posso ser rotulado como programador) foram instruídos com o princípio de NUNCA usar o goto, por ser considerado um mau estilo de programação. Ainda não analisei o código pra ver como posso subistituí-lo, mas sei que ele não é necessário. Não querendo desfazer do seu preciosíssimo favor, pelo amor de Deus nem sonhe com isso, mas é que a palavra-chave goto realmente é abominada no meio acadêmico.
Você poderia pensar em uma outra solução que não use goto? Eu vou pensar aqui e te digo. Não poste ainda!!! Vou pensar primeiro!!!
Grande abraço!
On 29-08-2010 16:32, Marcio Gil wrote:
Pois é, minha falha foi ter listado o código completo no final...
Mas de qualquer forma ele já tinha quebrado a cabeça mesmo :-)
Em 29/8/2010 16:26, Eric Chiesse escreveu:
Márcio, só um comentário. Por favor não entenda como reclamaçao, não
quero começar uma flame.
Podíamos ter dado ao Fabiano a chance de achar a solução final sem dar o
código pronto.
É só uma lembrança pra ajudar o pessoal que tá começando.
Mas enfim, cada um com sua abordagem. Sem stress.
Abraço.
Eric.
--
Antes de enviar um e-mail para o grupo leia: http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~---------------------------------~----------~--~----~
[&] Colabore com a Pesquisa de Preferência de Conteúdo para Eventos do Grupo C & C++ Brasil:
http://www.surveymonkey.com/s/GBBGTXN
------~----~-------~---~---~---~---~----------------~------------~---------~
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
Emprego & carreira: vag...@ccppbrasil.org
http://groups.google.com/group/dev-guys?hl=en
Caro Fabiano, acho que voc� n�o reparou que eu j� havia lhe dado suas
sugest�es, uma sem 'goto' e outra com 'goto':
- Solu��o n�mero 1:
(...)
for (a=0; a<100 && str[a] != '\0'; a++){
if (str[a]=='\44')
break;
}
if (a<100 && str[a] != '\0') // <-- Primeira solu��o
break;
}
- Solu��o n�mero 2:
(...)
for (a=0; a<100 && str[a] != '\0'; a++){
if (str[a]=='\44')
goto fimdolaco; // <-- Segunda solu��o, mais eficiente
}
}
fimdolaco:
Agora um informa��o que devo lhe passar � que o 'goto' � abominado para
todos os casos, menos este. Isto porque para sair de dois la�os esta � a
solu��o mais eficiente, foi s� � preciso uma compara��o e n�o duas.
Outra solu��o sem 'goto' � utilizando uma fun��o do C para procurar pelo
caracter:
#include <string.h>
(...)
if (strchr(str,'$') != NULL)
break;
}
// Repare que eu removi o segundo la�o por este 'if'
Acho que forcei um pouco a barra dizendo que este � o �nico uso
aceit�vel de goto :-)
O uso do 'goto' pode ser essencial se voc� precisa ter o c�digo mais
eficiente poss�vel. � por isso que o kernel do Linux usa tanto.
Mas posso afirmar que este � um dos poucos usos aceit�veis (sair de
v�rios n�veis de la�o). Me lembrei inclusive que a linguagem D
implementa uma alternativa para este uso espec�fico:
http://www.digitalmars.com/d/1.0/ctod.html#labeledbreak
Ent�o no lugar de:
for(count=1; count<=100; count++)
{
printf("%02d ", count);
gets(str);
for (a=0; a<100 && str[a] != '\0'; a++){
if (str[a]=='$')
goto fimdolaco;
}
}
fimdolaco:
Ter�amos (s� com exemplo):
Laco1: for(count=1; count<=100; count++)
{
printf("%02d ", count);
gets(str);
Laco2: for (a=0; a<100 && str[a] != '\0'; a++){
if (str[a]=='$')
break Laco2;
}
}
Que na verdade � a mesma coisa, s� muda a posi��o do "label" e a troca
da palavra chave "goto" por "break".
On 29-08-2010 16:11, Marcio Gil wrote:
> Seu c�digo est� errado por diversos motivos, vou tentar lista-los para
> voc�:
>
> Em 29/8/2010 15:38, Fabiano Vasconcelos escreveu:
>>
>> #include <stdio.h>
>> #include <stdlib.h>
>>
>> int main()
>> {
>> int count;
>> char str[100];
>> int a;
>>
>> printf("Editor de texto - teste\n\n");
>> for(count=1; count<=100; count++) {
>
>> if (count<10) printf("0");
>> printf("%d ", count);
> Sugest�o (n�o � erro): voc� pode substituir estas duas linhas por:
>
> printf("%02d",count);
Gostei da dica! Bem mais profissional! :D
>
>> gets(str);
>>
>> for (a=1; a<=100; a++){
>
> Aqui tem um erro:
> Em C os vetores tem o �ndice iniciado em zero, ent�o o correto �:
>
> for (a=0; a<100; a++){
Eu havia come�ado do ZERO em outra tentativa, mas � que no desespero de
fazer funcionar, coloquei esse 1 a� insanamente.
>
> Outro problema � que voc� continua percorrendo a linha ap�s o fim
> dela, onde h� um monte de lixo (caracteres aleat�rios). Se por acaso
> houver um caractere '$' no meio deste lixo seu c�digo n�o vai
> funcionar. Solu��o:
>
> for (a=0; a<100 && str[a] != '\0'; a++){
>
Mas veja, M�rcio, a minha inten��o foi que assim que ele achasse o
carcatere $, independente do que tem pela frente, ele parasse a execu��o
do programa. Com o la�o for ele n�o iria analisar cada caractere, um a
um, e compar�-los pra ver se acha um $? Por que ele continua percorrendo
a string? Por que o break aqui n�o foi funcional? Juro que n�o entendi!
for (a=1; a<=100; a++){
if (str[a]=="\36") break;
> if (str[a]=="\36") break;
>
> Dois erros:
> 1 - Voc� colocou aspas duplas no lugar de aspas simples;
> 2 - O sequ�ncia '\36' � em octal (base 8) ent�o voc� na verdade est�
> procurando o caracter 30 que nunca vai encontrar, o n�mero 36(base 10)
> em octal � 44(base 8)
Eu me baseei na tabela ASCII (http://www.asciitable.com/) pra achar esse
36. L� nesse site e em http://pt.wikipedia.org/wiki/ASCII dizem que $ �
36 em decimal. Mas, pelo que eu acabei de perceber aqui testtando, o que
ele aceta nesse formato � OCTAL mesmo, n�? Pois �. Achei que fosse
decimal! S� por curiosidade: e se eu quisesse usar o mesmo artif�cio,
sendo com decimal?
As aspas duplas foi outra tentativa insana.
>
> Corre��o:
>
> if (str[a]=='\44') break;
>
> Mas ficaria mais simples assim:
>
> if (str[a]=='$') break;
>
>> }
>
> Outro erro:
>
> O comando 'break' sai do primeiro la�o, mas n�o do segundo. Duas
> solu��es:
>
> for (a=0; a<100 && str[a] != '\0'; a++){
> if (str[a]=='\44')
> break;
> }
> if (a<100 && str[a] != '\0')
> break;
> }
>
Respondida a pergunta do break.
> Ou
>
> for (a=0; a<100 && str[a] != '\0'; a++){
> if (str[a]=='\44')
> goto fimdolaco;
> }
> }
> fimdolaco:
>
>
>>
>> }
>>
>> return 0;
>> }
>>
>>
Fico com a vers�o sem goto! :D
>
> C�digo sugerido completo:
>
> #include <stdio.h>
> #include <stdlib.h>
>
> int main()
> {
> int count;
> char str[100];
> int a;
>
> printf("Editor de texto - teste\n\n");
> for(count=1; count<=100; count++)
> {
> printf("%02d ", count);
> gets(str);
>
> for (a=0; a<100 && str[a] != '\0'; a++){
> if (str[a]=='$')
> goto fimdolaco;
> }
> }
> fimdolaco:
>
> return 0;
> }
>
Obrigado pela dica e pode ter certeza de que eu n�o acharia a resposta
por mim mesmo t������o cedo!
Grande abra�o, amigos! :)
(...)
for (a=0; a<100; a++){
printf( "[%c]", str[a] ); // Mostra o que est� sendo processado
if (str[a]=='$')
break;
}
printf( "\n" ); // S� para melhorar a visualiza��o
if (a<100)
break;
}
return 0;
}
Aqui eu obtive este resultado:
$ gcc editor.c
$ ./a.out
Editor de texto - teste
01 teste
[t][e][s][t][e][]["][]][][][a][][][][][][�]["][][@][][][][][][][][�][5][][a][][][][][][][][][][][][][�][�]["][a][-][c][][a][][][][][U][T][F][-][8][][][a]][][][a][][][][][h][�]["][][�][][][][�][�][][a][][][][][A][S][C][I][I][][][a]][][][a]
02 teste$
[t][e][s][t][e][$]
Viu quanta sujeira? � porque a linguagem C n�o limpa o conte�do
preexistente no espa�o da mem�ria destinado a sua vari�vel 'str'.
Se um destes caracteres fosse '$', o programa seria interrompido mesmo
que o usu�rio n�o digitasse o '$', entendeu?
O que marca o fim da cadeia de caracteres � o caracter zero ou '\0'
> for (a=1; a<=100; a++){
> if (str[a]=="\36") break;
>> if (str[a]=="\36") break;
>>
>> Dois erros:
>> 1 - Voc� colocou aspas duplas no lugar de aspas simples;
>> 2 - O sequ�ncia '\36' � em octal (base 8) ent�o voc� na verdade est�
>> procurando o caracter 30 que nunca vai encontrar, o n�mero 36(base 10)
>> em octal � 44(base 8)
> Eu me baseei na tabela ASCII (http://www.asciitable.com/) pra achar esse
> 36. L� nesse site e em http://pt.wikipedia.org/wiki/ASCII dizem que $ �
> 36 em decimal. Mas, pelo que eu acabei de perceber aqui testtando, o que
> ele aceta nesse formato � OCTAL mesmo, n�? Pois �. Achei que fosse
> decimal! S� por curiosidade: e se eu quisesse usar o mesmo artif�cio,
> sendo com decimal?
Bom neste caso voc� faria assim:
if (str[a]==(char)36) break; // Agora sim 36 � em decimal.
Resumo:
- '$' Literal
- '0x24' Hexadecimal
- '\044' Octal (prefiro assim pois deixa mais claro que � octal)
- '\44' Octal (assim confunde)
- (char)36 Decimal
>
> Obrigado pela dica e pode ter certeza de que eu n�o acharia a resposta
> por mim mesmo t������o cedo!
> Grande abra�o, amigos! :)
>
Disponha.
Em 29/8/2010 18:08, Fabiano Vasconcelos escreveu:
Vamos lá aos coments:
(...)
Outro problema é que você continua percorrendo a linha após o fim
dela, onde há um monte de lixo (caracteres aleatórios). Se por acaso
houver um caractere '$' no meio deste lixo seu código não vai
funcionar. Solução:
for (a=0; a<100 && str[a] != '\0'; a++){
Mas veja, Márcio, a minha intenção foi que assim que ele achasse o
carcatere $, independente do que tem pela frente, ele parasse a execução
do programa. Com o laço for ele não iria analisar cada caractere, um a
um, e compará-los pra ver se acha um $? Por que ele continua percorrendo
a string? Por que o break aqui não foi funcional? Juro que não entendi!
Experimenta fazer assim:
(...)
for (a=0; a<100; a++){
printf( "[%c]", str[a] ); // Mostra o que está sendo processado
if (str[a]=='$')
break;
}
printf( "\n" ); // Só para melhorar a visualização
if (a<100)
break;
}
return 0;
}
Aqui eu obtive este resultado:
$ gcc editor.c
$ ./a.out
Editor de texto - teste
01 teste
[t][e][s][t][e][]["][]][][][a][][][][][][Ð]["][][@][][][][][][][][ð][5][][a][][][][][][][][][][][][][á][›]["][a][-][c][][a][][][][][U][T][F][-][8][][][a]][][][a][][][][][h][Í]["][][À][][][][ƒ][Î][][a][][][][][A][S][C][I][I][][][a]][][][a]
02 teste$
[t][e][s][t][e][$]
Viu quanta sujeira? É porque a linguagem C não limpa o conteúdo
preexistente no espaço da memória destinado a sua variável 'str'.
Se um destes caracteres fosse '$', o programa seria interrompido mesmo
que o usuário não digitasse o '$', entendeu?
O que marca o fim da cadeia de caracteres é o caracter zero ou '\0'
for (a=1; a<=100; a++){
if (str[a]=="\36") break;
if (str[a]=="\36") break;
Dois erros:
1 - Você colocou aspas duplas no lugar de aspas simples;
2 - O sequência '\36' é em octal (base 8) então você na verdade está
procurando o caracter 30 que nunca vai encontrar, o número 36(base 10)
em octal é 44(base 8)
Eu me baseei na tabela ASCII (http://www.asciitable.com/) pra achar esse
36. Lá nesse site e em http://pt.wikipedia.org/wiki/ASCII dizem que $ é
36 em decimal. Mas, pelo que eu acabei de perceber aqui testtando, o que
ele aceta nesse formato é OCTAL mesmo, né? Pois é. Achei que fosse
decimal! Só por curiosidade: e se eu quisesse usar o mesmo artifício,
sendo com decimal?
Bom neste caso você faria assim:
if (str[a]==(char)36) break; // Agora sim 36 é em decimal.
Resumo:
- '$' Literal
- '0x24' Hexadecimal
- '\044' Octal (prefiro assim pois deixa mais claro que é octal)
- '\44' Octal (assim confunde)
- (char)36 Decimal
Obrigado pela dica e pode ter certeza de que eu não acharia a resposta
por mim mesmo tãããããão cedo!
Grande abraço, amigos! :)
Disponha.
- system(”PAUSE”) soa tão nostálgico como programar pra M$-DOS em 1993 J...
Use getch(), ele faz o que você precisa.
Na pr�tica o compilador tem as informa��es necess�rias pra fazer a
otimiza��o se o c�digo foi escrito com breaks e vari�veis locais. Se
faz, � outra hist�ria.
Eu n�o vejo o goto como algo necess�rio referente a essa quest�o de sair
de loops com efici�ncia...
Adriano
Há muito tempo não via um comentário sobre o uso de goto que não mencionasse dinosauros.
Corrigida essa falta, eu diria mais: esse papo de 'X é considerado prejudicial' é geralmente uma super-simplificação do problema. Goto é um grande exemplo. Quem aqui na lista sofreu já com espaguettificação de código por causa de goto em C++? Eu senti na pele o quão goto pode ser prejudicial, quando programava em Tk3000 com um Basic bem básico mesmo. Apesar de ter passado por isso, hoje eu uso goto sem medo, pois na maioria das vezes, o goto serve para simplificar o código.
E isso vale para todos os outros recursos do C++. Já ouvi bastante gente falando que templates devem ser evitados, não o uso, mas a criação de templates; ou seja, um programador só pode usar templates da STL mas não criar o seu. No final, tudo acaba sendo ferramentas disponíveis ao programador, como um martelo. Vc pode usar para pregar quadros, ou quebrar seus dedos.
Concordo. E também tem a questão de gosto pessoal, como já disseram
nesse tópico "usar while ao invés de for" e outros. Cada um é cada um e
acha uma coisa mais simples ou complicada de escrever e/ou dar manutenção.
Só não acho válido justificar o uso com casos teóricos de melhoria de
desempenho, e isso até para casos onde o desempenho não justificaria em
nada a escolha de um código ou outro.
Adriano
bool bCreateModel = false; for (;;) { if (!pModel) { bCreateModel = true; break; } if (asModelParts.GetSize() != asModelPartsToLoad.GetSize()) { bCreateModel = true; break; } for (UINT32 i = 0; i < asModelPartsToLoad.GetSize(); ++i) { if (asModelPartsToLoad[i] != asModelParts[i]) { bCreateModel = true; break; } } break; }
Esse é um caso em que acho que goto se sairia melhor :P
Você pode evitar o uso de goto em laços usando as palavras reservadas "break" ou "continue"
por exemplo:int i = 0;while( i < 10 ){if( i == 9 )break;if( i == 3 ){i += 2;continue;}printf( "%d\n", i );++i;}- o break no caso quebra o laço atual do seu bloco e termina o loop de execução continuando na próxima linha após o bloco do while.- continue faz com que o loop do seu bloco atual retorne para a primeira linha de teste de sua execução descartando dessa forma o codigoabaixo de sua chamada.não são viáveis em questão de fluxograma ou análises de uml mas são bem melhores que goto porque eles quebram o bloco e um terceiro pode facilmente identificar para onde o código deve seguir.Mesmo assim por bons costumes, o código pode ficar muito melhor sem eles. Quanto ao o goto deveria ser considerado deprecado mas não foi retirado pois vários programas em c mais antigos o usavam e precisavam dele na definição da linguagem para continuarem a serem compatíveis.AbraçosAndré
bool bCreateModel = false;
if (!pModel || asModelParts.GetSize() != asModelPartsToLoad.GetSize()) {
bCreateModel = true;
} else {
for (UINT32 i = 0; i < asModelPartsToLoad.GetSize(); ++i) {
if (asModelPartsToLoad[i] != asModelParts[i]) {
bCreateModel = true;
break;
}
}
}
--
-alex
http://www.artisancoder.com/
--
Antes de enviar um e-mail para o grupo leia:
http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~---------------------------------~----------~--~----~
[&] Colabore com a Pesquisa de Preferência de Conteúdo
para Eventos do Grupo C & C++ Brasil:
http://www.surveymonkey.com/s/GBBGTXN
------~----~-------~---~---~---~---~----------------~------------~---------~
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
Emprego & carreira: vag...@ccppbrasil.org
http://groups.google.com/group/dev-guys?hl=en
error = 0;
if (um tratamento qualquer){
}error = 1;goto finalDaFuncao;
else
{
processamento();
if (outro tratamento)
{
error = 2;
goto finalDaFuncao;
finalDaFuncao:}}
if (error){
tratamentoOuExibicaoDoErro();
}
Eu acredito que existe uma explicação que diz que essa forma de codificação traz algum benefício que não me lembro agora qual é.
O uso do goto no Linux se resume a um fato: O Linus gosta, e enquanto
ele gostar vai continuar sendo usado. Como eu disse, quest�o de gosto. E
como diz nesse link, desempenho � problema do compilador.
Adriano
On 30/08/2010 14:12, Eduardo Vieira wrote:
Linux: Using goto In Kernel Code
http://kerneltrap.org/node/553/2131
O uso do goto no Linux se resume a um fato: O Linus gosta, e enquanto ele gostar vai continuar sendo usado. Como eu disse, questão de gosto. E como diz nesse link, desempenho é problema do compilador.
Adriano
On 30/08/2010 14:12, Eduardo Vieira wrote:
O uso do goto no Linux se resume a um fato: O Linus gosta, e enquanto ele gostar vai continuar sendo usado. Como eu disse, questão de gosto. E como diz nesse link, desempenho é problema do compilador.
Adriano
--
Se vc ler minha outra mensagem, vai ver que o que eu disse est�
relacionado a um contexto.
> N�o importa qu�o bom seja o compilador, quem j� precisou escovar bit�s
> pra ganhar desempenho, sabe que as vezes ou voc� desce pro assembly ou
> coloca um goto aqui e ali.
>
E muitas vezes uma otimiza��o "mirabolante" feita pelo programador pode
resultar em um c�digo que rode bem mais lento.
Ent�o se o programador � o bonz�o, os compiladores n�o deveriam otimizar
o c�digo gerado?
A otimiza��o n�o existe pra transformar um programador ruim em bom, e
sim para que o programador possa escrever um c�digo mais decente e ainda
assim r�pido. Se n�o era s� deixar tudo em assembly e pronto...
> N�o existe esse papo de certo, errado. A quest�o � "vc sabe oq est�
> fazendo? os ganhos s�o maiores que as perdas?".
> Esse papinho de n�o usar GOTO nunca, que � erro de projeto ou algo do
> tipo, � papinho de aula de AED na faculdade.....l� fora a realidade as
> vezes � outra.
>
Eu concordo com isso. Tem professorzinho que diz que n�o se deve usar
break e continue, e sim fazer tudo com os testes de whiles e ifs. Pra
mim o que essas pessoas que s� sabem teoria falam n�o tem muito valor...
Adriano
Me desculpe, mas esta afirma��o de que o compilador � o �nico
respons�vel pelo desempenho � fora da realidade pr�tica. Compilador
n�o faz milagres. Um bom programador sabe instintivamente como
ajudar o otimizador e obt�m um programa mais r�pido, e n�o �
necess�rio nada mirabolante.
No entanto, quando a otimiza��o � necess�ria, deve ser feito com
mensura��o de tempo de processamento, preferencialmente depois de
localizados os gargalos no sistema. Neste caso n�o tem como resultar
em c�digo mais lento, pois voc� s� vai utilizar o novo c�digo depois
de ter comprovado a melhoria no desempenho e se o c�digo faz o que
precisa.
Atualmente trabalhei em um projeto que, apesar de ser escrito em C++
e muito bom do ponto de vista l�gico, ficou um pouco lento por causa
de um detalhe aqui e ali. Isto porque os programadores atuais est�o
perdendo a capacidade de saber otimizar as coisas. Eles sabem obter o
resultado, mais a� vem um programador mais experiente e faz o mesmo
trabalho at� 10 vezes mais eficiente.
Uns anos atr�s eu abri um t�pico neste grupo pedindo ajuda para
otimizar um c�digo:
http://groups.google.com.br/group/ccppbrasil/browse_thread/thread/6ca6fce4e2c59a6
Era uma fun��o que fazia um milh�o de multiplica��es em 38 segundos,
conseguimos melhorar para cerca de 2 segundos.
> Em 30/8/2010 18:35, Adriano dos Santos Fernandes escreveu:
> > On 30-08-2010 18:18, Luis Miranda wrote:
> >> Não importa quão bom seja o compilador, quem já precisou escovar
> >> bit´s pra ganhar desempenho, sabe que as vezes ou você desce pro
> >> assembly ou coloca um goto aqui e ali.
> >>
> > E muitas vezes uma otimização "mirabolante" feita pelo programador
> > pode resultar em um código que rode bem mais lento.
> >
> > Então se o programador é o bonzão, os compiladores não deveriam
> > otimizar o código gerado?
> >
> > A otimização não existe pra transformar um programador ruim em
> > bom, e sim para que o programador possa escrever um código mais
> > decente e ainda assim rápido. Se não era só deixar tudo em
> > assembly e pronto...
> >
>
> Me desculpe, mas esta afirmação de que o compilador é o único
> responsável pelo desempenho é fora da realidade prática. Compilador
> não faz milagres. Um bom programador sabe instintivamente como
> ajudar o otimizador e obtém um programa mais rápido, e não é
> necessário nada mirabolante.
Olha, não foi bem isso que foi dito, que o compilador é o *único* responsável. Ele é sim o maior responsável. Diria que o processo normal, que acho que todos aqui devem considerar o 'certo', é o programador fazer 99% do código só seguindo boas práticas e deixar a optimização para o compilador, e depois só fazer o 1% no lugar acusado pelo profiler ou testes unitários ou alguma métrica similar.
O ponto é: o compilador sim acaba fazendo a maior parte da optimização, o programador precisa só ajudar 'um pouco', fazendo uso de boas práticas.
>
> No entanto, quando a otimização é necessária, deve ser feito com
> mensuração de tempo de processamento, preferencialmente depois de
> localizados os gargalos no sistema. Neste caso não tem como resultar
> em código mais lento, pois você só vai utilizar o novo código depois
> de ter comprovado a melhoria no desempenho e se o código faz o que
> precisa.
>
> Atualmente trabalhei em um projeto que, apesar de ser escrito em C++
> e muito bom do ponto de vista lógico, ficou um pouco lento por causa
> de um detalhe aqui e ali. Isto porque os programadores atuais estão
> perdendo a capacidade de saber otimizar as coisas. Eles sabem obter o
> resultado, mais aí vem um programador mais experiente e faz o mesmo
> trabalho até 10 vezes mais eficiente.
>
> Uns anos atrás eu abri um tópico neste grupo pedindo ajuda para
> otimizar um código:
>
> http://groups.google.com.br/group/ccppbrasil/browse_thread/thread/6ca6fce4e2c59a6
>
> Era uma função que fazia um milhão de multiplicações em 38 segundos,
> conseguimos melhorar para cerca de 2 segundos.
>
Agora falando s�rio, � raro um c�digo ser melhorado em 20 vezes, no
entanto sempre � poss�vel melhorar um pouco, e este pouco
frequentemente ultrapassa os 100%, ou seja, um bom otimizador
humano pode tornar um c�digo 2 vezes mais r�pido ou ainda mais.
chega:
exit(EXIT_FAILURE);
"goto" é como cerveja, beba com moderação.
Eu n�o fa�o id�ia de onde voc� leu isso.
> Compilador
> n�o faz milagres. Um bom programador sabe instintivamente como
> ajudar o otimizador e obt�m um programa mais r�pido, e n�o �
> necess�rio nada mirabolante.
>
> No entanto, quando a otimiza��o � necess�ria, deve ser feito com
> mensura��o de tempo de processamento, preferencialmente depois de
> localizados os gargalos no sistema. Neste caso n�o tem como resultar
> em c�digo mais lento, pois voc� s� vai utilizar o novo c�digo depois
> de ter comprovado a melhoria no desempenho e se o c�digo faz o que
> precisa.
>
Na verdade tem como resultar em c�digo mais lento sim. Existe um exemplo
(da AMD, pelo que lembro) que mostra exatamente algo com matrizes em que
diferentes maneiras de passar pelos dados deixa o c�digo mais r�pido ou
mais lento. Isto est� relacionado ao cache. Se vc pega uma arquitetura
que tenha um cache que trabalhe diferente, seu algoritmo pode ficar pior.
> Atualmente trabalhei em um projeto que, apesar de ser escrito em C++
> e muito bom do ponto de vista l�gico, ficou um pouco lento por causa
> de um detalhe aqui e ali. Isto porque os programadores atuais est�o
> perdendo a capacidade de saber otimizar as coisas. Eles sabem obter o
> resultado, mais a� vem um programador mais experiente e faz o mesmo
> trabalho at� 10 vezes mais eficiente.
>
> Uns anos atr�s eu abri um t�pico neste grupo pedindo ajuda para
> otimizar um c�digo:
>
> http://groups.google.com.br/group/ccppbrasil/browse_thread/thread/6ca6fce4e2c59a6
>
>
> Era uma fun��o que fazia um milh�o de multiplica��es em 38 segundos,
> conseguimos melhorar para cerca de 2 segundos.
>
Me parece que n�o foi substituindo uma ou outra vari�vel local e breaks
por goto...
Adriano
> Em 30/8/2010 21:10, Gianni escreveu:
> >
> > Olha, não foi bem isso que foi dito, que o compilador é o *único*
> > responsável. Ele é sim o maior responsável. Diria que o processo
> > normal, que acho que todos aqui devem considerar o 'certo', é o
> > programador fazer 99% do código só seguindo boas práticas e deixar
> > a optimização para o compilador, e depois só fazer o 1% no lugar
> > acusado pelo profiler ou testes unitários ou alguma métrica
> > similar.
> >
> > O ponto é: o compilador sim acaba fazendo a maior parte da
> > optimização, o programador precisa só ajudar 'um pouco', fazendo
> > uso de boas práticas.
> >
> Mas se um escovador de bits pega um código que foi escrito seguindo
> todas as boas práticas e o deixa 20 vezes mais rápido, então o
> programador não ajudou um "pouquinho", ajudou um "poucão" :-)
>
> Agora falando sério, é raro um código ser melhorado em 20 vezes, no
> entanto sempre é possível melhorar um pouco, e este pouco
> frequentemente ultrapassa os 100%, ou seja, um bom otimizador
> humano pode tornar um código 2 vezes mais rápido ou ainda mais.
Com certeza; mas o que adianta fazer um processo que, por exemplo, gera um HTTP request rodar em 50ms ao invés de 100ms se o round-trip inteiro vai demorar 2s?
Um programador é um recurso limitado e o optimizador do compilador é ilimitado. Nós nunca aqui falamos que o optimizador é melhor que ninguém, mas que em um processo normal de desenvolvimento, usar o optimizador (ou seja, usar boas práticas para deixar o optimizador fazer bem o trabalho dele) é a técnica que vai dar o melhor ganho de performance se todo o programa for considera, e não só um processo.
On 30-08-2010 20:57, Marcio Gil wrote:
> Em 30/8/2010 18:35, Adriano dos Santos Fernandes escreveu:
>> On 30-08-2010 18:18, Luis Miranda wrote:
>>> Não importa quão bom seja o compilador, quem já precisou escovar
>>> bit´s pra ganhar desempenho, sabe que as vezes ou você desce pro
>>> assembly ou coloca um goto aqui e ali.
>>>
>> E muitas vezes uma otimização "mirabolante" feita pelo programador
>> pode resultar em um código que rode bem mais lento.
>>
>> Então se o programador é o bonzão, os compiladores não deveriam
>> otimizar o código gerado?
>>
>> A otimização não existe pra transformar um programador ruim em
>> bom, e sim para que o programador possa escrever um código mais
>> decente e ainda assim rápido. Se não era só deixar tudo em
>> assembly e pronto...
>>
>
> Me desculpe, mas esta afirmação de que o compilador é o único
> responsável pelo desempenho é fora da realidade prática.
Eu não faço idéia de onde você leu isso.
> Compilador
> não faz milagres. Um bom programador sabe instintivamente como
> ajudar o otimizador e obtém um programa mais rápido, e não é
> necessário nada mirabolante.
>
> No entanto, quando a otimização é necessária, deve ser feito com
> mensuração de tempo de processamento, preferencialmente depois de
> localizados os gargalos no sistema. Neste caso não tem como resultar
> em código mais lento, pois você só vai utilizar o novo código depoisNa verdade tem como resultar em código mais lento sim. Existe um exemplo
> de ter comprovado a melhoria no desempenho e se o código faz o que
> precisa.
>
(da AMD, pelo que lembro) que mostra exatamente algo com matrizes em que
diferentes maneiras de passar pelos dados deixa o código mais rápido ou
mais lento. Isto está relacionado ao cache. Se vc pega uma arquitetura
que tenha um cache que trabalhe diferente, seu algoritmo pode ficar pior.
> Atualmente trabalhei em um projeto que, apesar de ser escrito em C++
> e muito bom do ponto de vista lógico, ficou um pouco lento por causa
> de um detalhe aqui e ali. Isto porque os programadores atuais estão
> perdendo a capacidade de saber otimizar as coisas. Eles sabem obter o
> resultado, mais aí vem um programador mais experiente e faz o mesmo
> trabalho até 10 vezes mais eficiente.
>
> Uns anos atrás eu abri um tópico neste grupo pedindo ajuda para
> otimizar um código:
>
> http://groups.google.com.br/group/ccppbrasil/browse_thread/thread/6ca6fce4e2c59a6
>
>
> Era uma função que fazia um milhão de multiplicações em 38 segundos,
> conseguimos melhorar para cerca de 2 segundos.
>
Me parece que não foi substituindo uma ou outra variável local e breaks
por goto...
Adriano
Um exemplo triste que presenciei recentemente: constatar que o
sistema da concorr�ncia escrito em VB � mais r�pido que o seu
escrito em C++...
Se voc� cronometrar o seu programa, localizar os gargalos e ir
melhorando um pouco aqui, um pouco l�, vai ver que o ganho ser� bem
maior que 1%
Esse é um assunto no mínimo interessante, pois trás de volta questões
muito antigas.
Aconselho a leitura de dois textos, o artigo original do E.W. Dijkstra
que propõe o fim do goto [1] (literalmente "Goto Statement Considered
Harmful"), e o texto a seguir do professor que recusou o artigo,
retirado de [2].
[1] http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.92.4846&rep=rep1&type=pdf
[2] http://www.fang.ece.ufl.edu/reject.html
Boa leitura,
[]'s
André
E.W. DIJKSTRA
"Goto Statement Considered Harmful." This paper tries to convince us
that the well-known goto statement should be eliminated from our
programming languages or, at least (since I don't think that it will
ever be eliminated), that programmers should not use it. It is not
clear what should replace it. The paper doesn't explain to us what
would be the use of the "if" statement without a "goto" to redirect
the flow of execution: Should all our postconditions consist of a
single statement, or should we only use the arithmetic "if," which
doesn't contain the offensive "goto"?
And how will one deal with the case in which, having reached the end
of an alternative, the program needs to continue the execution
somewhere else?
The author is a proponent of the so-called "structured programming"
style, in which, if I get it right, gotos are replaced by indentation.
Structured programming is a nice academic exercise, which works well
for small examples, but I doubt that any real-world program will ever
be written in such a style. More than 10 years of industrial
experience with Fortran have proved conclusively to everybody
concerned that, in the real world, the goto is useful and necessary:
its presence might cause some inconveniences in debugging, but it is a
de facto standard and we must live with it. It will take more than the
academic elucubrations of a purist to remove it from our languages.
Publishing this would waste valuable paper: Should it be published, I
am as sure it will go uncited and unnoticed as I am confident that, 30
years from now, the goto will still be alive and well and used as
widely as it is today.
Confidential comments to the editor: The author should withdraw the
paper and submit it someplace where it will not be peer reviewed. A
letter to the editor would be a perfect choice: Nobody will notice it
there!
> Em 30/8/2010 21:38, Gianni escreveu:
> >
> > Com certeza; mas o que adianta fazer um processo que, por exemplo,
> > gera um HTTP request rodar em 50ms ao invés de 100ms se o
> > round-trip inteiro vai demorar 2s?
> >
> Pois é, mas até a interação com programas ou dispositivos externos
> ao sistema pode ser otimizado.
>
> Um exemplo triste que presenciei recentemente: constatar que o
> sistema da concorrência escrito em VB é mais rápido que o seu
> escrito em C++...
>
> Se você cronometrar o seu programa, localizar os gargalos e ir
> melhorando um pouco aqui, um pouco lá, vai ver que o ganho será bem
> maior que 1%
Eu não disse que o ganho seria de 1%, mas que a proporção de código que se precisa mexer ao invés de deixar para o optimizador seria 1%; e ainda assim, esse 1% é figurativo. E o exemplo que citei mostra como não vale a pena ficar optimizando tudo, pois 50ms de ganho em um processo que demora 2s não vale nada. Eu acho que vc entendeu tudo ao contrário que eu disse.
--
Antes de enviar um e-mail para o grupo leia:
http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~---------------------------------~----------~--~----~
[&] Colabore com a Pesquisa de Preferência de Conteúdo
para Eventos do Grupo C & C++ Brasil:
http://www.surveymonkey.com/s/GBBGTXN
------~----~-------~---~---~---~---~----------------~------------~---------~
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
Emprego & carreira: vag...@ccppbrasil.org
http://groups.google.com/group/dev-guys?hl=en
O segundo paper parece bem estranho. A pessoa rejeita papers por não
compreender formalismos, e implica que if's só funcionam com apenas um
statement. E em nenhum momento discute sobre as "coordenadas"
explicadas pelo paper do Dijkstra.
> [1] http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.92.4846&rep=rep1&type=pdf
> [2] http://www.fang.ece.ufl.edu/reject.html
--
Felipe Magno de Almeida
Eu tive um caso interessante com o Keil, quando estava desenvolvendo pra ARM.
fazer:
if (condicao)
{
do
{
} while (condicao)
}
ao invés de:
while (condicao)
{
}
Não só era mais rápido como também economizava 4 bytes do binário final!
Wander
Mas como a pergunta é "Por quê goto foi considerado prejudicial?",
nada melhor que ler o texto original que propôs isso.
[]'s
André Tupinambá
2010/8/31 Felipe Magno de Almeida <felipe.m...@gmail.com>: