Enviado em 07/12/2008 - 22:17h
Fala galera.
Estou necessitando com urgencia a ajuda de um progamador com experiencia boa...tenho um problema com um tp da minha facudade.Editei o arquivo e quando vou executar em determinado campo do progama(venda de produtos),o programa avisa sobre falha de segmentação! (no codigo se localiza em um swich, case '2'.) creio eu que deve ser algum problema na manipulação de membros da estrutura.codigo abaixo
Agradeço por qualquer tipo de ajuda.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define TAMANMAX 20
#define MAXPRODUTS 5
#define RANDOM 4
#define RODMAX 10
#define LIM 9
#define sim 1
#define nao 0
#define P1 0.1
#define P2 0.2
#define P3 0.3
#define P4 0.4
#define P5 0.5
struct produto{
char produto[TAMANMAX] ;
int codigo;
float preco;
int desp;
}pdr[MAXPRODUTS];
void insert_pdt(int *i){
printf("CADASTRAMENTO\n");
printf("--------------\n");
printf("Nome do produto :"); scanf("%s", pdr[*i].produto);
printf("Codigo do produto :"); scanf("%d", &pdr[*i].codigo);
printf("Valor do produto :"); scanf("%f", &pdr[*i].preco);
printf("Desposição em estoque:");scanf("%d", &pdr[*i].desp);
++i;
}
void mostrar(int *j){
int i;
for(i=0; i<*j; i++){
printf("\n***PRODUTOS***\n");
if(*pdr[i].produto) printf("NUM 1 - Produto: %5s\n", pdr[i].produto);
if(pdr[i].codigo) printf("NUM 2 -Codigo: %5d\n", pdr[i].codigo);
if(pdr[i].preco) printf("NUM 3 - Preço: %5f\n", pdr[i].preco);
if(pdr[i].desp) printf("NUM 4 - Desposição: %5d\n", pdr[i].desp);
}
printf("***Pressione qualquer tecla para continuar***\n");
}
void salvar(int *j){
int i;
FILE *fp;
char progn[TAMANMAX];
printf("Insira um nome para o arquivo: ");
scanf("%s", progn);
strcat(progn,".txt");
if((fp = fopen (progn,"w"))==NULL){
printf("IMPOSSIVEL ABRIR O ARQUIVO : %s\n\a",progn);
exit(1);
}
for(i=0; i<*j; i++){
if(*pdr[i].produto) fprintf(fp, "Produto: %5s\n", pdr[i].produto);
if(pdr[i].codigo) fprintf(fp, "Codigo %5d\n", pdr[i].codigo);
if(pdr[i].preco) fprintf(fp, "Preço %5f\n", pdr[i].preco);
if(pdr[i].desp) fprintf(fp, "Desposição %5d\n", pdr[i].desp);
}
fclose(fp);
}
float desc(float val){
int enter;
float res, prctd;
srand(time(NULL));
enter = rand()%RANDOM;
if(enter == 0)
prctd = P1;
else if(enter == 1){
prctd = P2;
}
else if(enter == 2){
prctd = P3;
}
else if(enter == 3){
prctd = P4;
}
else if(enter == 4){
prctd = P5;
}
res = val*prctd;
return res;
}
main (){
FILE *file;
char opcao, opcad, continua, escolha,arqnom[TAMANMAX];
int cad, p, i,lvenda, j, num, para;
float valorp=0;
while (1){
printf(" ******************************************\n");
printf(" CORDAS DA ALEGRIA EQUIPAMENTOS DE SOM LTDA\n");
printf(" ******************************************\n");
printf("\n");
printf("SEJA BEM VINDO!\n");
printf("Voce esta sendo atendido pelo nosso servidor eletronico ALPHA12\n");
printf("\n");
printf("Selecione uma das opções abaixo: ");
printf("\n");
do{
printf("Selecione um dos campos para navegar\n");
printf("\n");
printf("TECLE 1 ou 2 ou 3\n");
printf("\n");
printf("\t\t*****************************\n");
printf("\t\t1 - Cadastramento de produtos\n\t\t2 - Compra de produto\n\t\t3 - Envio de Relatorios\n");
printf("\t\t*****************************\n");
printf("\n");
scanf("%c", &opcao);
printf("\n");
if((opcao!='1')&&(opcao!='2')&&(opcao!='3')){
printf("Opção incorreta\nFavor Inserir uma opção correta\n");
}
}while((opcao!='1')&&(opcao!='2')&&(opcao!='3'));
switch(opcao){
case '1': {
do{
printf("*************************\n");
printf("CADASTRAMENTO DE PRODUTOS\n");
printf("*************************\n");
printf("\n");
printf("TECLE M ou C ou S\n");
printf("\t\tM - Mostrar produtos cadastrados\n");
printf("\t\tC - Cadastramento de produtos\n");
printf("\t\tS - Salvar produtos cadastrados\n");
printf("\n");
scanf("%c", &opcad);
printf("\n");
if((opcad!='M')&&(opcad!='C')&&(opcad!='S')){
printf("Opção incorreta\nFavor Inserir uma opção correta\n");
}
if(opcad == 'M'){
printf("*****************\n");
printf("Lista de produtos\n");
printf("*****************\n");
printf("\n");
for(i=1;i<=MAXPRODUTS;i++)
mostrar(&i);
}
else if(opcad == 'C'){
printf("*************\n");
printf("Cadastramento\n");
printf("*************\n");
printf("\n");
for(cad=1;cad<=5;cad++)
insert_pdt(&cad);
}
else if(opcad == 'S'){
printf("SALVANDO O CADASTRAMENTO\n");
salvar(&i);
}
}while((opcad!='A')&&(opcad!='B')&&(opcad!='C'));
system("tput reset");
} break;
case '2' : {
printf("Insira um nome para o arquivo que ira enviar o relatorio de vendas\n");
scanf("%s", arqnom);
strcat(arqnom,".txt");
if((file = fopen(arqnom, "w"))==NULL){
printf("Impossivel abrir o arquivo %s\n",arqnom);
exit(2);
}
printf("*******************\n");
printf("NEGOCIAÇÃO E VENDAS\n");
printf("*******************\n");
printf("\n");
printf("Nossos pdr\n");
for(lvenda=0;lvenda<=MAXPRODUTS;lvenda++){
mostrar(&lvenda);
}
printf("Selecione um dos pdr para comprar\n");
scanf("%d", &p);
printf("TECLE UM NUMERO DE 1 A 5\n");
do{
for(j=1;j<=RODMAX;j++){
printf("%dº rodada de negociação\n", j);
fprintf(file, "%dº rodada de negociação\n", j);
printf("Por favor digite o valor que voce deseja comprar o produto\n");
fprintf(file, "Por favor digite o valor que voce deseja comprar o produto\n");
scanf("%f", valorp);
if (valorp >= (pdr[p].preco)) {
printf("%f é um bom preço!Negocio fechado!\n", valorp);
fprintf(file, "%f é um bom preço!Negocio fechado\n", valorp);
pdr[p].desp--;
exit(3);
}
else{
printf("Posso lhe vender por este preço %f\n", desc(valorp));
fprintf(file, "Posso lhe vender por este preço %f\n", desc(valorp));
printf("Deseja comprar por este preço?\n");
fprintf(file, "Deseja comprar por este preço?\n");
printf("Pressione ''s'' para sim e ''n'' para nao\n");
scanf("%c", &escolha);
escolha = getchar();
getchar();
if(escolha == 's'){
printf("Vendido pelo valor de %f\n", valorp);
fprintf(file, "Vendido pelo valor de %f\n", valorp);
pdr[p].desp--;
exit(4);
}
printf("Deseja continuar a negociar?\n");
fprintf(file, "Deseja continuar a negociar?\n");
printf("Digite ''s'' para sim e ''n''para nao\n");
scanf("%c", &continua);
continua = getchar();
getchar();
para = continua == 's' ? sim : nao;
if(j==LIM)
printf("A decima rodada será a nossa ultima rodada de negociações!\n");
}
} system("tput reset");
}while(!para);
} break;
case '3': {
printf("******************\n");
printf("ENVIO DE RELATORIO\n");
printf("******************\n");
printf("\n");
for(num=1;num<=MAXPRODUTS;num++)
mostrar(&num);
salvar(&num);
} break;
}
} fclose(file);
}
Estou necessitando com urgencia a ajuda de um progamador com experiencia boa...tenho um problema com um tp da minha facudade.Editei o arquivo e quando vou executar em determinado campo do progama(venda de produtos),o programa avisa sobre falha de segmentação! (no codigo se localiza em um swich, case '2'.) creio eu que deve ser algum problema na manipulação de membros da estrutura.codigo abaixo
Agradeço por qualquer tipo de ajuda.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define TAMANMAX 20
#define MAXPRODUTS 5
#define RANDOM 4
#define RODMAX 10
#define LIM 9
#define sim 1
#define nao 0
#define P1 0.1
#define P2 0.2
#define P3 0.3
#define P4 0.4
#define P5 0.5
struct produto{
char produto[TAMANMAX] ;
int codigo;
float preco;
int desp;
}pdr[MAXPRODUTS];
void insert_pdt(int *i){
printf("CADASTRAMENTO\n");
printf("--------------\n");
printf("Nome do produto :"); scanf("%s", pdr[*i].produto);
printf("Codigo do produto :"); scanf("%d", &pdr[*i].codigo);
printf("Valor do produto :"); scanf("%f", &pdr[*i].preco);
printf("Desposição em estoque:");scanf("%d", &pdr[*i].desp);
++i;
}
void mostrar(int *j){
int i;
for(i=0; i<*j; i++){
printf("\n***PRODUTOS***\n");
if(*pdr[i].produto) printf("NUM 1 - Produto: %5s\n", pdr[i].produto);
if(pdr[i].codigo) printf("NUM 2 -Codigo: %5d\n", pdr[i].codigo);
if(pdr[i].preco) printf("NUM 3 - Preço: %5f\n", pdr[i].preco);
if(pdr[i].desp) printf("NUM 4 - Desposição: %5d\n", pdr[i].desp);
}
printf("***Pressione qualquer tecla para continuar***\n");
}
void salvar(int *j){
int i;
FILE *fp;
char progn[TAMANMAX];
printf("Insira um nome para o arquivo: ");
scanf("%s", progn);
strcat(progn,".txt");
if((fp = fopen (progn,"w"))==NULL){
printf("IMPOSSIVEL ABRIR O ARQUIVO : %s\n\a",progn);
exit(1);
}
for(i=0; i<*j; i++){
if(*pdr[i].produto) fprintf(fp, "Produto: %5s\n", pdr[i].produto);
if(pdr[i].codigo) fprintf(fp, "Codigo %5d\n", pdr[i].codigo);
if(pdr[i].preco) fprintf(fp, "Preço %5f\n", pdr[i].preco);
if(pdr[i].desp) fprintf(fp, "Desposição %5d\n", pdr[i].desp);
}
fclose(fp);
}
float desc(float val){
int enter;
float res, prctd;
srand(time(NULL));
enter = rand()%RANDOM;
if(enter == 0)
prctd = P1;
else if(enter == 1){
prctd = P2;
}
else if(enter == 2){
prctd = P3;
}
else if(enter == 3){
prctd = P4;
}
else if(enter == 4){
prctd = P5;
}
res = val*prctd;
return res;
}
main (){
FILE *file;
char opcao, opcad, continua, escolha,arqnom[TAMANMAX];
int cad, p, i,lvenda, j, num, para;
float valorp=0;
while (1){
printf(" ******************************************\n");
printf(" CORDAS DA ALEGRIA EQUIPAMENTOS DE SOM LTDA\n");
printf(" ******************************************\n");
printf("\n");
printf("SEJA BEM VINDO!\n");
printf("Voce esta sendo atendido pelo nosso servidor eletronico ALPHA12\n");
printf("\n");
printf("Selecione uma das opções abaixo: ");
printf("\n");
do{
printf("Selecione um dos campos para navegar\n");
printf("\n");
printf("TECLE 1 ou 2 ou 3\n");
printf("\n");
printf("\t\t*****************************\n");
printf("\t\t1 - Cadastramento de produtos\n\t\t2 - Compra de produto\n\t\t3 - Envio de Relatorios\n");
printf("\t\t*****************************\n");
printf("\n");
scanf("%c", &opcao);
printf("\n");
if((opcao!='1')&&(opcao!='2')&&(opcao!='3')){
printf("Opção incorreta\nFavor Inserir uma opção correta\n");
}
}while((opcao!='1')&&(opcao!='2')&&(opcao!='3'));
switch(opcao){
case '1': {
do{
printf("*************************\n");
printf("CADASTRAMENTO DE PRODUTOS\n");
printf("*************************\n");
printf("\n");
printf("TECLE M ou C ou S\n");
printf("\t\tM - Mostrar produtos cadastrados\n");
printf("\t\tC - Cadastramento de produtos\n");
printf("\t\tS - Salvar produtos cadastrados\n");
printf("\n");
scanf("%c", &opcad);
printf("\n");
if((opcad!='M')&&(opcad!='C')&&(opcad!='S')){
printf("Opção incorreta\nFavor Inserir uma opção correta\n");
}
if(opcad == 'M'){
printf("*****************\n");
printf("Lista de produtos\n");
printf("*****************\n");
printf("\n");
for(i=1;i<=MAXPRODUTS;i++)
mostrar(&i);
}
else if(opcad == 'C'){
printf("*************\n");
printf("Cadastramento\n");
printf("*************\n");
printf("\n");
for(cad=1;cad<=5;cad++)
insert_pdt(&cad);
}
else if(opcad == 'S'){
printf("SALVANDO O CADASTRAMENTO\n");
salvar(&i);
}
}while((opcad!='A')&&(opcad!='B')&&(opcad!='C'));
system("tput reset");
} break;
case '2' : {
printf("Insira um nome para o arquivo que ira enviar o relatorio de vendas\n");
scanf("%s", arqnom);
strcat(arqnom,".txt");
if((file = fopen(arqnom, "w"))==NULL){
printf("Impossivel abrir o arquivo %s\n",arqnom);
exit(2);
}
printf("*******************\n");
printf("NEGOCIAÇÃO E VENDAS\n");
printf("*******************\n");
printf("\n");
printf("Nossos pdr\n");
for(lvenda=0;lvenda<=MAXPRODUTS;lvenda++){
mostrar(&lvenda);
}
printf("Selecione um dos pdr para comprar\n");
scanf("%d", &p);
printf("TECLE UM NUMERO DE 1 A 5\n");
do{
for(j=1;j<=RODMAX;j++){
printf("%dº rodada de negociação\n", j);
fprintf(file, "%dº rodada de negociação\n", j);
printf("Por favor digite o valor que voce deseja comprar o produto\n");
fprintf(file, "Por favor digite o valor que voce deseja comprar o produto\n");
scanf("%f", valorp);
if (valorp >= (pdr[p].preco)) {
printf("%f é um bom preço!Negocio fechado!\n", valorp);
fprintf(file, "%f é um bom preço!Negocio fechado\n", valorp);
pdr[p].desp--;
exit(3);
}
else{
printf("Posso lhe vender por este preço %f\n", desc(valorp));
fprintf(file, "Posso lhe vender por este preço %f\n", desc(valorp));
printf("Deseja comprar por este preço?\n");
fprintf(file, "Deseja comprar por este preço?\n");
printf("Pressione ''s'' para sim e ''n'' para nao\n");
scanf("%c", &escolha);
escolha = getchar();
getchar();
if(escolha == 's'){
printf("Vendido pelo valor de %f\n", valorp);
fprintf(file, "Vendido pelo valor de %f\n", valorp);
pdr[p].desp--;
exit(4);
}
printf("Deseja continuar a negociar?\n");
fprintf(file, "Deseja continuar a negociar?\n");
printf("Digite ''s'' para sim e ''n''para nao\n");
scanf("%c", &continua);
continua = getchar();
getchar();
para = continua == 's' ? sim : nao;
if(j==LIM)
printf("A decima rodada será a nossa ultima rodada de negociações!\n");
}
} system("tput reset");
}while(!para);
} break;
case '3': {
printf("******************\n");
printf("ENVIO DE RELATORIO\n");
printf("******************\n");
printf("\n");
for(num=1;num<=MAXPRODUTS;num++)
mostrar(&num);
salvar(&num);
} break;
}
} fclose(file);
}