Ir ao conteúdo
  • Cadastre-se

Ajuda em ALGORITMO E ESTRUTURAS DE DADOS em C.


netobureco

Posts recomendados

O objetivo do projeto consiste no desenvolvimento de um programa, na linguagem C, que registre as marcas alcançadas nos treinos e mostre a classificação de largada dos pilotos de Fórmula 1.

Durante o treino dos pilotos de Fórmula 1, é registrado no sistema as marcas alcançadas por cada carro.

O treino definirá as posições de largada de cada piloto. Os carros deverão ser organizados de acordo com o melhor tempo obtido por cada piloto. Na primeira vez que o carro obtiver uma marca, deve ser colocado na ordem classificatória de acordo com o tempo. Serão possíveis diversas tentativas para o mesmo carro e, a cada nova tentativa, deve-se verificar se a marca foi melhor, o que pode levar o carro a uma posição mais à frente na classificação. Caso a marca não seja melhor, sua posição não deve ser modificada, porém, o resultado da volta deve ser armazenado. A quantidade de carros e suas respectivas marcas são desconhecidas.

Ao ser digitado o número do carro, aparecerão as marcas alcançadas por ele e será aguardado o comando para a geração randômica da nova marca alcançada (Figura 2).

Caso seja a primeira marca realizada do carro, esta informação será dada ao digitador (Figura 3).

Na tela deverá aparecer a classificação geral dos carros até o momento e será aguardado o número do carro que será registrada nova marca, conforme visto na figura 1.

Em seguida é gerada randomicamente a nova marca e é informada sua posição na classificação geral (Figura 4).

Ao ser digitado S, aparecerá a classificação geral, conforme figura 5:

A classificação deve ser atualizada instantaneamente, a cada nova marca superada.

Para a confecção deste trabalho, deve-se obrigatoriamente utilizar estruturas de dados adequadas (sugestão:lista dinâmica encadeada). Caso seja feito algum tipo de ordenação, apenas as ligações poderão ser alteradas.

-----------------------------------------------------------------------

Então galera, esse é o projeto, minha dúvida maior é a respeito de como, ordenar as marcas de um carro usando Lista duplamente encadeada. Tentei algumas maneiras, mas meu código ordena no máximo 3. lembrando que primeiro compara as minutos, se eles forem iguais, os segundos e se eles também forem iguais, compara os milésimos. Então peço a colaboração de todos vocês programadores, vale a minha aprovação nessa disciplina :). OBG!!

post-1033591-13884965184199_thumb.png

post-1033591-13884965184471_thumb.jpg

post-1033591-13884965184696_thumb.jpg

post-1033591-13884965185035_thumb.jpg

post-1033591-13884965185288_thumb.png

Link para o comentário
Compartilhar em outros sites

Mostre-nos o que já fez e suas dúvidas em relação ao código.


oid inserir_ordenado( sLista *M){
aux=(aux*)malloc (sizeof(aux)) ;
if(aux==NULL){

aux->minuto=mm ;
aux->segundo=ss ;
aux->milesimo=ms ;
aux->prox=NULL;
aux1=aux;
x=aux;
reuturn aux;
}else{
aux->minuto=mm ;
aux->segundo=ss ;
aux->milesimo=ms ;
aux1=prox=aux;
aux->prox=Null
aux1=aux;
do{
if(x->minuto > aux->minuto)
{
j=x->prox;
x->prox=aux->prox;
aux->prox=j;
x=aux;
}else
{
if(x->minuto == aux->minuto){
if(x->segundo > aux->segundo){
j=x->prox;
x->prox=aux->prox;
aux->prox=j;
x=aux;
return aux;
}else
{
if(x->segundo == aux->segundo){
if(x->milesimo == aux->milesimo){
j=x->prox;
x->prox=aux->prox;
aux->prox=j;
x=aux;
return aux;
}
}
}

ScreenBlack aqui é a função que eu bolei pra inserir ordenado os nós que contém as marcas dos carros, o problema que pelo teste de mesa ela ordena no máximo 3 nós, pois queria uma função que ordenasse N nós pois, eu não sei o numero de marcas que o usuário irá lançar, tendo essa minha lógica que precisa comparar os minutos, se forem iguais os segundos e assim por diante...

A cada marca inserida ela compara com as próxima se for menor o nó assume a primeira posição e assim sucessivamente, com as demais marcas.

Link para o comentário
Compartilhar em outros sites

Você precisará de um "while()" pra percorrer a lista e inserir o novo valor na posição correta.

Assim, não terá restrição pra tamanho de lista.

Montei um exemplo bem simples que insere na posição ordenada.


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

typedef struct sElemento
{
int minuto;
int segundo;
int milesimo;
struct sElemento *prox;
} Elemento;

// Cria uma estrutura com o novo tempo
Elemento* novo_tempo(int mm, int ss, int ms)
{
Elemento *novo = (Elemento *) malloc( sizeof(Elemento) );

novo->minuto = mm;
novo->segundo = ss;
novo->milesimo = ms;
novo->prox = NULL;

return novo;
}

void mostra(Elemento *lista)
{
while ( lista != NULL )
{
printf("Tempo: %d:%d:%d\n", lista->minuto, lista->segundo, lista->milesimo);
lista = lista->prox;
}
printf("\n");
}

// Recebe a lista original e o novo tempo, para ser inserido na ordem correta
Elemento* inserir_ordenado( Elemento *lista, Elemento *nTempo )
{

Elemento **aux = &lista;
int controle = 0;

if ( lista == NULL )
return nTempo;
else
{
while(1)
{
// Se o tempo for igual, mantem a lista inalterada
if ( nTempo->minuto == (*aux)->minuto && nTempo->segundo == (*aux)->segundo && nTempo->milesimo == (*aux)->milesimo )
{
break;
}
else
{
// Valida o milisegundo, caso o minuto e segundo sejam iguais
if ( nTempo->minuto == (*aux)->minuto && nTempo->segundo == (*aux)->segundo && nTempo->milesimo < (*aux)->milesimo )
{
nTempo->prox = *aux;
*aux = nTempo;
break;
}
else
{
// Valida o segundo, caso o minuto seja igual
if ( nTempo->minuto == (*aux)->minuto && nTempo->segundo < (*aux)->segundo )
{
nTempo->prox = *aux;
*aux = nTempo;
break;
}
else
{
// Valida o minuto
if ( nTempo->minuto < (*aux)->minuto )
{
nTempo->prox = *aux;
*aux = nTempo;
break;
}
else
{
// Insere o maior tempo no final da lista
if ( (*aux)->prox == NULL )
{
(*aux)->prox = nTempo;
break;
}
}
}

controle++;
}

aux = &(*aux)->prox;
}
}
}

// Variavel que controla o loop do while. Se encerrar com valor 0, então o novo tempo foi inserido na primeira posicao.
if ( controle == 0 )
lista = *aux;

return lista;
}

int main(void)
{

Elemento *lista = NULL;
Elemento *nTempo = NULL;

// Entradas estaticas - Trocar por leitura do teclado, caso queira fazer leitura externa
nTempo = novo_tempo(2,22,22);
lista = inserir_ordenado(lista, nTempo);
nTempo = novo_tempo(2,21,22);
lista = inserir_ordenado(lista, nTempo);
nTempo = novo_tempo(2,22,21);
lista = inserir_ordenado(lista, nTempo);
nTempo = novo_tempo(1,22,22);
lista = inserir_ordenado(lista, nTempo);

mostra(lista);

return 0;
}

Você vai precisar modificar pra conseguir fazer a ordenação a partir de registros que possuem mais de um tempo por piloto.

Espero que ajude.

Link para o comentário
Compartilhar em outros sites

Você precisará de um "while()" pra percorrer a lista e inserir o novo valor na posição correta.

Assim, não terá restrição pra tamanho de lista.

Montei um exemplo bem simples que insere na posição ordenada.


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

typedef struct sElemento
{
int minuto;
int segundo;
int milesimo;
struct sElemento *prox;
} Elemento;

// Cria uma estrutura com o novo tempo
Elemento* novo_tempo(int mm, int ss, int ms)
{
Elemento *novo = (Elemento *) malloc( sizeof(Elemento) );

novo->minuto = mm;
novo->segundo = ss;
novo->milesimo = ms;
novo->prox = NULL;

return novo;
}

void mostra(Elemento *lista)
{
while ( lista != NULL )
{
printf("Tempo: %d:%d:%d\n", lista->minuto, lista->segundo, lista->milesimo);
lista = lista->prox;
}
printf("\n");
}

// Recebe a lista original e o novo tempo, para ser inserido na ordem correta
Elemento* inserir_ordenado( Elemento *lista, Elemento *nTempo )
{

Elemento **aux = &lista;
int controle = 0;

if ( lista == NULL )
return nTempo;
else
{
while(1)
{
// Se o tempo for igual, mantem a lista inalterada
if ( nTempo->minuto == (*aux)->minuto && nTempo->segundo == (*aux)->segundo && nTempo->milesimo == (*aux)->milesimo )
{
break;
}
else
{
// Valida o milisegundo, caso o minuto e segundo sejam iguais
if ( nTempo->minuto == (*aux)->minuto && nTempo->segundo == (*aux)->segundo && nTempo->milesimo < (*aux)->milesimo )
{
nTempo->prox = *aux;
*aux = nTempo;
break;
}
else
{
// Valida o segundo, caso o minuto seja igual
if ( nTempo->minuto == (*aux)->minuto && nTempo->segundo < (*aux)->segundo )
{
nTempo->prox = *aux;
*aux = nTempo;
break;
}
else
{
// Valida o minuto
if ( nTempo->minuto < (*aux)->minuto )
{
nTempo->prox = *aux;
*aux = nTempo;
break;
}
else
{
// Insere o maior tempo no final da lista
if ( (*aux)->prox == NULL )
{
(*aux)->prox = nTempo;
break;
}
}
}

controle++;
}

aux = &(*aux)->prox;
}
}
}

// Variavel que controla o loop do while. Se encerrar com valor 0, então o novo tempo foi inserido na primeira posicao.
if ( controle == 0 )
lista = *aux;

return lista;
}

int main(void)
{

Elemento *lista = NULL;
Elemento *nTempo = NULL;

// Entradas estaticas - Trocar por leitura do teclado, caso queira fazer leitura externa
nTempo = novo_tempo(2,22,22);
lista = inserir_ordenado(lista, nTempo);
nTempo = novo_tempo(2,21,22);
lista = inserir_ordenado(lista, nTempo);
nTempo = novo_tempo(2,22,21);
lista = inserir_ordenado(lista, nTempo);
nTempo = novo_tempo(1,22,22);
lista = inserir_ordenado(lista, nTempo);

mostra(lista);

return 0;
}

Você vai precisar modificar pra conseguir fazer a ordenação a partir de registros que possuem mais de um tempo por piloto.

Espero que ajude.

valeu mesmo screenBlack, você entende muito de estruturas, e me salvo, vou fazer um teste de mesa e fazer essa modificação t++ !!! =D

Link para o comentário
Compartilhar em outros sites

ScreenBlack e demais usuários , estava desenvolvendo o meu projeto a base de sua função, porém não nela mais em outras partes estou com problemas. Alguém pode me explicar porque o meu código não esta funcionando??

a função de ordenar as marcas funcionou porém meu programa deve retornar a melhor marca do carro para a lista do carro, onde na lista ele terá que ordenar de novo as melhores marcas de cada carro e montar a classificação geral, outro problema é que o usuário pode escolher um carro aleatório e colocar novas marcas, fazendo com que a classificação atualize constantimente.

Fiz um Menu que da ideia do que meu programa precisa ficar, e todas as funções. basta agora é ele funcionar. Conto com a ajuda de todos pois esse tanto de ponteiro acaba confundindo... :confused::confused:

Meu programa :

[


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

typedef struct sElemento
{
int minuto;
int segundo;
int milesimo;
struct sElemento *prox;
} Elemento;
// Estrutura Da lista de Carros
typedef struct dadoLDDE
{
int carro_num;
Elemento *marca;
struct dadoLDDE *prox;
}sLDDE;

classifica_ordenado() ;

// Cria uma estrutura com o novo tempo
Elemento* novo_tempo(int mm, int ss, int ms)
{
Elemento *novo = (Elemento *) malloc( sizeof(Elemento) );

novo->minuto = mm;
novo->segundo = ss;
novo->milesimo = ms;
novo->prox = NULL;

return novo;
}

random ( Elemento * L){
int mm,ss,ms;
mm = rand() % 4;
ss = rand() % 60;
ms = rand() % 60;
novo_tempo(mm,ss,ms);
printf("%d:%d:%d\n ",mm,ss,ms);
}

Elemento* inserir_ordenado( Elemento *lista, Elemento *nTempo )
{

Elemento **aux = &lista;
int controle = 0;

if ( lista == NULL )
return nTempo;
else
{
while(1)
{
// Se o tempo for igual, mantem a lista inalterada
if ( nTempo->minuto == (*aux)->minuto && nTempo->segundo == (*aux)->segundo && nTempo->milesimo == (*aux)->milesimo )
{
break;
}
else
{
// Valida o milisegundo, caso o minuto e segundo sejam iguais
if ( nTempo->minuto == (*aux)->minuto && nTempo->segundo == (*aux)->segundo && nTempo->milesimo < (*aux)->milesimo )
{
nTempo->prox = *aux;
*aux = nTempo;
break;
}
else
{
// Valida o segundo, caso o minuto seja igual
if ( nTempo->minuto == (*aux)->minuto && nTempo->segundo < (*aux)->segundo )
{
nTempo->prox = *aux;
*aux = nTempo;
break;
}
else
{
// Valida o minuto
if ( nTempo->minuto < (*aux)->minuto )
{
nTempo->prox = *aux;
*aux = nTempo;
break;
}
else
{
// Insere o maior tempo no final da lista
if ( (*aux)->prox == NULL )
{
(*aux)->prox = nTempo;
break;
}
}
}

controle++;
}

aux = &(*aux)->prox;
}
}
}

// Variavel que controla o loop do while. Se encerrar com valor 0, então o novo tempo foi inserido na primeira posicao.
if ( controle == 0 )
lista = *aux;

return lista;
}
// Função para ordenar a classificação dos carros
sLDDE* ordenado_classifica ( sLDDE *lista,Elemento * L)
{

sLDDE aux = lista->prox;
int controle = 0;

if ( lista == NULL )
return lista;
else
{
while(1)
{
// Se o tempo for igual, mantem a lista inalterada
if ( lista->marca->minuto == aux->marca->minuto && lista->marca->segundo == aux->marca->segundo && lista->marca->milesimo == aux->marca->milesimo)
{
break;
}
else
{
// Valida o milisegundo, caso o minuto e segundo sejam iguais
if (lista->marca->minuto == aux->marca->minuto && lista->marca->segundo == aux->marca->segundo && lista->marca->milesimo > aux->marca->milesimo)
{
{
marca->prox = aux;
aux = lista;
break;
}
else
{
// Valida o segundo, caso o minuto seja igual
if ( lista->marca->minuto == aux->marca->minuto && lista->marca->segundo > aux->marca->segundo )
{ )
{
marca->prox = aux;
aux = lista;
break;
}
else
{
// Valida o minuto
if ( ista->marca->minuto > aux->marca->minuto)
{
marca->prox = aux;
aux = lista;
break;
}
else
{
// Insere o maior tempo no final da lista
if ( aux->marca->prox == NULL )
{
marca->prox = aux;
break;
}
}
}

controle++;
}

aux = aux->marca->prox;
}
}
}

// Variavel que controla o loop do while. Se encerrar com valor 0, então o novo tempo foi inserido na primeira posicao.
if ( controle == 0 )
lista = *aux;

return lista;
}
//função para inserir as marcas nos carros
void *inserir_marca(sLDDE **carronum, Elemento **lista, Elemento **nTempo)
{
char op;
Elemento * lista1;
int mm,ss,ms;

printf("\nApete I para inserir o tempo percorrido pelo carro ou R para gerar uma marca randomica.\n");
do{
scanf("%c", &op);
if(op == 'I')
{
printf("Digite o minuto, segundo e milesimo percorrido pelo carro.");
scanf("%d%d%d", &mm , &ss, &ms);
*nTempo= novo_tempo(mm,ss,ms);
lista1= inserir_ordenado(*lista, *nTempo);
return(lista1);
} else {
//função randomica para gerar uma marca automaticamente
if(op == 'R')
{
random(&lista);
lista1 = inserir_ordenado(*lista, *nTempo);
return(lista1);
}

if(op != 'I' && op!= 'R')

printf("\n Essa opcao nao existe, caso queira inserir o tempo percorrido aperte I caso queira gerar uma marca randomica aperte R.\n");
}
}while(op != 'I' && op!= 'R');
}
// Função Para Alocar os carros
sLDDE* carro(Elemento *lista, Elemento *nTempo)
{
int num;
sLDDE *carronum;
carronum = (sLDDE *) malloc( sizeof(sLDDE) );
char op,op1;
printf("Entre com o numero do carro: ");
scanf("%d", &num);
carronum->carro_num = num;
carronum->ant = NULL;
carronum->prox = NULL;
carronum->marca= inserir_marca(&carronum,&lista,&nTempo);

printf("Deseja inserir uma nova marca para o carro? ");
printf("\nS - Sim\n");
printf("N - Nao\n");
printf("M - Para voltar ao Menu\n");
scanf("%c", &op);
if(op == 'S')
inserir_marca(&carronum,&lista,&nTempo);
do{
if(op == 'N')
{
printf("Digite C para inserir um novo carro e M para voltar ao Menu.");
scanf("%c", &op1);
if(op1 == 'C')
carro(&lista, &nTempo);
else{
if(op1 == 'M'){}

// menu(&carro);


else if(op1!= 'C' && op1 != 'R')
printf("Essa opcao não existe");
}
}

} while(op1 !='C' && op1 !='M');
if(op =='M'){}

//menu(&carro);

return carronum;
}


// função para mostrar as marcas de cada carro
void mostra(Elemento *lista)
{
while ( lista != NULL )
{
printf("Tempo: %d:%d:%d\n", lista->minuto, lista->segundo, lista->milesimo);
lista = lista->prox;
}
printf("\n");
}

// Recebe a lista original e o novo tempo, para ser inserido na ordem correta

void menu(sLDDE *carro){

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

typedef struct sElemento
{
int minuto;
int segundo;
int milesimo;
struct sElemento *prox;
} Elemento;
// Estrutura Da lista de Carros
typedef struct dadoLDDE
{
int carro_num;
Elemento *marca;
struct dadoLDDE *prox;
}sLDDE;

// Cria uma estrutura com o novo tempo
Elemento* novo_tempo(int mm, int ss, int ms)
{
Elemento *novo = (Elemento *) malloc( sizeof(Elemento) );

novo->minuto = mm;
novo->segundo = ss;
novo->milesimo = ms;
novo->prox = NULL;

return novo;
}

random ( Elemento * L){
int mm,ss,ms;
mm = rand() % 4;
ss = rand() % 60;
ms = rand() % 60;
novo_tempo(mm,ss,ms);
printf("%d:%d:%d\n ",mm,ss,ms);
}

Elemento* inserir_ordenado( Elemento *lista, Elemento *nTempo )
{

Elemento **aux = &lista;
int controle = 0;

if ( lista == NULL )
return nTempo;
else
{
while(1)
{
// Se o tempo for igual, mantem a lista inalterada
if ( nTempo->minuto == (*aux)->minuto && nTempo->segundo == (*aux)->segundo && nTempo->milesimo == (*aux)->milesimo )
{
break;
}
else
{
// Valida o milisegundo, caso o minuto e segundo sejam iguais
if ( nTempo->minuto == (*aux)->minuto && nTempo->segundo == (*aux)->segundo && nTempo->milesimo < (*aux)->milesimo )
{
nTempo->prox = *aux;
*aux = nTempo;
break;
}
else
{
// Valida o segundo, caso o minuto seja igual
if ( nTempo->minuto == (*aux)->minuto && nTempo->segundo < (*aux)->segundo )
{
nTempo->prox = *aux;
*aux = nTempo;
break;
}
else
{
// Valida o minuto
if ( nTempo->minuto < (*aux)->minuto )
{
nTempo->prox = *aux;
*aux = nTempo;
break;
}
else
{
// Insere o maior tempo no final da lista
if ( (*aux)->prox == NULL )
{
(*aux)->prox = nTempo;
break;
}
}
}

controle++;
}

aux = &(*aux)->prox;
}
}
}

// Variavel que controla o loop do while. Se encerrar com valor 0, então o novo tempo foi inserido na primeira posicao.
if ( controle == 0 )
lista = *aux;

return lista;
}
// Função para ordenar a classificação dos carros
sLDDE* ordenado_classifica ( sLDDE *lista,Elemento * L){

sLDDE aux = lista->prox;
int controle = 0;

if ( lista == NULL )
return lista;
else
{
while(1)
{
// Se o tempo for igual, mantem a lista inalterada
if ( lista->marca->minuto == aux->marca->minuto && lista->marca->segundo == aux->marca->segundo && lista->marca->milesimo == aux->marca->milesimo)
{
break;
}
else
{
// Valida o milisegundo, caso o minuto e segundo sejam iguais
if (lista->marca->minuto == aux->marca->minuto && lista->marca->segundo == aux->marca->segundo && lista->marca->milesimo > aux->marca->milesimo)
{
{
marca->prox = aux;
aux = lista;
break;
}
else
{
// Valida o segundo, caso o minuto seja igual
if ( lista->marca->minuto == aux->marca->minuto && lista->marca->segundo > aux->marca->segundo )
{ )
{
marca->prox = aux;
aux = lista;
break;
}
else
{
// Valida o minuto
if ( ista->marca->minuto > aux->marca->minuto)
{
marca->prox = aux;
aux = lista;
break;
}
else
{
// Insere o maior tempo no final da lista
if ( aux->marca->prox == NULL )
{
marca->prox = aux;
break;
}
}
}

controle++;
}

aux = aux->marca->prox;
}
}
}

// Variavel que controla o loop do while. Se encerrar com valor 0, então o novo tempo foi inserido na primeira posicao.
if ( controle == 0 )
lista = *aux;

return lista;
}
}
}
//função para inserir as marcas nos carros
void *inserir_marca(sLDDE **carronum, Elemento **lista, Elemento **nTempo)
{
char op;
Elemento * lista1;
int mm,ss,ms;

printf("\nApete I para inserir o tempo percorrido pelo carro ou R para gerar uma marca randomica.\n");
do{
scanf("%c", &op);
if(op == 'I')
{
printf("Digite o minuto, segundo e milesimo percorrido pelo carro.");
scanf("%d%d%d", &mm , &ss, &ms);
*nTempo= novo_tempo(mm,ss,ms);
lista1= inserir_ordenado(*lista, *nTempo);
return(lista1);
} else {
//função randomica para gerar uma marca automaticamente
if(op == 'R')
{
random(&lista);
lista1 = inserir_ordenado(*lista, *nTempo);
return(lista1);
}

if(op != 'I' && op!= 'R')

printf("\n Essa opcao nao existe, caso queira inserir o tempo percorrido aperte I caso queira gerar uma marca randomica aperte R.\n");
}
}while(op != 'I' && op!= 'R');
}
// Função Para Alocar os carros
sLDDE* carro(Elemento *lista, Elemento *nTempo)
{
int num;
sLDDE *carronum;
carronum = (sLDDE *) malloc( sizeof(sLDDE) );
char op,op1;
printf("Entre com o numero do carro: ");
scanf("%d", &num);
carronum->carro_num = num;
carronum->ant = NULL;
carronum->prox = NULL;
carronum->marca= inserir_marca(&carronum,&lista,&nTempo);

printf("Deseja inserir uma nova marca para o carro? ");
printf("\nS - Sim\n");
printf("N - Nao\n");
printf("M - Para voltar ao Menu\n");
scanf("%c", &op);
if(op == 'S')
inserir_marca(&carronum,&lista,&nTempo);
do{
if(op == 'N')
{
printf("Digite C para inserir um novo carro e M para voltar ao Menu.");
scanf("%c", &op1);
if(op1 == 'C')
carro(&lista, &nTempo);
else{
if(op1 == 'M'){}

// menu(&carro);


else if(op1!= 'C' && op1 != 'R')
printf("Essa opcao não existe");
}
}

} while(op1 !='C' && op1 !='M');
if(op =='M'){}

//menu(&carro);

return carronum;
}
//pesquisa
sLDDE* pesq(sLDDE *Carro, int carro_num){
while (Carro != NULL && Carro->vlr != dadoPesq){

Carro = Carro->prox;
}
printf("Carro %d :",carro_num);
mostra(&lista);
return Carro;
}
// função para mostrar as marcas de cada carro
void mostra(Elemento *lista)
{
while ( lista != NULL )
{
printf("Tempo: %d:%d:%d\n", lista->minuto, lista->segundo, lista->milesimo);
lista = lista->prox;
}
printf("\n");
}

// mostrar classificação Geral
void mostraclassificacao(sLDDE*lista1){
while ( lista1 != NULL )
{

printf("\nCarro %d",lista1->carro_num);
lista1= lista1->prox;
}
printf("\n");
}

// Menu geral do programa
void menu(sLDDE *carro){

char op;
system("cls");
do{
printf("\n----*** SIMULADOR DE CORRIDA ***----\n");
//inserir carro
prinf("\n[ I ] Inserir carro");
// inserir marca para algum carro que o usuário ja criou
printf("\n[ M ] Inserir Marca");
printf("\n[ P ] Pesquisa classificação do carro");
printf("\n[ S ] Sair do programa com a classificao geral");

op = toupper(getch());
switch (op)
{
case 'I' : carro(&lista, &nTempo); break;
case 'M' : inserir_marca(&carronum,&lista,&nTempo);break;
case 'P' : pesq(&Carro,carro_num);break;
case 'S' : mostraclassificacao(lista1);
system("pause");
exit(1);
break;

}

}while(op== 'S');
}


int main(void)
{

Elemento *lista = NULL;
Elemento *nTempo = NULL;
sLDDE * Carro = NULL;
//chama a funçao de ordenação dos carros
Carro = carro(&lista, &nTempo);
//chama a função do Menu
menu(&carro);

return 0;
system("pause");
}
#include <stdlib.h>

Link para o comentário
Compartilhar em outros sites

Certo. Vamos por partes.

Vou relatar aqui os erros de sintaxe que encontrei. Solucionando eles, ficará mais fácil pra encontrar os possíveis erros de lógica.

1) Linha 36: Função não possui tipo de retorno. Acredito que seja "void":


void random(Elemento *L)

2) Linha 118: Variável estática recebendo um ponteiro. Mudar para:


sLDDE *aux = lista->prox;

3) Linha 136: Parece estar sobrando "{".

4) Linhas 138, 148, 157 e 166: Está tentando atribuir o valor de uma variável do tipo sLDDE numa do tipo Elemento.

5) Linha 147: "{ )" Parece estar sobrando, podendo retirar.

6) Linha 155: "ista" não declarada. Corrigir para "lista".

7) Linha 175: Atribuição de um valor do tipo Elemento numa variável do tipo sLDDE.

