Linguagem C IF61A/IF71A - Computação 1
Prof. Leonelo Almeida
Universidade Tecnológica Federal do Paraná
Até agora ...
• Sabemos construir algoritmos que tenham:
▫ Variáveis
▫ Comandos sequenciais
▫ Entrada e saída de dados pelo dispositivo padrão
▫ Estruturas condicionais e de decisão
▫ Estruturas de repetição
Mas ...
• Foco em algoritmos
▫ Identificação do problemas
▫ Entradas e saída
▫ Computação para transformar E->S
Aula de hoje
• Linguagem de programação C
• Levando os algoritmos para o computador
▫ Conversão de conceitos aprendidos até agora
para: “linhas de código”
Adaptação de notas de aula do prof. Ricardo Anido, Instituto de Computação, Unicamp
Ferramental • Você deverá ter acesso a um computador.
• Para criar um programa, utilizamos um editor de texto (para escrever o código do programa) e um compilador.
▫ O compilador transforma o código em um programa executável.
• Se você usa Linux ou MAC OS, você poderá utilizar qualquer editor simples como Emacs, Kyle, etc. Será preciso instalar o compilador gcc.
• Você pode utilizar uma IDE que integra editor de texto e compilador, como: http://www.codeblocks.org/downloads
Para aprender a programar
• FAÇAM em vez de observar/copiar
• Resolvam e implementem diversos problemas e exercícios
▫ Das listas
▫ De outras fontes como livros, Web, etc
Compiladores e linguagens de
programação • Uma linguagem de programação é um conjunto de comandos
que são mais próximos da linguagem humana do que os sinais digitais.
• Um compilador é um programa que lê um código de uma linguagem de programação e o transforma em um programa executável.
• Na verdade o compilador realiza esta tarefa juntamente com um outro programa, chamado montador (assembler).
• Um sistema operacional controla e abstrai o hardware, a segurança dentre outros fatores.
Linguagem de
Programação
Compilador +
Montador
Sistema Operacional
Primeiro programa em C
• Código fonte: arquivo com as declarações e operações segundo uma linguagem de programação
#include <stdio.h>
int main() {
printf("Hello, world!\n");
}
Primeiro programa em C
• Código fonte: arquivo com as declarações e operações segundo uma linguagem de programação
#include <stdio.h>
int main() {
printf("Hello, world!\n");
}
Biblioteca/Cabeçalho padrão de entrada/saída
Fim do código fonte
Imprime um conjunto de caracteres para a saída padrão
Função principal do código
Executando programas
• Primeiro deve-se compilar o código fonte
• Depois é possível executá-lo como qualquer outro programa instalado em seu computador
$ gcc hello.c -o hello
$ ./hello
Hello, world!
• Primeiro deve-se compilar o código fonte
• Depois é possível executá-lo como qualquer outro programa instalado em seu computador
$ gcc hello.c -o hello
$ ./hello
Hello, world!
Executando programas
Compila o código fonte
Executa o programa
Resultado do programa
Erros
• Em tempo de compilação: ocorre quando tenta compilar um programa
• Em tempo de execução: ocorre quando o compilador gera o executável, mas o programa realiza uma operação não esperada
Declaração de variáveis • Formato: ▫ tipoDeDado nomeVariavel;
• Para várias variáveis do mesmo tipo: ▫ tipoDeDado nomeVar1, nomeVar2, ... ;
• Exemplos corretos: int soma;
float preco, abacaxi;
char resposta;
• Exemplos incorretos: soma int;
float preco abacaxi
Nomes de variáveis
• Deve começar com uma letra (maiúscula ou minúscula) ou subscrito(_). Nunca pode começar com um número.
• Pode conter letras maiúsculas, minúsculas, números e subscrito.
• Não pode-se utilizar como parte do nome de uma variável: { ( + - * / \ ; . , ?
• Letras maiúsculas e minúsculas são diferentes: int c;
int C;
Nomes de variáveis
• As palavras seguintes já tem um significado na linguagem C e por esse motivo não podem ser utilizadas como nome de variáveis: auto, double, int, struct, break, enum,
register, typedef, char, extern, return,
union, const, float, short, unsigned,
continue, for, signed, void, default,
goto, sizeof, volatile, do, if, static,
while
Tipos de variáveis (inteiro)
• int: o comprimento depende do processador. Em processadores Intel comuns: ocupa 32 bits e armazena valores de -2.147.483.648 a 2.147.483.647
• unsigned int: o comprimento depende do processador e que armazena somente valores positivos. Em processadores Intel comuns: ocupa 32 bits e armazena valores de 0 a 4.294.967.295
• long int: ocupa 64 bits em computadores Intel de 64bits e pode armazenar valores de aprox. -9x1018 a aprox. 9x1018
• unsigned long int: Inteiro que ocupa 64 bits e em computadores Intel de 64bits e armazena valores de 0 até aprox. 18x1018
• short int: Inteiro que ocupa 16 bits e pode armazenar valores de -32.768 a 32.767
• unsigned short int: Inteiro que ocupa 16 bits e pode armazenar valores de 0 a 65.535
• char: armazena somente um caractere.
• Para cadeias de caractere (ou strings): char exemplo[4] = {'a','b','c','\0'};
char exemplo[4] = "abc";
Por isso elas são declaradas com o
tamanho desejado + 1.
Tipos de variáveis (caractere)
Strings sempre acabam com o caractere ‘\0’
Tipos de variáveis (ponto flutuante)
• float: Utiliza 32 bits, e na pratica tem precisão de aproximadamente 6 casas decimais (depois do ponto). Pode armazenar valores de (+/-)10-38 a (+/-)1038
• double: Utiliza 64 bits, e na pratica tem precisão de aproximadamente 15 casas decimais. Pode armazenar valores de (+/-)10-308 a (+/-)10308
Atribuições
• Nos algoritmos usamos a seta para esquerda
• Em C usamos o sinal de igual (=)
▫ Ou seja: nomeVariavel = valor;
▫ Exemplos: int idade;
idade = 12;
idade = idade + 1;
idade++;
<-
Constantes
• São valores que devem aparecer, por alguma razão, no programa. Também são de um tipo de dados
• Exemplos de constantes
▫ Inteiras: 10, 145, 1000000, -5
▫ Ponto flutuante: 2.3456, 32132131.5, 5.0
▫ Caracteres: 'A', '!', '4', '('
▫ String: “Hello world”, “Bonjour”, “Olá”
Constantes • Inteiras:
▫ Base decimal. Ex: 10, 145, 1000000
▫ Base hexadecimal (base 16). Ex: 0xA (0xA16 = 10), 0x100 (0x10016 = 256)
• Ponto flutuante
▫ Base decimal. Ex: 10.235
▫ Notação científica: 2e2 (2x102)
• Caracteres
▫ São inteiros que representam símbolos
▫ Tabelas de símbolos ASCII (American Standard Code for Information Interchange), EBCDIC, Unicode, etc
...
48 – ‘0’
49 – ‘1’
50 – ‘2’
...
97 – ‘a’
98 – ‘b’
99 – ‘c’
...
Constantes • Inteiras:
▫ Base decimal. Ex: 10, 145, 1000000
▫ Base hexadecimal (base 16). Ex: 0xA (0xA16 = 10), 0x100 (0x10016 = 256)
• Ponto flutuante
▫ Base decimal. Ex: 10.235
▫ Notação científica: 2e2 (2x102)
• Caracteres
▫ São inteiros que representam símbolos
▫ Tabelas de símbolos ASCII (American Standard Code for Information Interchange), EBCDIC, Unicode, etc
Escrita de dados
• Nos algoritmos utilizamos a função imprima([“texto1”],[var1, ...],[“texto2”], ...);
• Na linguagem C utilizamos a função
printf(“um texto”,[var1, var2, ...]);
Escrita de dados
• Para imprimir variáveis e constantes ▫ printf(“Vai demorar %d %s.”, num, unidade);
%d imprime um inteiro, adicione u para unsigned, l para long. Ex.: %ud
%s imprime uma string
%f imprime um ponto flutuante. Use %e para notação científica. Use %.2f para float com 2 casas decimais
%lf imprime um double
%c imprime um caractere
Formatação da escrita dados #include <stdio.h>
main() {
int var_inteiro = 345435, var_inteiro2 = 256;
float var_flutuante = 123.456;
char var_caractere = 'A';
printf("\n[%%]\n");
printf("\n------INTEIROS------\n");
printf ("[%d] e [%10d] e [%-10d] e [%010d]\n", var_inteiro, var_inteiro, var_inteiro, var_inteiro);
printf ("[%o]\n", var_inteiro2);
printf ("[%x]\n", var_inteiro2);
printf ("[%#o] e [%#x]\n", var_inteiro2, var_inteiro2);
printf ("O %%d vem do termo \"decimal\".\n");
printf("\n------CARACTERE------\n");
printf ("[%c]\n", var_caractere);
printf ("[%s]\n", "Um texto aqui.");
printf("\n------PONTO FLUTUANTE------\n");
printf ("[%.2f] e [%10.2f] \n", var_flutuante, var_flutuante);
printf ("[%e]\n", var_flutuante);
}
Formatação da escrita dados #include <stdio.h>
main() {
int var_inteiro = 345435, var_inteiro2 = 256;
float var_flutuante = 123.456;
char var_caractere = 'A';
printf("\n[%%]\n");
printf("\n------INTEIROS------\n");
printf ("[%d] e [%10d] e [%-10d] e [%010d]\n", var_inteiro, var_inteiro, var_inteiro, var_inteiro);
printf ("[%o]\n", var_inteiro2);
printf ("[%x]\n", var_inteiro2);
printf ("[%#o] e [%#x]\n", var_inteiro2, var_inteiro2);
printf ("O %%d vem do termo \"decimal\".\n");
printf("\n------CARACTERE------\n");
printf ("[%c]\n", var_caractere);
printf ("[%s]\n", "Um texto aqui.");
printf("\n------PONTO FLUTUANTE------\n");
printf ("[%.2f] e [%10.2f] \n", var_flutuante, var_flutuante);
printf ("[%e]\n", var_flutuante);
}
Leitura de dados do teclado
• Nos algoritmos utilizamos a função leia([var1, ...]);
• Na linguagem C utilizamos a função scanf(“%f%d ...”, &var1, &var2, ...);
• Parâmetros: ▫ Uma string, indicando os tipos das variáveis
que serão lidas e o formato dessa leitura. ▫ Uma lista de variáveis.
• Aguarda que o usuário digite um valor e atribui o valor digitado à variável.
Um exemplo
#include <stdio.h>
int main(){
int num;
printf("Digite um número: ");
scanf("%d", &num);
printf("O valor é: %d", num);
}
Um exemplo
#include <stdio.h>
int main(){
int num;
printf("Digite um número: ");
scanf("%d", &num);
printf("O valor é: %d", num);
}
Por que usamos “&” antes da variável?
Um exemplo
#include <stdio.h>
int main(){
int num;
printf("Digite um número: ");
scanf("%d",&num);
printf("O valor é %d\n", num);
printf("O endereço do valor é %d", &num);
}
Se o usuário informar 101. Os resultado serão: O valor é 101
O endereço do valor é 22935567 Onde “22935567” corresponde a um endereço de memória onde para onde a variável aponta
e armazena seu valor atual.
A função scanf espera ponteiros em seus parâmetros
O operador & (e comercial) retorna o endereço de memória da variável.
Buffer de teclado
• Após consecutivas leitura e escritas, pode haver “lixo” no buffer de leitura de teclado. A função abaixo limpa o buffer e garante uma leitura segura.
fflush(stdin);
Operadores aritméticos
• Sobre a divisão:
▫ 5/2 o resultado é 2.
▫ Quando pelo menos um dos operandos for ponto flutuante, então a divisão será fracionária.
▫ 5.0/2 o resultado é 2.5.
+ Adição
- Subtração
* Multiplicação
/ Divisão
% Resto da divisão
Quais os valores impressos?
#include <stdio.h>
int main(){
int a=5, b=2;
float c=5.0, d=2.0;
printf("%d \n“, a/b);
printf("%f \n", a/d);
printf("%f \n", c/d);
}
Precedência entre operadores
* e /
%
+ e –
• Para alterar a precedência SEMPRE use parênteses.
Incremento e decremento
• Incremento: a++ • Decremento: a--
• Também pode-se usar ++a e --a. Nesse caso, o
incremento/decremento ocorre antes da variável ser usada na expressão
• Exemplo: int a, b, c;
a = 6;
b = a++;
c = ++a;
printf(“%d %d %d”, a, b, c);
O que será impresso?
Comentários
• Use // para comentários de somente uma linha ▫ Exemplo: //autor: Fulano
• Use /* */ para comentários de várias linhas ▫ Exemplo: /* autor: Fulano
Data de criação: 01-02-2003 */
• Importantes para: identificar o algoritmo (autor, data de criação, propósito), descrever trechos importantes, explicar parâmetros e entrada, etc.
Operadores relacionais
== Igualdade
!= Diferença
> Maior que
>= Maior ou igual que
< Menor que
<= Menor ou igual que
O que será impresso? #include <stdio.h>
int main(void) {
int a, b;
printf("%d\n", 9 > 3);
printf("%d\n", (3*4)/2 != (2*3) );
a = 1;
b = -1;
printf("%d\n", a!=b);
return 0;
}
Operadores lógicos
• Exemplos a = 0;
b = 1;
(a !=b) && !(b == a)
!(a != b)
&& E
|| OU
! Não
Top Related