Ir ao conteúdo
  • Cadastre-se

Segmetation Fault


Bruxo2

Posts recomendados

Boa noite gente, eu to estudando pra uma prova de Estrutura de Dados, mas não consigo fazer funcionar um código, ele dar o erro Segmentation Fault, alguém poderia me ajudar?

Os dois primeiros são os mais importantes, o erro dar no segundo código, na primeira função, já to há 1h trancado nisso =/

Segue abaixo o código:

#ifndef PRATICA01_H
#define PRATICA01_H

#ifdef __cplusplus
extern "C" {
#endif
#define NUM_ITENS 100

typedef struct item {
char* descricao;
int quantidade;
float preco;
} Item;

typedef struct lista {
Item* lista;
int tamanho;
} ListaItens;

int le_arquivo(char *c, ListaItens *lista);
int escreve_arquivo(char *c, ListaItens *lista);
void processa_reajuste(ListaItens *lista, float f);
void ordena_por_menor_preco(ListaItens *lista);
void ordena_por_maior_quantidade(ListaItens *lista);

#ifdef __cplusplus
}
#endif

#endif /* PRATICA01_H */


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



int le_arquivo(char* c, ListaItens* l){
FILE *fp;
char linha[250];
char *aux;
int i;
i=0;
if((fp = fopen(c,"r"))==NULL){
printf("Arquivo não encontrado");
exit(1);
}
fp = fopen(c,"r");

while(fgets(linha,sizeof(linha),fp)!=NULL){


Item produto;
printf("7");
aux = strtok(linha,";");

produto.descricao = (char *)malloc(strlen(aux)+1);

strcpy(produto.descricao,aux);

produto.quantidade = atoi(strtok (NULL,";"));

produto.preco = atof(strtok (NULL,";"));

l->lista[i] = produto;
i++;


}
fclose(fp);
return i;






}

int escreve_arquivo(char* c, ListaItens* itens){
int i =0;
FILE *fp;
fp = fopen(c,"w");
for(i=0;i<itens->tamanho;i++){



fprintf(fp,"%s;%d;%.2f\n",itens->lista[i].descricao,itens->lista[i].quantidade,itens->lista[i].preco);



}
fclose(fp);
return i;


}

void processa_reajuste(ListaItens* itens, float f){
int i =0;
for(i=0;i<itens->tamanho;i++){
/*Item it;
it = itens->lista[i];
it.preco = it.preco+((f/100.0)*it.preco);
itens->lista[i]=it;
Minha versão*/
itens->lista[i].preco*=(f/100)+1;
}


}

void ordena_por_menor_preco(ListaItens* itens){
int i =0;
int j =0;
Item it;
for(i=0;i<itens->tamanho;i++){
for(j=0;j<itens->tamanho;j++){
if(itens->lista[i].preco<itens->lista[j].preco){
it = itens->lista[j];
itens->lista[j] = itens->lista[i];
itens->lista[i] = it;
}
}


}

}

void ordena_por_maior_quantidade(ListaItens* itens){
int i =0;
int j =0;
Item it;
for(i=0;i<itens->tamanho;i++){
for(j=0;j<itens->tamanho;j++){
if(itens->lista[i].quantidade>itens->lista[j].quantidade){
it = itens->lista[j];
itens->lista[j] = itens->lista[i];
itens->lista[i] = it;
}
}


}

}

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

int main(int argc, char** argv) {
if (argc < 4 || argc > 5) {
printf("Erro: Numero de parametros invalido!\n");
printf("Sintaxe: main_p01 <nome_do_arquivo_de_entrada> <nome_do_arquivo_de_saida><percentual_de_reajuste> [-op | -o que]\n");
printf("opções:\n");
printf("-op = ordena por menor preco\n");
printf("-o que = ordena por maior quantidade\n");
return 1;
}
ListaItens itens;
float perc = atof(argv[3]);
if (argc == 4) {
int num = le_arquivo(argv[1], &itens);
if (num) {
itens.tamanho = num;
processa_reajuste(&itens, perc);
escreve_arquivo(argv[2], &itens);
} else {
printf("Erro: Nao foi possivel ler nenhum registro de item.\n");
return 1;
}
} if (argc == 5) {
if (strcmp(argv[4], "-op") == 0 || strcmp(argv[4], "-o que") == 0) {
int num = le_arquivo(argv[1], &itens);
if (num) {
itens.tamanho = num;
processa_reajuste(&itens, perc);
if (strcmp(argv[4], "-op") == 0) {
ordena_por_menor_preco(&itens);
} else if (strcmp(argv[4], "-o que") == 0) {
ordena_por_maior_quantidade(&itens);
}
escreve_arquivo(argv[2], &itens);
} else {
printf("Erro: Nao foi possivel ler nenhum registro de item.\n");
return 1;
}
} else {
printf("Erro: Opcao '%s' invalida!\n", argv[4]);
return 1;
}
}
return 0;
}

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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

APRENDA A MONTAR COMPUTADORES!

montagem2022-capa-peq.jpg

 

CLIQUE AQUI E BAIXE AGORA MESMO!