8) Linha 182: variável "aux" já é um ponteiro, não precisa do "*".


lista = aux;

9) Linha 207: Variável "lista" é um ponteiro pra ponteiro, com o "&" na frente, você está tornando ponteiro pra ponteiro pra ponteiro (sim, 3 ponteiros "***"), e a função "random()" recebe apenas um ponteiro.


random(*lista);

10) ATENÇÃO: Da linha 279 em diante, parece que o código foi duplicado com a parte de cima.

11) Função "ordenado_classifica()", estão sobrando os dois últimos "}".

12) Na função "carro()", não existe o elemento "carronum->ant" dentro da estrutura sLDDE.

13) Na função "pesq()", não possui o elemento "Carro->vlr" dentra da estrutura sLDDE.

14) Na função "pesq()", faltou declarar a variável "dadoPesq".

15) Na função "pesq()", é chamada a função "mostra()", porém, a variável passada pra ela não foi declarada na rotina.

16) Na função "menu()", as variáveis "lista", "Carro" e "lista1" não foram declaradas.

17) Na função "menu()", corrigir o nome da função "prinf()" para "printf()".

18) Na função "main()", os parâmetros das funções "carro()" e "menu()", não precisam do "&", pois já são ponteiros.

19) Incluir a biblioteca "ctype.h":


#include <ctype.h>

Link para o comentário
Compartilhar em outros sites

Consegui arrumar todos os erros de códigos, na verdade tinha enviado o Arquivo de rascunho do projeto aqui, mais obrigado por ter mostrado esses erros, tirando o Menu q deixei m comentário, porque não esta rodando, Ele esta com Algum problema Em gerar outra marca de um carro em diante agora o problema é logico mesmo !!!

Agradeço: ScreenBlanck :)


#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>

typedef struct sElemento
{
int minuto;
int segundo;
int milesimo;
struct sElemento *prox;
} Elemento;
// Estrutura Da lista de Carros
typedef struct dadoLDDE
{
int carro_num;
Elemento *marca;
struct dadoLDDE *prox;
}sLDDE;

// Cria uma estrutura com o novo tempo
Elemento* novo_tempo(int mm, int ss, int ms)
{
Elemento *novo = (Elemento *) malloc( sizeof(Elemento) );

novo->minuto = mm;
novo->segundo = ss;
novo->milesimo = ms;
novo->prox = NULL;

return novo;
}

Elemento* inserir_ordenado( Elemento *lista, Elemento *nTempo )
{

Elemento **aux = &lista;
int controle = 0;

if ( lista == NULL )
return nTempo;
else
{
while(1)
{
// Se o tempo for igual, mantem a lista inalterada
if ( nTempo->minuto == (*aux)->minuto && nTempo->segundo == (*aux)->segundo && nTempo->milesimo == (*aux)->milesimo )
{
break;
}
else
{
// Valida o milisegundo, caso o minuto e segundo sejam iguais
if ( nTempo->minuto == (*aux)->minuto && nTempo->segundo == (*aux)->segundo && nTempo->milesimo < (*aux)->milesimo )
{
nTempo->prox = *aux;
*aux = nTempo;
break;
}
else
{
// Valida o segundo, caso o minuto seja igual
if ( nTempo->minuto == (*aux)->minuto && nTempo->segundo < (*aux)->segundo )
{
nTempo->prox = *aux;
*aux = nTempo;
break;
}
else
{
// Valida o minuto
if ( nTempo->minuto < (*aux)->minuto )
{
nTempo->prox = *aux;
*aux = nTempo;
break;
}
else
{
// Insere o maior tempo no final da lista
if ( (*aux)->prox == NULL )
{
(*aux)->prox = nTempo;
break;
}
}
}

controle++;
}

aux = &(*aux)->prox;
}
}
}

// Variavel que controla o loop do while. Se encerrar com valor 0, então o novo tempo foi inserido na primeira posicao.
if ( controle == 0 )
lista = *aux;

return lista;
}
// Função para ordenar a classificação dos carros
sLDDE* ordenado_classifica ( sLDDE *lista){

sLDDE *aux = lista->prox;
int controle = 0;

if ( lista == NULL )
return lista;
else
{
while(1)
{
// Se o tempo for igual, mantem a lista inalterada
if ( lista->marca->minuto == aux->marca->minuto && lista->marca->segundo == aux->marca->segundo && lista->marca->milesimo == aux->marca->milesimo)
{
break;
}
else
{
// Valida o milisegundo, caso o minuto e segundo sejam iguais
if (lista->marca->minuto == aux->marca->minuto && lista->marca->segundo == aux->marca->segundo && lista->marca->milesimo > aux->marca->milesimo)

{
//
lista->prox = aux->prox;
aux->prox = lista;
break;
}
else
{
// Valida o segundo, caso o minuto seja igual
if ( lista->marca->minuto == aux->marca->minuto && lista->marca->segundo > aux->marca->segundo )

{
lista->prox = aux->prox;
aux->prox = lista;
break;
}
else
{
// Valida o minuto
if ( lista->marca->minuto > aux->marca->minuto)
{
lista->prox = aux->prox;
aux->prox = lista;
break;
}
else
{
// Insere o maior tempo no final da lista
if ( lista->prox == NULL )
{
lista->prox = aux;
break;
}
}
}

controle++;
}

aux->prox = lista->prox;

}
}

// Variavel que controla o loop do while. Se encerrar com valor 0, então o novo tempo foi inserido na primeira posicao.
if ( controle == 0 )
lista = aux;

return lista;
}
}

//função para inserir as marcas nos carros
void *inserir_marca(sLDDE **carronum, Elemento **lista, Elemento **nTempo)
{
char op;
Elemento * lista1;
int mm,ss,ms;

printf("\nApete I para inserir o tempo percorrido pelo carro ou R para gerar uma marca randomica.\n");
do{
scanf("%c", &op);
if(op == 'I')
{
printf("Digite o minuto, segundo e milesimo percorrido pelo carro.");
scanf("%d%d%d", &mm , &ss, &ms);
*nTempo= novo_tempo(mm,ss,ms);
lista1= inserir_ordenado(*lista, *nTempo);
return(lista1);
} else {
//função randomica para gerar uma marca automaticamente
if(op == 'R')
{

mm = rand() % 4;
ss = rand() % 60;
ms = rand() % 60;
novo_tempo(mm,ss,ms);
lista1 = inserir_ordenado(*lista, *nTempo);
return(lista1);
}

if(op != 'I' && op!= 'R')

printf("\n Essa opcao nao existe, caso queira inserir o tempo percorrido aperte I caso queira gerar uma marca randomica aperte R.\n");
}
}while(op != 'I' && op!= 'R');
}
// Função Para Alocar os carros
sLDDE* carro(Elemento *lista, Elemento *nTempo)
{
int num;
sLDDE *carronum;
carronum = (sLDDE *) malloc( sizeof(sLDDE) );
char op,op1;
printf("Entre com o numero do carro: ");
scanf("%d", &num);
carronum->carro_num = num;
carronum->prox = NULL;
carronum->marca= inserir_marca(&carronum,&lista,&nTempo);

printf("Deseja inserir uma nova marca para o carro? ");
printf("\nS - Sim\n");
printf("N - Nao\n");
printf("M - Para voltar ao Menu\n");
scanf("%c", &op);
if(op == 'S')
inserir_marca(&carronum,&lista,&nTempo);
do{
if(op == 'N')
{
printf("Digite C para inserir um novo carro e M para voltar ao Menu.");
scanf("%c", &op1);
if(op1 == 'C')
(&lista, &nTempo);
else{
if(op1 == 'M'){


//menu(&carro);

}
else if(op1!= 'C' && op1 != 'R')
printf("Essa opcao não existe");
}
}

} while(op1 !='C' && op1 !='M');
if(op =='M')
{
//menu(&carro);
}
return (carronum);

//return(nTempo);
}

