Curso de C: uma breve introdução
Todo o material aqui disponível pode, posteriormente, ser utilizado sobre os termos da:
Creative Commons License:
Atribuição - Uso não comercial - Permanência da Licença
http://creativecommons.org/licenses/by-nc-sa/3.0/ Licença de uso e distribuição
Quem sou eu?
Graduando do DCC (Ciência da Computação) Administrador de Redes e Sistemas GNU/Linux (POP-BA/RNP e Graco)
Contribuidor de Software Livre (Debian, Foswiki, HnTool)
Sobre o curso
Pré-requisito
Lógica de programação
Uma rápida introdução sobre C
Estrutura básica de um programa Declaração de variáveis e tipos Estruturas de controle de fluxo Funções
O que é C?
É uma linguagem de programação de propósito geral
Criada por Dennis Ritchie Derivada da linguagem B
Rápida e “portável” (ANSI C) Várias aplicações...
Kernel do Linux GNOME
Primeiros passos
O que você precisa?
Compilador (DJGPP, etc.)
Editor de texto (gedit/notepad, IDE) C é Case-Sensitive:
soma != Soma != SOMA != SoMa
Originalmente Programação Modular, mas... suporta:
Primeiros passos
Exercício: fazer um super-programa que exiba a seguinte mensagem na tela: “Ola Mundo!!!”
Primeiros passos
Exercício: fazer um super-programa que exiba a seguinte mensagem na tela: “Ola Mundo!!!”
Primeiro programa em C /* Primeiro programa em C: olamundo.c */ #include <stdio.h> int main() { printf(“Ola Mundo!!!\n”); }
Primeiros passos
Compilar e executar:
gcc -o ola-mundo ola-mundo.c ./ola-mundo
Primeiros passos
Função saída: printf
printf – print + formato
Exemplo de utilização:
printf(string-de-controle, lista-de-argumentos) printf ("%f",40.345) -> "40.345"
printf("Ola mundo!\n");
Primeiros passos
Função entrada: scanf scanf – scan + formato Exemplo de utilização:
scanf(string-de-controle, lista-de-argumentos) scanf ("%d",&x);
scanf("%f %f", &num1, &num2);
Cuidado com o buffer na leitura de string...
Primeiros passos
Caracteres de controle: printf ou scanf
Funções básicas de I/O
Código Significado
%d Inteiro
%f Float (real) %c Caractere %s String
Variáveis e tipos de dados
Uma variável é uma porção de memória, utilizada para armazenar um determinado valor: a = 5 b = 2 a = a + 1 result = a – b Variáveis
Variáveis e tipos de dados
IdentificadoresCada variável necessita de um Identificador que a distingue das outras:
Lestras (a-z, A-Z) + dígitos (0-9) + underscore (_) Não podem iniciar com dígitos
Cuidado com as palavras reservadas:
for, while, and, do, int, float, break, case, etc.
Dica de boa prática:
Variáveis e tipos de dados
Tipos de dados fundamentaisOk, iremos armazenar os dados na memória, mas o computador precisa saber que tipo de dado está armazenando...
Tipos fundamentais:
char – Armazenamento de caracteres int – Armazenamento de inteiros
float – Ponto flutuante em precisão simples double – Ponto flutuante em dupla precisão
Variáveis e tipos de dados
Declaração de variáveisPara declarar variáveis em C, digite o tipo da variável seguido por um identificador válido:
int a; int b;
float mynumber;
É possível declarar variáveis de mesmo tipo na mesma linha:
int a, b;
É possível inicializar variáveis já na declaração:
int a = 10, b = 5;
Variáveis e tipos de dados
VetoresConjunto de elementos consecutivos, do mesmo tipo, que podem ser acessados individualmente a partir de um único nome.
Declaração:
tipo nome_variavel [quantidade]
4.8 5.0 4.5 5.6 6.7 3.2 2.9
(0) (1) (2) (3) (4) (5) (6)
Variáveis e tipos de dados
VetoresExemplo de declaração:
int numero_matricula[20]; float notas[20];
Os índices do vetor de tamanho n variam de 0 à n-1. Ex:
float notas[4];
notas[0] = 6.4; // primeiro elemento notas[3] = 5.3; // ultimo elemento
Variáveis e tipos de dados
VetoresDicas de inicialização de vetores:
int v[3] = {1,2,3};
int v[5] = {5,4}; // igual a {5,4,0,0,0} int v[] = {6,7,8,9};
Incorreto:
Operadores
Operadores AritméticosOperadores aritméticos
+, -, *, / e %
A divisão inteira trunca qualquer parte fracionária
A seguinte expressão produz o resto da divisão de x por y (somente aplicado à int):
x % y
Operadores
Operadores Relacionais e lógicosOperadores relacionais Maior: > Maior ou igual: >= Menor: < Menor ou igual: <= Igual: == Diferente: != Operadores lógicos: AND: && OR: ||
Exercício
Fazer um programa que leia um número natural, representando a quantidade de dias, e exiba o equivalente a quantidade de anos.
Exemplo:
365 dias => ~1 ano 1461 dias => 4 anos
Dica: para ler um inteiro na variável x, fazemos:
scanf(“%d”, &x);
Exercício
Fazer um programa que leia um número
natural, representando a quantidade de dias, e exiba o equivalente a quantidade de anos.
Programa um pouco mais trabalhado
/* Conversao dias para anos: dias2anos.c */ #include <stdio.h> int main() { int dias; float anos; printf(“Digite o numero de dias: ”); scanf(“%d”,&dias); anos = dias / 365.25; printf(“\n%d dias equivale a %f anos.\n”,dias, anos); }
Controle de fluxo
É possível controla o fluxo de execução de um programa em C, baseado no valor de uma
expressão lógica/relacional. Exemplo: imposto de renda
Condicionais if (salario_mensal <= 1499.15) { isento(); } else { calcula_ir(salario_mensal); }
Controle de fluxo
Forma geral:
<condicao> pode ser expressão complexa:
a > b+3 && (c % 5 != 0 || c == 25) Condicionais if (<condicao>) { // Fluxo a executar caso <condicao> seja verdadeira } else { // Fluxo a executar caso <condicao> seja falsa }
Exercício
Um ano é bissexto se for divisível por 4 mas não por 100, exceto quando for divisível por 400. Faça um programa que leia o ano e diga se ele é bissexto ou não.
Exemplo:
2000 => Ano bissexto
2200 => Ano nao e bissexto
Exercício
Um ano é bissexto se for divisível por 4 mas não por 100, exceto quando for divisível por 400. Faça um programa que leia o ano e diga se ele é bissexto ou não.
Programa clássico do ano bissexto
/* Verifica ano bissexto: bissexto.c */ #include <stdio.h> int main() { int ano; printf(“Digite o ano: ”); scanf(“%d”,&ano); if (ano % 4 == 0 && ano % 100 != 0 || ano % 400 == 0) {
Controle de fluxo
O laço while é usado quando queremos que um bloco de instruções seja executado ENQUANTO uma condição for verdadeira (true).
Ex.: imprimir números naturais pares menores que 10:
Laço de repetição while
#include <stdio.h> int main() { int x = 0; printf(“%d\n”,x); x = x + 2; printf(“%d\n”,x); x = x + 2; printf(“%d\n”,x); x = x + 2; printf(“%d\n”,x); x = x + 2;
Controle de fluxo
Laço de repetição whileE se fosse até 1000?
E se o cálculo intermediário fosse mais complexo?
Forma mais elegante: #include <stdio.h>
int main() { int x = 0;
Controle de fluxo
Laço de repetição whileForma geral:
Parecido com o comando if:
Dica de boa prática: Nunca use goto...
while (<condicao>) { // declaracoes... } if (<condicao>) { // declaracoes... // volte para o comando if (goto) }
Controle de fluxo
Exemplo: fatorial #include <stdio.h> int main() { int n, contador, fat = 1; printf("Digite um numero: "); scanf("%d", &n); contador = n; while (contador > 0) { fat = fat * contador; contador = contador 1; }Controle de fluxo
Exercício: Fazer um programa para imprimir uma tabela com os primeiros 300 graus Fahrenheit e seus correspondentes graus Celsius (de 20 em 20), usando a fórmula:
C=(5/9)(F-32) Saída: 0 F => -17.8 C 20 F => -6.7 C 40 F => 4.4 C 60 F => 15.6 C … … 260 F => 126.7 C 280 F => 137.8 C 300 F => 148.9 C
Controle de fluxo
/* Programa para conversao de Fahrenheit * para Celsius: fahr2celsius.c */ #include <stdio.h> int main() { int inicio, fim, incr; float fahr, celsius; inicio = 0; fim = 300; incr = 20; fahr = inicio; while (fahr <= fim) { celsius = (5.0/9.0) * (fahr – 32.0); printf(“%4.0f => %6.1f\n”, fahr, celsius);Controle de fluxo
Laço de repetição forForma geral:
<inicializacao>: responsável pela seção de
inicialização das variáveis de iteração do laço
<condicao>: deve conter a condição de parada,
que deve ser verdadeira em algum momento.
<incremento>: comandos para incremento das
variáveis de iteração do laço
for (<inicializacao>; <condicao>; <incremento>) { // comandos...
Controle de fluxo
Laço de repetição forControle de fluxo
Laço de repetição forExemplo: fahr2celsius-v2.c /* Programa para conversao de Fahrenheit * para Celsius: fahr2celsiusv2.c */ #include <stdio.h> int main() { float fahr, celsius; for (fahr=0.0; fahr <= 300.0; fahr=fahr+20.0) { celsius = (5.0/9.0) * (fahr – 32.0); printf(“%4.0f => %6.1f\n”, fahr, celsius); } }
Funções
Funções são blocos de código que agrupam sequências de operações que, atrelados a um “nome”, podem ser invocados em todo o programa, de forma que tal sequência possa ser executada
Funções
A ideia de funções está em encapsular uma ideia ou operação Benefícios: Modularização Clareza do código Reutilização Funções em C
Funções
Funções da biblioteca padrão do C:
printf() scanf() getchar() gets() putchar() ... Funções em C
Funções
Forma geral:
Funções que não retornam nenhum valor, devem ser do tipo void.
Não é possível definir uma função dentro de outra
tipo_de_retorno nome_da_funcao(tipo_param nome_param,...) { // comandos
}
Funções
Exemplo de função para calcular o quadrado de um inteiro: #include <stdio.h> int quadrado(int x) { return x*x; } int main() { int numero; printf(“Digite um numero: ”); scanf(“%d”, &numero); printf(“O quadrado de %d e' %d”, numero, quadrado(numero)); } Funções em C
Funções
Em C, todas as funções devem ser definidas antes da função main().
O nome da função DEVE ser ÚNICO (dentre as outras funções e variáveis)
A mesma regra de nomenclatura de variáveis é aplicada à nomenclatura de funções.
Funções
Na chamada de uma função, o tipo e quantidade de parâmetros devem acordar com sua definição
A comunicação com a função é feita através dos argumentos e parâmetros
Na função, os parâmetros são como variáveis locais
Funções
Parâmetros de funções:
Funções
Após fazer seu processamento, as funções podem necessitar retornar um valor ou resultado.
Exemplo:
quadrado(4) => 16
Tipos de retorno:
int, float, double, char, void
O tipo void é usado quando a função não deve retornar nada. Ex: printf()
Funções
O retorno de uma função é definido pelo comando return. Ex.:
Provoca uma saída imediata da função chamador
Valor de retorno: comando return
...
int quadrado(int x) { return x*x;
} ...
Funções
Exercício 1: converter o programa de fatorial anterior para usar uma função no calculo do fatorial propriamente dito
Exercício 2: fazer uma função, pot(x,y), para calculo da potência de um número x por y (xy )
Exercício 3: fazer uma função println() que recebe uma string s (vetor de char) e imprime s seguida pelo caractere de nova linha (\n).
Funções
Todo programa em C, deve SEMPRE possuir a função main() em seu código, independente das outras funções.
A função main #include <stdio.h> int main(int argc, char **argv) { // comandos... return 0; }
Funções
argc é um inteiro que indica a quantidade de
argumentos passados na linha de comando
argv é um vetor de strings que contém os
argumentos da linha de comando (o primeiro é o nome do programa). A função main #include <stdio.h> int main(int argc, char **argv){ if (argc < 2) { printf("Usage: %s <NOME>\n", argv[0]); return 1; } printf("Ola, %s\n", argv[1]); return 0;
Tópicos avançados
Matrizes e strings
Outras funções de controle de fluxo
Alocação dinâmica de memória (ponteiros) Estruturas, Uniões, Enumerações
E/S com Arquivos, Console, pré-processador ...
Tópicos avançados
Bibliotecas para programação gráfica
gtk, opengl, etc.
Biblioteca para programação em rede
sockets
Bibliotecas para programação paralela
OpenMP, MPI, etc.
Referências
KERNIGHAN, B.W. C and RITCHIE, D.M.: A linguagem de programação. Tradução de: The C Programming Language. Edisa, 1986.
Curso de C, UFMG. Disponível em:
http://www.mtm.ufsc.br/~azeredo/cursoC/
C Library Reference. Disponível em: