Beleza, como prometido resolvi brincar um pouco com C.
Estou usando o compilador grátis da Digital Mars: dmc.exe.
Um simples editor de texto puro: notepad++.
E um simples batch de compilação: compile-with-dmc.cmd.
compile-with-dmc.cmd:
[code=DOS]@echo off & mode 100, 25
REM O eco de comandos foi desativado e o tamanho da janela do cmd redimensionado.
echo.
echo.
set "_ext=c"
REM "c" é a extensão do arquivo que iremos pesquisar em disco.
for %%f in (*.%_ext%) do set "_src=%%f"
REM O laço busca por arquivos terminados em ".c" dentro do diretório do qual o script é executado.
REM E por fim o laço faz busca alfabética salvando a última ocorrência na variável %_src%
echo.File found: %_src%
REM Mostra o arquivo encontrado.
set /P _src=Source file:
REM Dê enter apenas se o arquivo encontrado for o correto ou digite o nome do arquivo que enviar para compilação.
"E:\Fernando\Installed\dmc\bin\dmc.exe" %_src% > %_src:~0,-2%.out
REM Endereço real do compilador, endereço relativo do código fonte e redirecionamento das mensagens para um arquivo.
type %_src:~0,-2%.out
REM Simples exibição da saída do compilador no CMD. Efeito semelhante do comando "tee" do GNU/Linux.
echo.
echo.
timeout /nobreak /t 15
REM Simples contador de 15 segundos.
exit /b
REM Comando para fechar o script sem fechar o cmd que o executou.
REM Fonte de pesquisa de detalhes que sempre esqueço:
REM https://ss64.com/nt/syntax-args.html
REM https://ss64.com/nt/syntax-substring.html[/code]
Links: http://www.digitalmars.com/download/freecompiler.html
Links: https://notepad-plus-plus.org/download/
Copiei o código apresentado, re-alinhei manualmente a identação do mesmo e mandei compilar.
[code=C]byEric.c(27) : Error: illegal operand types
Had: float *
media=soma/4;
^[/code]
Erro de compilação. Vamos estudar esse erro.
O que é "media" e o que é "soma"?
[code=C]float media[2],soma[1];[/code]
"media" é um vetor de floats.
"soma" é outro vetor de floats.
Hum, vamos re-interpretar o código: media=soma/4;
Não faz sentido dividir um vetor por 4. Nós podemos dividir um número dentro deste vetor. Logo, preciso de uma declaração indexada. Sem se preocupar com lógica, apenas sintaxe, podemos re-escrever assim:
[code=C]media[0]=(soma[0]/4);[/code]
E agora o código compila. Sinal que não há erros de compilação. Mas ainda pode haver erros de lógica.
Ainda nesta linha, gostaria de perguntar:
O que é "/" e o que é "4"?
"/" irei chamar de literal de divisão.
"4" irei chamar de literal de inteiro.
É importante entender que os tipos de dados utilizados na operação de divisão influenciam no comportamento da divisão.
Logo se queremos fazer uma divisão fracionária, é melhor indicarmos explicitamente os valores como números fracionários. Por exemplo, usar o literal de float "4.0".
Mais nos capítulos 3.4 e 3.12 da documentação:
"Integer division of positive values truncates towards zero, so 5/3 is 1. However, if either operand is negative, the direction of rounding is implementation-defined."
"In that example, since y and z are both integers, integer division is performed, and even though x is a floating-point variable, it receives the value 2. Explicitly casting the result of the division to float does no good, because the computed value of y/z is already 2.
To fix this problem, you need to convert one of the operands to a floating-point type before the division takes place"
Fonte: https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html
Por isso, nesta linha, seria mais interessante que ela fosse re-escrita assim:
[code=C]media[0]=(soma[0]/4.0);[/code]
Novamente o código compila.
Por fim, abaixo está minha revisão do exercício.
"código refeito inclusive em lógica"
[code=C]
/** 2018/01/11 05:38
* código baseado no trabalho aparesentado por EricCartman em:
*
* https://www.hardware.com.br/comunidade/media-matrizes/1473731/
* (versão simples)
*/
/*
Vamos imaginar uma Tabela de Alunos, contendo:
1x código por aluno: tipo real, fornecida;
2x notas por aluno: tipo real, fornecida;
1x média do aluno: tipo real, calculada;
|---------------------|
|COD-NOTA1-NOTA2-MEDIA|
|---|-----|-----|-----|
|1.0| 10.0| 10.0| 10.0|
|2.0| 5.0| 5.0| 5.0|
|3.0| 10.0| 4.0| 7.0|
|4.0| 3.0| 7.2| 5.1|
|5.0| 3.0| 2.8| 2.9|
|---------------------|
Desafio: faça a leitura das variáveis;
Desafio: faça o cálculo da média posteriormente à leitura completa da tabela;
Vamos imaginar agora uma simples variável:
1 média de todos os alunos: tipo real, calculada;
|---------------------|
|COD-NOTA1-NOTA2-MEDIA|
|---|-----|-----|-----|
|1.0| 10.0| 10.0| 10.0|
|2.0| 5.0| 5.0| 5.0|
|3.0| 10.0| 4.0| 7.0|
|4.0| 3.0| 7.2| 5.1|
|5.0| 3.0| 2.8| 2.9|
|---------------------|
| MEDIA-GERAL: 6.0|
|---------------------|
Desafio: faça o cálculo da média-geral;
*/
#include
#include
#include
int main(){
// |---------------------| |-----------------------|
// |COD-NOTA1-NOTA2-MEDIA| | TABELA EM MEMÓRIA 5x4 |
// |---|-----|-----|-----| |-----|-----|-----|-----|
// |1.0| 10.0| 10.0| 10.0| | 0x0 | 0x1 | 0x2 | 0x3 |
// |2.0| 5.0| 5.0| 5.0| | 1x0 | 1x1 | 1x2 | 1x3 |
// |3.0| 10.0| 2.0| 6.0| | 2x0 | 2x1 | 2x2 | 2x3 |
// |4.0| 4.0| 7.0| 5.5| | 3x0 | 3x1 | 3x2 | 3x3 |
// |5.0| 3.0| 2.8| 2.9| | 4x0 | 4x1 | 4x2 | 4x3 |
// |---------------------| |-----------------------|
#define quantidadeDeAlunos 5
#define quantidadeDeCampos 4
float tabelaDeAlunos[quantidadeDeAlunos][quantidadeDeCampos];
int indicei, indicej;
float codigo, nota1, nota2, media; // nenhuma das variáveis desta linha são
// necessárias mas elas ajudam a ler
// melhor o código.
// |---------------------|
// |COD-NOTA1-NOTA2-MEDIA|
// |---|-----|-----|-----|
// |1.0| 10.0| 10.0| 10.0|
// |2.0| 5.0| 5.0| 5.0|
// |3.0| 10.0| 4.0| 7.0|
// |4.0| 3.0| 7.2| 5.1|
// |5.0| 3.0| 2.8| 2.9|
// |---------------------|
// | MEDIA-GERAL: 6.0|
// |---------------------|
float mediaGeral;
// Desafio: faça a leitura das variáveis;
for (indicei=0;indicei
// inicializa o índice j
indicej=0;
// vetor: codigo, nota1, nota2, media;
printf("Digite o codigo do aluno %3d: ",indicei+1);
scanf("%f",&codigo);
tabelaDeAlunos[indicei][indicej++]=codigo;
printf("Aluno %3.1f digite a sua nota1: ",codigo);
scanf("%f",¬a1);
tabelaDeAlunos[indicei][indicej++]=nota1;
printf("Aluno %3.1f digite a sua nota2: ",codigo);
scanf("%f",¬a2);
tabelaDeAlunos[indicei][indicej++]=nota2;
printf("\n");
}
// Desafio: faça o cálculo da média por aluno;
for (indicei=0;indicei
media=tabelaDeAlunos[indicei][1]+tabelaDeAlunos[indicei][2];
media=media/2.0;
tabelaDeAlunos[indicei][3]=media;
}
// Desafio: faça o cálculo da média-geral;
mediaGeral=0.0;
for (indicei=0;indicei
mediaGeral=mediaGeral+tabelaDeAlunos[indicei][3];
}
mediaGeral=mediaGeral/(float)quantidadeDeAlunos;
// Desafio Bônus: exiba na tela toda a tabela;
char mystring[80];
char numeroFormatado[5];
printf("|-----------------------|\n");
printf("|---TABELA-DOS-ALUNOS---|\n");
printf("|-----------------------|\n");
printf("| COD | N01 | N02 | MDA |\n");
printf("|-----|-----|-----|-----|\n");
for (indicei=0;indicei
strcpy(mystring,"|");
for (indicej=0;indicej
sprintf(numeroFormatado,"%4.1f",tabelaDeAlunos[indicei][indicej]);
strcat(mystring,numeroFormatado);
strcat(mystring," |");
}
strcat(mystring,"\n");
printf("%s",mystring);
}
printf("|-----|-----|-----|-----|\n");
printf("| MEDIA-GERAL: %-4.1f|\n",mediaGeral);
printf("|-----------------------|\n");
/** FIM DO BÔNUS **/
system("pause");
return 0;
}
/**
* Compilador usados: Digital Mars C Compiler
* http://www.digitalmars.com/download/freecompiler.html
* http://ftp.digitalmars.com/Digital_Mars_C++/Patch/dm857c.zip
*
* Editor de texto usado: Notepad++
* https://notepad-plus-plus.org/download/
*
* Referências da linguagem:
* https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html
* http://www.cplusplus.com/reference/
* http://en.cppreference.com/w/c/language
* https://www-s.acm.illinois.edu/webmonkeys/book/c_guide/
*
* Tutoriais:
* http://publications.gbdirect.co.uk/c_book/
* http://www.crasseux.com/books/ctutorial/
* https://www.cprogramming.com/tutorial.html
* https://www.geeksforgeeks.org/c/
* http://www.learn-c.org
* http://www.pucsp.br/~so-comp/cursoc/c.html
*
* Outros compiladores gratuitos:
* Clang.LLVM: http://releases.llvm.org/download.html
* GCC.......: https://gcc.gnu.org/install/binaries.html
* TinyC.TCC.: https://bellard.org/tcc/
*
* Outros editores de texto gratuitos:
* ATOM......: https://atom.io
* Brackets..: http://brackets.io
* Geany.....: https://www.geany.org
*
* IDEs gratuitas:
* eclipse...: https://eclipse.org/ide/
* NetBeans..: https://netbeans.org
* CodeLite..: https://codelite.org
* CodeBlocks: http://codeblocks.org
*
*/
[/code]
abraços