Ir ao conteúdo
  • Cadastre-se

C Programa só roda corretamente se eu colocar uma variável auxiliar para desbugar.


Posts recomendados

Gostaria de saber por que isso ocorre? 

int class(){
    float tempox[MAXP];
    float tempo_ordenado[MAXP];
    float aux;
    for(int i = 0; i < MAXP+1;i++){

        tempox[i] = piloto[i].tempo;
        tempo_ordenado[i] = piloto[i].tempo;
    }

    for(int i=0;i<MAXP+1;i++){
        for(int j=0;j<MAXP+1;j++){
            if(tempo_ordenado[i] < tempo_ordenado[j]){
                aux = tempo_ordenado[i];
                tempo_ordenado[i] = tempo_ordenado[j];
                tempo_ordenado[j] = aux;
            }
        }
    }
    for(int i=0;i<MAXP+1;i++){
        printf("\n%.2f", piloto[i].tempo);
    }

    printf("\n\n");
    for(int i=0;i<MAXP+1;i++){
        printf("\n%.2f", tempo_ordenado[i]);
    }
    printf("\n\n");


    printf("\n\n");

    for(int i=0;i<MAXP+1;i++){
        for(int j=0;j<MAXP+1;j++){
            if(tempo_ordenado[i] == piloto[j].tempo){
                printf("\n%d. %s", i, piloto[j].nome);
            }
        }
    }

}

dentro deste codigo, cujo objetivo é ordernar uma lista e escrevela como uma classificação, eu possuo tal funçao para exercer isso, porém para que ocorra certo, eu tenho que colocar aquela variavel tempox[], e citala no for, mesmo q eu n use ela pra mais nada, ai, o que acontece, se eu n coloco ela, a variavel tempo_ordenado nao recebe os valores corretos e faz o programa dar erro por completo... chega a ser difícil de explicar, mas meio que por algum motivo mistico, eu preciso ter aquela linha tempox[] = ...; no laço for para que tempo_ordenado não receba valores errados

Link para o post
Compartilhar em outros sites

@Felipe Rattowisk     apenas com essa função não tem jeito de testar ,  mas observei erros no seus loop's de ordenação ,  creio que  o primeiro for comece em zero e vai até enquanto for menor que MAXP , e nao +1 , e  o segundo loop também ,  e ainda nesse segundo ,  o loop  j  , comece em i+1    e vai até enquanto for menor que MAXP ,  e não +1 também , e  essa variável tempox[] , não vai fazer nenhuma diferença no código não , mas se você puder , poste o código todo , para vermos como está em que podemos ajudar .

  • Curtir 1
Link para o post
Compartilhar em outros sites

@devair1010 esse MAXP+1 eu inseri quando n sabia o motivo para o programa rodar errado, ja alterei pra como era antes. aquela variavel tempox[] é inutil mas sem ela, o programa n roda corretamente, pois naquele laço, sem ela, a variavel tempo_ordenado[] recebe os valores de forma estranha, por exemplo: ao invés de receber 5;10;15;20;25;30;35;40;45;50, ela recebe 50;10;15;20;25;30;35;40;45;45 sem motivo algum, e quando eu coloco o tempox[] antes pra receber esses valores errados, ela funciona.

 

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


#define MAXP 9
#define MAXV 4

struct corredores {
    char nome[100];
    float voltas[5];
    float tempo;
};
struct corredores piloto[MAXP];


int mediadavolta(){
    float medias[5];

    int index = 0;
    for(int i = 0; i<=MAXV;i++){
        medias[i] = 0;
        for(int j=0;j<=MAXP;j++){
            medias[i] += piloto[j].voltas[i];
        }
        medias[i] = medias[i]/5;
    }
    float aux = medias[MAXV];
    for(int i=0;i<=MAXV;i++){
        if(medias[i] < aux){
            aux = medias[i];
            index = i+1;
        }
    }

    printf("\n\nA volta com a media mais rapida foi a %d volta com %.2fs de media",index+1,aux);
}


int class(){
    float tempo[MAXP];
    float tempo_ordenado[MAXP];
    float aux;

    for(int i = 0; i <= MAXP;i++){
        //Professor, não entendi o por que o programa não roda corretamente sem essa linh:
        tempo[i] = piloto[i].tempo;
        //
        tempo_ordenado[i] = piloto[i].tempo;
    }

    for(int i=0;i<=MAXP;i++){
        for(int j=0;j<=MAXP;j++){
            if(tempo_ordenado[i] < tempo_ordenado[j]){
                aux = tempo_ordenado[i];
                tempo_ordenado[i] = tempo_ordenado[j];
                tempo_ordenado[j] = aux;
            }
        }
    }
    printf("\nCLASSIFICACAO: ");
    for(int i=0;i<=MAXP;i++){
        for(int j=0;j<=MAXP;j++){
            if(tempo_ordenado[i] == piloto[j].tempo){
                printf("\n%d. %s", i+1, piloto[j].nome);
            }
        }
    }

}


float menorvolta(){
    float valor = piloto[MAXP].voltas[MAXV];
    char pnome[100];
    for(int i =0; i<=MAXP;i++){
        for(int j=0;j<=MAXV;j++){
            if(piloto[i].voltas[j] < valor){
                valor = piloto[i].voltas[j];
                strcpy(pnome,piloto[i].nome);
            }
        }
    }
    printf("\nMelhor volta: %.2fs, pelo %s",valor,pnome);
    return 0;
}

int main(){
    for(int i=0;i<=MAXP;i++){
        printf("Nome do corredor: ");
        scanf("%s",&piloto[i].nome);
        for(int j=0;j<=MAXV; j++){
            printf("Volta %d: ",j+1);
            scanf("%f",&piloto[i].voltas[j]);
        }
        piloto[i].tempo = 0;
        for(int k=0;k<=MAXV;k++){
            piloto[i].tempo+=piloto[i].voltas[k];
        }
    }

    menorvolta();
    //classificacao();
    class();
    mediadavolta();
    return 0;
}

 

Link para o post
Compartilhar em outros sites

"Iteração em vetores" é o procedimento no qual se percorre os elementos contido nele... o número máximo de ciclos até o limite é igual o tamanho [do vetor] menos 1. Se a MAXP é o tamanho de um vetor então existem duas expressões a escolher PARA  'condição'  ITERAR segura:

 

Condição 1. i <= (MAXP - 1)

Condição 2. i < (MAXP)

 

escolha uma, faça o teste.

 

 

Link para o post
Compartilhar em outros sites

@Felipe Rattowisk      em Qual compilador você fez esse código , pois ele não funciona no visual studio , muitos erros .

1048994350_errosclas.thumb.jpg.b5009be27b2c17cbf45ab25875735b3a.jpg

então adaptei seu código , para que funcione , e descobri que esse caso que você disse , de dar erro , é por que você está inserindo inteiro no vetor float  , e modificando isso ,  essa função poderia ser assim  :

#define _CRT_SECURE_NO_WARNINGS
#define MAXP 5
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
    float tempo;
    char nome[20];
}p;
p piloto[5];
int classe();
int main()
{
    srand(time(NULL));
    float x;
    char nomes[5][20] = {"kiko","lolipop","juju","lopol","kolip"};                // nome dos pilotos
    for (int i = 0; i < 5; i++)
    {
        piloto[i].tempo = (float)(rand() % 100) / 100 + (float)(rand() % 500 + 1);//gera tempos com ponto decimal
        strcpy(piloto[i].nome, nomes[i]);                                         // atribui o tempo a esse piloto
    }
    classe();                                                                     // modifiquei class pois no VS não func
    return 0;
}
int classe() 
{
    float tempo_ordenado[MAXP];
    float aux;
    printf("transferindo dados do Tipo Float , de piloto.tempo\n");
    printf("para vetor do Tipo float ,  tempo_ordenado\n\n");
    for (int i = 0; i < MAXP; i++)
    {
        tempo_ordenado[i] = piloto[i].tempo;
        printf("  tempo_orenado[%2d] = %6.2f  ##  piloto[%2d].tempo = %6.2f\n",
                                        i,tempo_ordenado[i],i,piloto[i].tempo);
    }
    printf("\n");
    for (int i = 0; i < MAXP; i++)
    {
        for (int j = i+1; j < MAXP; j++)
        {
            if (tempo_ordenado[i] < tempo_ordenado[j])
            {
                aux = tempo_ordenado[i];
                tempo_ordenado[i] = tempo_ordenado[j];
                tempo_ordenado[j] = aux;  
            }
        }
    }
    printf("Tempos Originais\n");
    for (int i = 0; i < MAXP; i++)
    {
        printf("   %6.2f\n", piloto[i].tempo);
    }

    printf("\nTempos Ordenados\n");
    for (int i = 0; i < MAXP; i++) 
    {
        printf("   %6.2f\n", tempo_ordenado[i]);
    }
    printf("\nPilotos e seus Tempos Ordenados\n");
    for (int i = 0; i < MAXP; i++)
    {
        for (int j = 0; j < MAXP; j++)
        {
            if (tempo_ordenado[i] == piloto[j].tempo)
            {
                printf(" %3d. %s\n", i+1, piloto[j].nome);
            }
        }
    }
    return 0;
}

 

Link para o post
Compartilhar em outros sites

Olá

 

Seu programa tem muitos problemas :( 

 

Podia usar comentários para explicar o que pretende com cada coisa.

 

 

NUNCA (mas nunca mesmo) use variáveis globais se tiver opção. E em C geralmente há muitas. Isso é um desastre e torna impossível testar um programa sem perder uma eternidade. Qualquer m3rd@ em qualquer lugar do programa pode zoar uma variável global.

 

USE argumentos. Notou que suas funções não tem argumentos?  Veja:

 

    int         class();
    float       menorvolta();
    int         mediadavolta();

 

Pois é: qualquer bobagem que faça em uma delas afeta todo mundo. E testar vira um inferno porque não pode testar em separado.

 

Programas construídos em torno dos dados muitas vezes rodam certo já na primeira vez. 

 

Programas escritos desse modo que usou eventualmente dão certo. E pode demorar. E podem parecer certos por uns tempos até parar, porque é difícil (mesmo) testar as relações entre as funções e os dados porque não há isolamento.

 

Alguns problemas

  • não há comentários de nada, sequer do efeito das funções
  • variáveis globais
  • nomes não significativos
  • lógica misturada com exibição e digitação
  • interatividade num programa que não está pronto e podia muito bem passar sem isso
  • scanf() sem testar o retorno é muito ingênuo. Você tem um livro? Um apostila? Teve alguma aula sobre isso? scanf(), buffers, especificadores (aquelas coisinhas com % na frene no scanf()(), coisas assim?
  • sequer mostra os valores que leu para se certificar de que está usando os valores que imagina...
  • main() deve ser a primeira função de seu programa, se possivel em um arquivo separado
  • tem MAXV e MAXP pra todo lado mas tem voltas como float[5] ???
   for (int i = 0; i <= MAXP; i++) {
 

 

Isso acima é um mal sinal: de zero a MAXP são MAXP + 1, certo? Tem certeza de que era isso que queria? 
 

        //Professor, não entendi o por que o programa não roda corretamente sem essa linh:
        tempo[i] = piloto[i].tempo;
        //
        tempo_ordenado[i] = piloto[i].tempo;

 

e logo abaixo tem isso, sugerindo que precisa inventar algo para a posição ZERO

 

class()

 

Se entendi direito isso seria uma função para classificar os tempos dos pilotos, a tabela original em piloto.tempo... E esta usando algo como o bubble_sort para classificar os caras. OK, Podia usar qualquer um.  C tem uma versão super eficiente e pronta de sort em stdlib.h. Está certo de que não pode usar isso?

 

Mais ainda: em geral esses algoritmos de classificação operam in-place. E que p0rr@ é essa de in-place? Simples: eles classificam o próprio vetor argumento. Não geram outro vetor e nem sempre é o que a gente quer. E quando não é você precisa copiar os caras para outro lugar, certo? Ou vai perder a ordem original. E para copiar os caras para outro lugar muitas vezes tem que olhar um por um.

 

Isso quer dizer que pode copiar e já ir colocando na ordem, como uma criança faria com dominós ou cartas. Isso quer dizer insertion_sort. É muito mais simples: você classifica enquanto copia e na saída o vetor tera os caras pela ordem de tempo e na entrada podem estar na ordem de larga, de tag ou de nome ou nenhuma....

 

class() revisitado
 

    int class ( unsigned tamanho, int entrada[], int saida[] );

 

E acho que você já está entendendo a diferença: você chama essa função, algo assim:
 

    float tempo[MAXP];
    float tempo_ordenado[MAXP];
    int resultado = class( voltas, tempo, tempo_ordenado );

 

E ela devolve o vetor ordenado... E você pode testar separado. 

 

E não mostre o vetor DENTRO de class. É uma ideia ruim. 

 

Escreva

 

    int mostra_tempos( unsigned N, float tempo[] );

 

E junte om  o código de cima...

 

    int voltas = 4;
    float tempo[MAXP];
    float tempo_ordenado[MAXP];
    mostra_tempos( voltas, tempo );
    int resultado = class( voltas, tempo, tempo_ordenado );
    mostra_tempos( voltas, tempo_ordenado );

 

E você já pode testar antes e depois os dois vetores usando o mesmo código. É para isso que se compram computadores e programas afinal

 

Revise seu programa.

Link para o post
Compartilhar em outros sites
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXP 9
#define MAXV 4


//Criei a estrutura e o acervo dos corredores
struct corredores {
    char nome[100];
    float voltas[MAXV];
    float tempo;
};
struct corredores piloto[MAXP];



//Calculo a vola com a media mais rapida
void mediadavolta(float medias[]){


    int index = 1;
    float aux;

    //recebe e calcula a media das voltas em geral
    for(int i = 0; i<=MAXV;i++){
        medias[i] = 0;
        for(int j=0;j<=MAXP;j++){
            medias[i] += piloto[j].voltas[i];
        }
        medias[i] = medias[i]/10;
    }

    //calcula a melhor media e pega seu index par designar de qual volta foi
    aux = medias[MAXV];
    for(int i=0;i<=MAXV;i++){
        if(medias[i] < aux){
            aux = medias[i];
            index = i+1;
        }
    }

    printf("\n\nA volta com a media mais rapida foi a %d volta com %.2fs de media\n",index,aux);
}

//Classifico os corredores
void class(float tempo_ordenado[]){
    float aux;
    int x = 1;

    //ordeno atraves por meio do bubble sort o tempo dos pilotos
    for(int i=0;i<=MAXP;i++){
        for(int j=0;j<=MAXP;j++){
            if(tempo_ordenado[i] < tempo_ordenado[j]){
                aux = tempo_ordenado[i];
                tempo_ordenado[i] = tempo_ordenado[j];
                tempo_ordenado[j] = aux;
            }
        }
    }
    printf("\nCLASSIFICACAO: ");

    //comparo o tempo ordenado com o os pilotos para designar de quem foi
    for(int i=0;i<=MAXP;i++){
        if(x <= 10){
            for(int j=0;j<=MAXP;j++) {
                if (tempo_ordenado[i] == piloto[j].tempo) {
                    printf("\n%d. %s", i + 1, piloto[j].nome);
                    x++;
                }
            }
        }else{
            break;
        }
    }

}


//Calculo a menor volta e de quem foi
void menorvolta(float valor){

    //index para saber o piloto da menor volta
    int index;

    //laço para designar a menor volta
    for(int i =0; i<=MAXP;i++){
        for(int j=0;j<=MAXV;j++){
            if(piloto[i].voltas[j] < valor){
                valor = piloto[i].voltas[j];
                index = i;
            }
        }
    }
    printf("\nMelhor volta: %.2fs, pelo %s",valor,piloto[index].nome);
}


//Indexo as voltas ao respectivo piloto de forma dinamica
void indexar_voltas(char x[], int i){
    int aux = 0;
    char *pedaco = strtok(x, " ");
    piloto[i].voltas[aux] = atof(pedaco);
    aux++;
    while(pedaco != NULL){
        pedaco = strtok(NULL, " ");
        piloto[i].voltas[aux] = atof(pedaco);
        aux++;
    }
    for(int k=0;k<=MAXV;k++){
        piloto[i].tempo+=piloto[i].voltas[k];
    }
}

int main(){
    float medias[MAXV];
    float classificacao[MAXP]; //variavel q recebe o tempo dos pilotos
    char volta[30]; //variavel que recebe a volta dos pilotos como string (de maneira crua)

    //recebo as entradas com o nome do piloto e suas respectivas voltas
    for(int i = 0; i<=MAXP;i++){
        printf("Nome do piloto: ");
        gets(piloto[i].nome);
        printf("Voltas do piloto(v1 v2... v5): ");
        gets(volta);
        indexar_voltas(volta,i);

    }

    //passo o tempo dos pilotos para um array float
    for(int i = 0; i <= MAXP;i++){
        classificacao[i] = piloto[i].tempo;
    }


    menorvolta(piloto[MAXP].voltas[MAXV]); //chamo a funcao menorvolta com um valor aleatorio do acervo piloto.voltas
    class(classificacao); //chamo a funcao class com o array que possui o tempo dos pilotos
    mediadavolta(medias); //chamo a funcao responsavel por calcular a melhor volta em geral
    system("PAUSE"); //system pause para o programa n finalizar direto
    return 0;
}

Ajeitei meu código, coloquei mais comentários e revi algumas coisas... sei que ainda está muito amador e q da pra melhorar mas acho q consegui melhorar bastante coisa, a entrada funciona assim agora: primeiro insere o nome do piloto, e depois insere suas voltas nesse formato "volta1 volta2 volta3 volta4 volta5", separados por espaço...

vou entregar dessa maneira mesmo para meu professor porque o prazo esta acabando.. Obrigado pela ajuda!

 

 

  • Curtir 1
Link para o post
Compartilhar em outros sites
Em 18/04/2021 às 15:40, Felipe Rattowisk disse:

Ajeitei meu código, coloquei mais comentários e revi algumas coisas... sei que ainda está muito amador e q da pra melhorar mas acho q consegui melhorar bastante coisa, a entrada funciona assim agora: primeiro insere o nome do piloto, e depois insere suas voltas nesse formato "volta1 volta2 volta3 volta4 volta5", separados por espaço...

vou entregar dessa maneira mesmo para meu professor porque o prazo esta acabando

 

Está melhor que no início, mas está certo de que funciona?

 

Preferiu não corrigir muito do que eu falei. Testou isso?

Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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

Os Mitos do Dinheiro

APENAS R$ 9,90!

CLIQUE AQUI E COMPRE AGORA MESMO!