.c
(letra minúscula)#include <stdio.h>
int main(void)
{
printf("To C or not to C, ");
printf("that is the question.\n");
return 0;
}
Para ser executado, um programa em C tem primeiro de ser traduzido para código-máquina.
A tradução é efetuada por programa compilador.
Nestas aulas: vamos usar o GCC (GNU Compiler Collection).
o pré-processador interpreta diretivas (linhas que começam por #
)
o compilador traduz o código C para código-máquina
o ligador (linker) combina o código-máquina gerado com as bibliotecas necessárias
Em sistemas GNU/Linux: o pré-processador, compilador e ligador são executados em sequência pelo comando gcc
.
Invocamos o compilador usando o interpretador de comandos Linux (shell):
$ gcc -o hello hello.c
Produz um ficheiro hello
que podemos executar:
$ ./hello
To C or not to C, that is the question.
directivas int main(void) { instruções }
#
; e.g.: #include <stdio.h>
stdio.h
contém as definições associadas a entrada/saidaprintf
está declarado neste headerreturn
main
main
que é executada quando o programa iniciamain
representa o código de erro para o sistema operativo int main(void)
{
....
return 0;
}
return
(equivale a retornar 0) printf("To C or not to C, ");
printf("that is the question.\n");
return 0;
printf
e return
printf("...")
imprimem o texto entre aspas na saida-padrão (terminal) To C or not to C, that is the question.
;
) printf(
"To C or not to C, "
);
printf("To C or "); printf("not to C, ");
/*
e termina com */
/* Isto é um comentário */
/*
Autor: Pedro Vasconcelos
Ficheiro: hello.c
Programa: Imprime uma mensagem de exemplo
*/
Atenção: esquecer de fechar um comentário pode fazer com que o compilador ignore parte do programa.
printf("To be "); /* comentário aberto
printf("or not to be; "); /* fechado */
printf("that is the question.\n");
// Isto é um comentário
//
e termina no final da linhaint
e float
int
pode guardar valores inteiros positivos e negativos; e.g.:
0 1 -23 397
int
dependem da implementação; e.g.:
float
guarda valores de vírgula-flutuante com precisão simples0.0253 -1.25 123.555
As variáveis têm de ser declaradas antes do uso:
int altura;
float raio;
Podemos declarar múltiplas variáveis do mesmo tipo duma só vez:
int altura, largura, profundidade;
float raio, massa;
Até C89: todas as declarações têm de ocorrer antes das instruções.
int main(void) {
/* declarações de variáveis */
int altura, largura;
float raio;
/* seguem-se instruções */
...
}
Em C99: declarações e instruções podem ser misturadas (desde que a declaração ocorra antes do uso).
Podemos definir ou modificar o valor de uma variável usando uma atribuição.
int altura; // declaração
altura = 8; // atribuição
altura
No lado direito duma atribuição podemos usar expressões e.g.
constantes, varáveis e operações.
int altura, largura, area;
altura = 8;
largura = 3;
area = altura * largura;
// area é 24
Um programa para calcular o volume \(V\) de uma caixa retangular.
Exemplo:
\[ V = 11 \text{cm} \times 5 \text{cm} \times 6 \text{cm} = 330 \text{cm}^3 \]
#include <stdio.h>
int main(void) {
int l, w, h, v; // dimensões e volume
l = 11; // comprimento
w = 5; // largura
h = 6; // altura
v = l*w*h; // cálculo do volume
printf("LxWxH: %d*%d*%d (cm)\n", l,w,h);
printf("Volume: %d (cm^3)\n", v);
return 0;
}
Podemos usar a função de bibloteca printf
para imprimir valores das variáveis. Exemplo:
int alt;
alt = 6;
printf("Altura: %d cm\n", alt);
Imprime o texto:
Altura: 6 cm
%d
é um campo que é substituido pelo valor duma variável inteira em decimal.
Para valores float
usamos o campo %f
.
float custo;
custo = 123.45;
printf("Custo: EUR %f\n", custo);
Resultado:
Custo: EUR 123.449997
float
!%f
apresenta o resultado arrendondado a 6 casas decimaisPara forçar formatação com \(n\) casas decimais usamos %
\(.n\)f
:
Exemplo:
printf("Custo: EUR %.2f\n", custo);
Resultado:
Custo: EUR 123.45
Podemos formatar vários valores num só printf
:
printf("Altura: %d cm; Custo: EUR %.2f\n",
alt, custo);
Atenção:
%d
para int
, %f
para float)scanf
é usada para ler valores da entrada-padrão (teclado)printf
o 1º argumento é o formato dos dadosn
int n;
scanf("%d", &n);
&
antes do nome da variável a ler (mais tarde veremos porquê)Para ler um float
não necessitamos de especificar casas decimais.
float x;
scanf("%f", &x);
Funciona com ou sem casas decimais na entrada; exemplos:
123
123.4
123.4567
Vamos alterar o programa de exemplo anterior para ler as dimensões da caixa.
#include <stdio.h>
int main(void) {
int l, w, h, v; // dimensões e volume
printf("L=?"); scanf("%d", &l);
printf("W=?"); scanf("%d", &w);
printf("H=?"); scanf("%d", &h);
v = l*w*h; // cálculo do volume
printf("LxWxH: %d*%d*%d (cm)\n", l,w,h);
printf("Volume: %d (cm^3)\n", v);
return 0;
}
int x, y;
y = x + 1; // variável x não-inicializada
gcc
pode detetar variáveis não-inicializadas usando a opção -Wall
int alt = 8;
int alt = 8, larg = 5, comp = 11;
int alt, larg, comp = 11;
// só inicializa uma variável (comp)
Exemplos válidos:
times10 get_Next_Char _done
Exemplos inválidos:
10times get-Next-Char máximo
get_next_char
get_next_Char
get_Next_Char
são identificadores diferentes (seria confuso usá-los num mesmo programa...).
Não podemos usar as seguintes palavras reservadas como identificadores.
auto enum restrict unsigned
break extern return void
case float short volatile
char for signed while
const goto sizeof _Bool
continue if static _Complex
default inline struct _Imaginary
do int switch
double long typedef
else register union
#define
para definir macros#define INCHES_PER_METER 39.3701
/* factor de conversão:
polegadas por cada metro */
O pré-processador substitui as macros textualmente.
Exemplo:
inches = meters * INCHES_PER_METER;
após processamento fica:
inches = meters * 39.3701;
Um programa para calcular a área de uma circunferência.
A área de uma círcunferência de raio \(r\) é \[ A = \pi r^2 \] (onde \(\pi\) é a constante \(3.14159\ldots\)).
#include <stdio.h>
#define PI 3.14159
int main(void) {
float raio, area;
printf("Raio da circunferência?");
scanf("%f", &raio);
area = PI * raio * raio;
printf("Área: %f\n", area);
return 0;
}
Um programa em C é uma sequência de símbolos ("tokens"):
Exemplo: a instrução
printf("Área: %f\n", area);
contém sete símbolos:
printf |
identificador |
( |
pontuação |
"Área: %f\n" |
cadeia de carateres |
, |
pontuação |
area |
identificador |
) |
pontuação |
; |
pontuação |
#include <stdio.h>
#define PI 3.14159
int main(void) {float raio,area;printf(
"Raio da circunferência?");scanf("%f",&raio);
area=PI*raio*raio;printf("Área: %f\n",area);
return 0;}
Devemos usar espaços, tabulações e mudança de linha para aumentar a legibilidade do programa:
#include <stdio.h>
#define PI 3.14159
int main(void) {
float raio, area;
printf("Raio da circunferência?");
scanf("%f", &raio);
area = PI * raio * raio;
// calcular a área
printf("Área: %f\n", area);
return 0;
}