resultado nada haver, no que estou batendo tanto a cabeça? [RESOLVIDO]

1. resultado nada haver, no que estou batendo tanto a cabeça? [RESOLVIDO]

daniel s. filho
westbill

(usa Fedora)

Enviado em 24/05/2015 - 15:33h

Olá.
Já pesquisei e tentei usar várias funções para limpar o buffer mas não tive exito, o final do programa imprime resultados nada haver.
Não acho o erro.
Alguém pode me explicar no que estou batendo tanto a cabeça?
segue o código:


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

#define tamanho 2

main ()
{
int i, vetor_cod[tamanho], vetor_preco[tamanho], vetor_reajuste[tamanho];
char vetor_produtos[tamanho][40];
for( i=0; i < tamanho; i = i + 1)
{
printf("Qual o nome do produto?\n");
gets(vetor_produtos[i]);
printf("Qual o codigo do produto %s ?\n", vetor_produtos[i]);
scanf("%d", &vetor_cod[i]);
printf("Qual o preco do produto?\n");
scanf("%d", &vetor_preco[i]);
getchar();
}
printf("\n\n=============================================================================\n\n");
printf("Nome_do_Produto Codigo_do_Produto Preco_sem_Reajuste Preco_com_Reajuste\n,");
for (i=0; i < tamanho; i = i + 1)
{
if (vetor_preco[i] > 1000 && vetor_cod[i] % 2 == 0)
{
vetor_reajuste[i] = vetor_preco[i] + (vetor_preco[i] * 20/100);
}
else
{
if (vetor_preco[i] % 2 == 0)
{
vetor_reajuste[i] = vetor_preco[i] + (vetor_preco[i] * 15/100);
}
else
{
if (vetor_preco[i] > 1000)
{
vetor_reajuste[i] = vetor_preco[i] + (vetor_preco[i] * 10/100);
}
}
}
printf("\n%s %d %d %d %d", vetor_produtos[i], vetor_cod[i], vetor_preco[i], vetor_reajuste[i]);
}
}



  


2. MELHOR RESPOSTA

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 24/05/2015 - 16:23h

Opa Amigo, tudo certo?

Segue código corrigido. Explicações no código!


#include <stdio.h>
// Macros sao sempre MAIUSCULAS
#define TAMANHO 2


// Main Deve retornar valor inteiro!!!
int main (void) {
int i, vetor_cod[TAMANHO], vetor_preco[TAMANHO], vetor_reajuste[TAMANHO];
char vetor_produtos[TAMANHO][40];
int x; // Aux
// I++ é igual a I = I + 1!!!
for( i=0; i < TAMANHO; i++) {
printf("\n\nQual o nome do produto ?\n: ");
// Aqui ele pega todos os caracteres até o enter ('\n') ser apertado; funciona igual ao gets();
scanf("%[^\n]s",vetor_produtos[ i ]);
printf("Qual o codigo do produto %s ?\n: ", vetor_produtos[ i ]);
scanf("%d", &vetor_cod[ i ]);
printf("Qual o preco do produto %s ?\n: ",vetor_produtos[ i ]);
scanf("%d", &vetor_preco[ i ]);
getchar();
}

printf("\n\n=============================================================================\n\n");
// '\t' imprime uma tabulação (4 espacos)
// Diminuir essa frase!!!
printf("Nome_do_Produto\tCodigo_do_Produto\tPreco_sem_Reajuste\tPreco_com_Reajuste:\n");
for (i=0; i < TAMANHO; i++) {
if (vetor_preco[ i ] > 1000 && vetor_cod[ i ] % 2 == 0) {
x = vetor_preco[ i ] *20/100;
//printf("\n[!]Preco 1: %d\n",x);
vetor_reajuste[ i ] = vetor_preco[ i ] + x;
} else if (vetor_preco[ i ] % 2 == 0) {
x = vetor_preco[ i ] *15/100;
//printf("\n[!]Preco 2: %d\n",x);
vetor_reajuste[ i ] = vetor_preco[ i ] + x;
} else if (vetor_preco[ i ] > 1000) {
x = vetor_preco[ i ] *10/100;
//printf("\n[!]Preco 3: %d\n",x);
vetor_reajuste[ i ] = vetor_preco[ i ] + x;
}
printf("\n%s\t%d\t%d\t%d\t%d", vetor_produtos[ i ], vetor_cod[ i ], vetor_preco[ i ], vetor_reajuste[ i ]);
}
// Retorno do Main DEVE ser INT!!!
return 0;
}



Uma coisa que talvez fique em dúvida é em relação ao retorno do main: se retornar o valor 0 (zero), indica que tudo ocorreu bem. Não-zero significa problema.

Em C++ o return 0; pode ser omitido, mas deve ser assim: int main (void) (Void significa que não vai receber nenhum argumento).

Se ajudei, marque o tópico como resolvido e clique em melhor resposta.

Espero ter ajudado

[]'s

T+

--

Dr. quanto tempo de vida eu tenho?
- 15 minutos.
E o que o Sr. pode fazer por mim?
- No máximo, um miojo. = )



3. Re: resultado nada haver, no que estou batendo tanto a cabeça? [RESOLVIDO]

Ednux
ednux

(usa Arch Linux)

Enviado em 24/05/2015 - 16:12h

Você pode fazer com:

printf("Qual o nome do produto: ");
scanf("%[^\n]%*c",vetor_produtos[i]);
// ou com
//fgets(vetor_produtos[i],39,stdin);

printf("Qual o codigo do produto %s: ", vetor_produtos[i]);
scanf("%d%*c", &vetor_cod[i]);

printf("Qual o preco do produto: ");
scanf("%d%*c", &vetor_preco[i]);

Esse [^\n] é uma instrução a função scanf, que diz "Leia até encontrar o caractere \n (Enter ou quebra de linha)". Assim o seu uso fica semelhante ao gets. O %*c também é uma instrução, porém está serve para descartar o último caractere.

Uma outra solução para limpar o buffer do teclado seria criar uma função, veja aqui: http://www.vivaolinux.com.br/topico/C-C++/Qual-e-a-melhor-maneira-de-limpar-o-buffer . Não esqueça de aplicar a correção, mudando de char c para int c. Como o amigo Paulo explicou.

No seu último printf tem um %d a mais, o que gera um valor aleatório na saída. Em vez de usar espaços em branco para formatação da saída, talvez você ache mais interessante usar:

printf("%5d",v[i]);
// ou
//printf("%d\t",v[i]);

O "5" antes do d é a quantidade de espaços. O \t é um caractere especial de alinhamento horizontal.


4. Re: resultado nada haver, no que estou batendo tanto a cabeça? [RESOLVIDO]

Ronilson Brunhara
RBCOL

(usa Outra)

Enviado em 24/05/2015 - 19:43h

Use esta função setbuf (stdin, NULL); depois do scanf


5. Re: resultado nada haver, no que estou batendo tanto a cabeça? [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 25/05/2015 - 08:22h

RBCOL escreveu:

Use esta função setbuf (stdin, NULL); depois do scanf


Essa sugestão é ruim. Se funciona para descartar conteúdo do buffer de leitura em algum sistema, fá-lo é por mero acaso. Além do mais, usar setvbuf() (que é a verdadeira função escondida por trás de setbuf()) depois de se ter realizado uma operação de leitura é um erro. Veja o que diz a documentação.

The setvbuf() function may be used only after opening a stream and before any other operations have been performed on it.


Traduzindo: A função setvbuf() pode ser usada somente após abrir um stream e antes de se realizar qualquer outra operação sobre ele.


6. Re: resultado nada haver, no que estou batendo tanto a cabeça? [RESOLVIDO]

daniel s. filho
westbill

(usa Fedora)

Enviado em 25/05/2015 - 13:32h


Muito obrigado a todos que me ajudaram, todos as informações foram muito úteis, obrigado.


7. Re: resultado nada haver, no que estou batendo tanto a cabeça? [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/05/2015 - 11:41h

        if (vetor_preco[ i ] > 1000 && vetor_cod[ i ] % 2 == 0) {
x = vetor_preco[ i ] *20/100;
//printf("\n[!]Preco 1: %d\n",x);
vetor_reajuste[ i ] = vetor_preco[ i ] + x;
} else if (vetor_preco[ i ] % 2 == 0) {
x = vetor_preco[ i ] *15/100;
//printf("\n[!]Preco 2: %d\n",x);
vetor_reajuste[ i ] = vetor_preco[ i ] + x;
} else if (vetor_preco[ i ] > 1000) {
x = vetor_preco[ i ] *10/100;
//printf("\n[!]Preco 3: %d\n",x);
vetor_reajuste[ i ] = vetor_preco[ i ] + x;
}


Eu gosto de concisão. O bloco acima pode ser reescrito do seguinte modo.

int fator_aumento;  // Nome mais descritivo que ‘x’.
int preco=vetor_preco[i]; // Se for C++, pode usar ‘&preco’.

// Vê se o preco é par
if(preco&1==0){
if(preco>1000)
fator_aumento=20;
else
fator_aumento=15;
}
else if(preco>1000)
fator_aumento=10;
else
fator_aumento=0;

vetor_reajuste[i]=preco+preco*fator_aumento/100;


Ou, ainda.

int fator_aumento;  // Nome mais descritivo que ‘x’.
int preco=vetor_preco[i]; // Se for C++, pode usar ‘&preco’.

fator_aumento=preco&1? preco>1000? 20: 15: preco>1000? 10: 0;
vetor_reajuste[i]=preco+preco*fator_aumento/100;


Poderia ficar ainda mais curto e com uma operação a menos se deslocássemos a parcela preco, na soma do preço com o aumento, para dentro do fator (20 viraria 120; 15, 115; 10, 110; e 0, 100), eliminando a soma. Mas isso ficaria menos legível, ao ponto de ter um fator igual a 100 para indicar que não houve aumento.

Acho estranho preços expressos com uma variável inteira. Dependendo do preço inicial e dos limites que um valor inteiro pode acomodar, multiplicar por 20 (ou pior ainda se for por 120) pode provocar a extrapolação do limite representável antes da divisão por 100, e isso acarretar um valor final errado (talvez até negativo).

Se os preços fossem valores de ponto flutuante, seria menos custoso multiplicar por algo como 1.2, em lugar de multiplicar por 120 para depois dividir por 100. Além disso, um fator de correção igual a 1 seria também mais palatável do que uma multiplicação por 100 seguida de uma divisão por 100.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts