Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Discursivo

Tabelas de estatística e ginásio - Ajuda

Mensagens Recomendadas

Discursivo

Tanto eu como um amigo meu tivemos a ideia de criar um programa que fizesse a estatística de um ginásio, onde uma pessoal iria fazer 4 exercícios, diariamente, entre os quais a passadeira, a eliptica , o remo e bicicleta.

Abaixo deixo um "print" da nossa ideia.

Nós já começamos a trabalhar nisso.

O problema rege-se da forma de não sabermos como começar o mesmo.

Também deixarei um print daquilo que fizemos até agora.

print.png

("print da tabela")

#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <string.h>

void main (void)

{
//declaração de variáveis das modalidades praticadas
float bicicleta;
float eliptica;
float passadeira;
float remo;
//declaração de sub-variáveis das modalidades praticadas sendo que o inicio das variaveis sao b (bicicleta), e(eliptica), p(passadeira) e r(remo)sua respectiva de Tempo e Distância
float btempo;
float bdistancia;
float etempo;
float
}

Agradeço uma resposta, obrigado.  :down:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Strabush

Aconselho o uso de structs.

O que tens a fazer é só incluir os dados na struct e depois fazer os cálculos indo buscar, na mesma, os dados.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HilarYo

Boas estou juntamente com o "Discursivo" a fazer este projecto, em C. Temos com base o programa Virtual C++ 2008.

Nós pretendemos em fazer algo com a aparência deste género:

____________________________________________________
|****************************************************|
|****************************************************|
|******************||NOME DO PRO||********************|
|****************************************************|
|****************************************************|
____________________________________________________










[MÊS/DIA][bICICLETA ][ ELIPTICA ][PASSADEIRA][   REMO   ]
[       ][Temp][Dist][Temp][Dist][Temp][Dist][Temp][Dist]
|01-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|02-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|03-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|04-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|05-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|06-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|07-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|08-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|09-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|10-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|11-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|12-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|13-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|14-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|15-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|16-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|17-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|18-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|19-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|20-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|21-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|22-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|23-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|24-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|25-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|26-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|27-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|28-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|29-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|30-X-10||    ||    ||    ||    ||    ||    ||    ||    |
|31-X-10||    ||    ||    ||    ||    ||    ||    ||    |
[TOTAL: ][    ][    ][    ][    ][    ][    ][    ][    ]
[MÉDIA: ][    ][    ][    ][    ][    ][    ][    ][    ]

é um programa simples, mas com algumas dificuldades no inicio de fazer o código, estamos com algumas dificuldades a nivel de selecção de variaveis. Ainda não sabemos bem que tipo de funçoes vamos utilizar, será que podem dar umas "Luzes"! Obrgado!

Aconselho o uso de structs.

O que tens a fazer é só incluir os dados na struct e depois fazer os cálculos indo buscar, na mesma, os dados.

os structs são idênticos às strings certo? mas a questão é:

os utilizadores, do programa, irão introduzir dia a dia os seus valores, não vão introduzir os valores todos.

Estáva-mos a pensar em usar a criação de um ficheiro e cada vez que a pessoa introduzisse novos valores actualiza-se, no final do mês o programa vai puxar o ficheiro .txt, e fazer os totais e as médias. que acham?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Strabush

É agora ir por partes.

1º Tens de certificar que o programa grava os dados nas variáveis, e põe num ficheiro .txt, isto num único dia.

Quanto a por dados no ficheiro não te posso ajudar pois não percebo muito bem, ainda.

Mas quanto as funções e variáveis é simples. Crias várias stucts(btw, struct não é string, struct guarda um conjunto de dados), sendo elas Data, Bicicleta, ELIPTICA, PASSADEIRA, REMO. Onde cada struct possui os dois dados Temp e Dist, com exceção da Data.

Struct é algo assim

struct bicicleta{
   int tempo;
   int distancia;
};

Se quiseres usas funções a parte, mas para isso precisas de conhecer os apontadores e saber utilizalos, se não, fazes tudo na main(), uma série de printf e fgets(ou scanf), de forma a guardar tudo em cada variável de cada struct.

Btw, para isto terás de criar um apontador para cada estrutura, isso implica criar um tipo também:

typedef struct bicicleta BICICLETA;
BICICLETA * p = NULL;

Fazes os mesmo para as restantes structs, mas apontadores com nomes diferentes. E quando quiseres fazer o scanf ou guardar o input na variável fazes " p->variável ", onde p é o apontador da struct e a variável, já sabes.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HilarYo

A se percebi, temos que criar uma espécie de funções "void" externas do género:

void bicicleta (void);
{
  
   struct bicicleta{
   int tempo;
   int distancia;
};
   printf ("/n/nIntroduza o tempo Bicicleta:  ");
   scanf("%d", &tempo);
   printf ("/nIntroduza a distância de Bicicleta:   ");
   scanf("%d", &distancia);
   return;
}

uma para a bicicleta, elíptica, passadeira e remo.

depois chamamos as funções no main void.

aqui no nosso caso, para cada dia temos que guardar um ficheiro .txt

void main(void)
{
FILE *fp;
char stuff[50];
int index;
fp = fopen(“FICHEIRO.TXT","w");
for (index = 1; index <= 10; index++)
fprintf(fp,"%s Linha numero %d\n", chamar o valor obtido);
fclose(fp);
}

é deste género?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HilarYo

#include "stdafx.h"
#include <stdio.h>
#include <conio.h>

struct bicicleta{
   int tempo;
   int distancia;
};
struct eliptica{
   int tempo;
   int distancia;
};
struct passadeira{
   int tempo;
   int distancia;
};
struct remo{
   int tempo;
   int distancia;
};

o primeiro paço é fazer isto certo?

mas precisamos de defenir a quantidade de dados que iremos por, por exemplo assim:

#include "stdafx.h"
#include <stdio.h>
#include <conio.h>

struct bicicleta{
   int tempo[31];
   int distancia[31];
};
struct eliptica{
   int tempo[31];
   int distancia[31];
};
struct passadeira{
   int tempo[31];
   int distancia[31];
};
struct remo{
   int tempo[31];
   int distancia[31];
};

neste caso pus como tamanho 31, pois é a quantidade de dia que um mês têm no máximo.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pinguim

Não precisas de declarar um tipo de struct para cada modalidade, visto que são todas iguais

Sim eh capaz de ser mais simples gravar o total numa variavel dentro da struct, não sendo necessario no entanto.

A seguir seria fazer o "load" dos dados guardados no ficheiro e pedir o dia (se for isto que pretendem) em que o utilizador quer introduzir, e fazer a introdução

No fim seria guardar de novo no ficheiro

Penso que cobre basicamente isso... se precisarem de mais avisem

espero ajudar


"Rather than continuing to seek the truth, simply let go of your views" - David RossC, C++, C#, Pascal

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pinguim
"Um Campo Total como assim?"

Em vez de ser

struct bicicleta{
   int tempo[31];
   int distancia[31];
};

seria

struct bicicleta{
   int tempo[31];
   int distancia[31];
   int total;
};

entendes?

acho que me esta a escapar algo...


"Rather than continuing to seek the truth, simply let go of your views" - David RossC, C++, C#, Pascal

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Strabush

Aquilo de separar as structs foi só pra perceberes, podes por tudo em um ou como te der jeito.

Visto serem 31 dias, se separaste totalmente as structs, terás de criar um tipo para cada e declarar com tamanho 31. Isto:

BICICLETA bicicleta[31];

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pinguim

Secalhar para isso guardava tambem o numero de dias introduzidos, para depois fazer a media?

...

não eh necessario, de novo, mas pode-lhe facilitar o algoritmo...

para alem disso memoria não eh um problema

Exemplo:

struct bicicleta{
   int tempo[31];
   int distancia[31];
   int total;
   int num;
};

De novo, isto depende da "tecnica" que quiserem usar...

Strabush, ele pode declarar um array de 31 bicicletas como la dentro ter 2 arrays de inteiros cada um com 31 de tamanho

Eh igual...

Tens rasão, mas agora que já percebeu n valeria a pena estar a criar novos tipos completamente iguais

EDIT: quando me referi a tecnica, refiro-me a, por exemplo, como querem fazer a introdução, ou seja, se quiserem que o utilizador especifique o dia o 'num' talvez não valha a pena, mas se a introdução for sequencial até  ajuda a saber onde vais fazer a nova introdução, sem teres que recontar o numero de elementos que já tens no array como tambem o seu total

Tudo depende de como vais "encarar" a tabela


"Rather than continuing to seek the truth, simply let go of your views" - David RossC, C++, C#, Pascal

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Grava tudo numa matriz. Tu sabes que os campos que precisas são sempre 2 e sabes que só precisas de 31 dias, no máximo, por isso crias uma matriz de 31 linhas e 8 colunas e depois trabalhas aos pares.

#define LIN 31
#define COL 8

int table[LIN][COL];
scanf("%i %i", &table[0][0], &table[0][1]);
scanf("%i %i", &table[0][2], &table[0][3]);

Claro que terias duas variáveis para iterarem por toda a matriz, atenção que a variável que itera pelas colunas incrementa de 2 em 2 unidades.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HilarYo

Não precisas de declarar um tipo de struct para cada modalidade, visto que são todas iguais

Sim eh capaz de ser mais simples gravar o total numa variavel dentro da struct, não sendo necessario no entanto.

A seguir seria fazer o "load" dos dados guardados no ficheiro e pedir o dia (se for isto que pretendem) em que o utilizador quer introduzir, e fazer a introdução

No fim seria guardar de novo no ficheiro

Penso que cobre basicamente isso... se precisarem de mais avisem

espero ajudar

Ou seja, neste caso, guardava o valor por exemplo dia 01-01-10, guardava num ficheiro 010110.txt com o valor de 10 (quilometros) e quando fossemos introduzir novo valor, por exemplo do dia 02-01-10, guardava num ficheiro 020110.txt depois ia a buscar esses valores todos e fazia os totais por exemplo da distancia e tempo...

é isso?

mas é preciso na mesma declarar 1 struct para cada modalidade, pois cada modalidade, é a parte, as medias da distância é só para a a respectiva modalidade!

Em vez de ser

struct bicicleta{
   int tempo[31];
   int distancia[31];
};

seria

struct bicicleta{
   int tempo[31];
   int distancia[31];
   int total;
};

entendes?

acho que me esta a escapar algo...

neste caso não é preciso por o total, depois na função "principal", dá para chamar os dados armazenados na struct não?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HilarYo

Aquilo de separar as structs foi só pra perceberes, podes por tudo em um ou como te der jeito.

Visto serem 31 dias, se separaste totalmente as structs, terás de criar um tipo para cada e declarar com tamanho 31. Isto:

BICICLETA bicicleta[31];

sim, o problema é por exemplo no dia 1 guando um determiado valor. como associo esse valor ao dia 1? Com os apontadores=?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HilarYo

Grava tudo numa matriz. Tu sabes que os campos que precisas são sempre 2 e sabes que só precisas de 31 dias, no máximo, por isso crias uma matriz de 31 linhas e 8 colunas e depois trabalhas aos pares.

#define LIN 31
#define COL 8

int table[LIN][COL];
scanf("%i %i", &table[0][0], &table[0][1]);
scanf("%i %i", &table[0][2], &table[0][3]);

Claro que terias duas variáveis para iterarem por toda a matriz, atenção que a variável que itera pelas colunas incrementa de 2 em 2 unidades.

como assim?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Strabush

Usa o método que o Pinguim aconselhou, poupa-te trabalho e deixa limpinho o código.

Para por na variavel não tem muito segredo:

p->dia[1]

(...) onde p é o apontador para a estrutura, devias ter criado, ve no meu antepenultimo post.

O pensamento do Local por acaso simplifica ainda mais o trabalho, mas terás de perceber melhor.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HilarYo

Usa o método que o Pinguim aconselhou, poupa-te trabalho e deixa limpinho o código.

Para por na variavel não tem muito segredo:

p->dia[1]

(...) onde p é o apontador para a estrutura, devias ter criado, ve no meu antepenultimo post.

O pensamento do Local por acaso simplifica ainda mais o trabalho, mas terás de perceber melhor.

Pois eis o problema, ainda não percebo muito disto, já tive umas aulinhas de programação, mas ainda não aprendemos a fazer matrizes! mas aprende-se... hehe

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pinguim

Eu disse TIPOS de estruturas

vais ter de declarar 4 estruturas, 1 para cada modalidade ah mesma...

Para queh um ficheiro para cada dia?

Pasta separares cada dia por uma linha ou algo do genero, tudo dentro do mesmo ficheiro...

se tiveres 31 dias, vais fazer 31 ficheiros, so para escrever uma linha em cada um?

Respondendo ao que estão a falar...

Para simplificar, o que o Localhost está a dizer é para criares uma matriz para guardar TODOS os valores, tanto po tempo como pa distancia de cada modalidade

8 colunas significa aqui 2 colunas por cada modalidade

como são 4 modalidades, 4x2 = 8

31 é porque no maximo tens 31 dias...

para avançares de modalidade em modalidade, tens de avançar 2 colunas, pq cada modalidade tem duas colunas

desta forma, por exemplo, para leres para a coluna 'distancia' da modalidade bicicleta, seguindo o teu exemplo, seria:

scanf("%i",&table[0][1]);

a sugestão do localhost eh trabalhares aos pares, ou seja, por cada leitura preencheres LOGO as duas tabelas de uma modalidade, daí

scanf("%i %i", &table[0][0], &table[0][1]);

este codigo já te leh tanto o 'tempo' como tambem o 'distancia' da tua primeira modalidade (neste caso, BICICLETA)

...


"Rather than continuing to seek the truth, simply let go of your views" - David RossC, C++, C#, Pascal

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HilarYo

Ao fim de cabo, a matriz é algo deste género:

matriz.gif

cubo.gif

matrizind.gif

No caso deste programa, tenho que criar 4 matrizes certo? uma para cada modalidade, bicicleta, remo, elíptica e passadeira. é isso?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pinguim

matrizes são arrays dentro de arrays, na maneira mais simples de explicar

Eh como em vez de teres 4 "gavetas" em linha (neste caso um array com 4 posições)

|_ o _| |_ o _| |_ o _| |_ o _|

  -  array[4]

Tens uma comoda, em que tens, por exemplo, 3 linhas com 4 gavetas:

|_ o _| |_ o _| |_ o _| |_ o _|

|_ o _| |_ o _| |_ o _| |_ o _|

|_ o _| |_ o _| |_ o _| |_ o _|

  -  array[3][4]

O primeiro exemplo é um vector (array UNIDIMENSIONAL)

O segundo exemplo é uma matriz (array BIDIMENSIONAL)

Porqueh usar uma matriz?

Pela simples rasão que tu estas a usar uma tabela, e como as gavetinhas ali em cima devem ter-te feito perceber, nada melhor do que uma matriz para descrever uma tabela, em que tens, neste caso, uma matriz de 8 colunas por 31 linhas:

  -  array[8][31]

Citando o localhost:

#define LIN 31
#define COL 8

int table[LIN][COL];


"Rather than continuing to seek the truth, simply let go of your views" - David RossC, C++, C#, Pascal

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pinguim

uma matriz basta para simulares a tua tabela TODA

não precisas de separar cada modalidade em matrizes diferentes...

mas se te convem mais assim, tu eq estas a programar, ao fim ao cabo fazes como bem te apetecer :D

Espero ter-te ajudado, não consigo ser mais explicito que já fui

EDIT: Uma matriz basta para fazer a tua tabela toda, da mesma maneira que uma comoda dah para guardar a tua roupa toda...

tu eq escolhes como organizas a tua roupa dentro da tua comoda. A cada coluna podes por um tipo diferente de roupa (meias numa coluna de gavetas, t-shirts noutra coluna, por aí fora)

Não eh necessario serrares a tua comoda em varias colunas so porque metes cada tipo de roupa em cada coluna...

No entanto, se isso te convem ou se prefererires assim, faz como quiseres, a comoda eh tua :)

Percebestes?


"Rather than continuing to seek the truth, simply let go of your views" - David RossC, C++, C#, Pascal

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Pela simples rasão que tu estas a usar uma tabela, e como as gavetinhas ali em cima devem ter-te feito perceber, nada melhor do que uma matriz para descrever uma tabela, em que tens, neste caso, uma matriz de 8 colunas por 31 linhas:

  -  array[8][31]

Citando o localhost:

#define LIN 31
#define COL 8

int table[LIN][COL];

Nesse caso declaraste uma matriz com 8 linhas e 31 colunas e não 8 colunas e 31 linhas. No meu código pûs nomes bem explicitos para perceberem que 1º se declara as linhas e só depois as colunas.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pinguim

eh igual ...

absolutamente igual o.O


"Rather than continuing to seek the truth, simply let go of your views" - David RossC, C++, C#, Pascal

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pinguim

Nesse caso declaraste uma matriz com 8 linhas e 31 colunas e não 8 colunas e 31 linhas. No meu código pûs nomes bem explicitos para perceberem que 1º se declara as linhas e só depois as colunas.

Isto eh absolutamente mentira... Não tens de declarar nenhuma primeiro nem em segundo

tu escolhes a ordem que quiseres

poderia fazer até um array[PosX][PosY]

como poderia fazer um array[PosY][PosX]

tu disseste de uma forma eu disse doutra

so muda a maneira como ele encara o array...

podia mt bem ter sido assim:

#define LIN 31
#define COL 8

int table[COL][LIN];

podia até declarar um array assim

#define LIN 31
#define COL 8

int table[COL*LIN];

Em memoria EH TUDO IGUAL

so muda a maneira como encaramos o array

porque na realidade, temos 8*31 * syzeof(int) bytes consecutivos alocados em memoria

Desculpa... não percebo então porque me corrigiste


"Rather than continuing to seek the truth, simply let go of your views" - David RossC, C++, C#, Pascal

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.