void mostra(Elemento *lista)
{
while ( lista != NULL )
{
printf("Tempo: %d:%d:%d\n", lista->minuto, lista->segundo, lista->milesimo);
lista = lista->prox;
}
printf("\n");
}
//pesquisa
sLDDE* pesq(sLDDE *Carro, int carro_num, Elemento *lista){
int dadoPesq= carro_num;
int receber_mostra;
while (Carro != NULL && Carro->carro_num != dadoPesq)
{

Carro = Carro->prox;
}
printf("Carro %d :",carro_num);
mostra(lista);
return Carro;
}

// mostrar classificação Geral
void mostraclassificacao(sLDDE*lista1){
while ( lista1 != NULL )
{

printf("\nCarro %d",lista1->carro_num);
lista1= lista1->prox;
}
printf("\n");
}

// Menu geral do programa
/*void menu(sLDDE *carro,Elemento *lista, Elemento *nTempo, sLDDE *carro_num){

char op;
system("cls");
do{
printf("\n----*** SIMULADOR DE CORRIDA ***----\n");
//inserir carro
prinf("\n[ I ] Inserir carro");
// inserir marca para algum carro que o usuário ja criou
printf("\n[ M ] Inserir Marca");
printf("\n[ P ] Pesquisa classificação do carro");
printf("\n[ S ] Sair do programa com a classificao geral");

op = toupper(getch());
switch (op)
{
case 'I' : carro(&lista, &nTempo); break;
case 'M' : inserir_marca(&carronum,&lista,&nTempo);break;
case 'P' : pesq(&Carro,carro_num);break;
case 'S' : mostraclassificacao(lista1);
system("pause");
exit(1);
break;

}

}while(op== 'S');
}

*/
int main(void)
{

Elemento *lista = NULL;
Elemento *nTempo = NULL;
sLDDE * Carro = NULL;
//chama a funçao de ordenação dos carros
Carro = carro(lista, nTempo);
//chama a função do Menu
//menu(carro);

return 0;
system("pause");
}



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