Sistemas Operacionais e Introdução à Programação Introdução à Lógica de Programação 1 Lógica de Programação Programação ● ● Tradução de um algoritmo para uma linguagem de programação Cada linguagem de programação possui sua sintaxe e construções #include <stdio.h> int main(int argc, char ** argv) { printf(“Hello world !\n”); return 0; } Programa em linguagem C 2 Lógica de Programação Linguagem C ● ● ● ● Linguagem de médio nível (quanto à abstração) ● Estruturas de controle e dados simples e expressivas ● Poucas restrições para o programador Criada em 1972 por Dennis Ritchie, no Bell Labs (AT&T), para codificar o sistema operacional Unix ● A intenção era facilitar sua implantação em novas plataformas (tipos de computador) A linguagem se difundiu durante os anos 70, por causa dos laços com o Unix e a existência de compiladores C Problemas de compatibilidade passaram a surgir devido a diferentes variações da linguagem ● Proposta uma padronização em 1983, chamada de ANSI C 3 Lógica de Programação Linguagem C: estrutura básica de um programa #include <stdio.h> ← Inclusão de definições de arquivo externo int main(int argc, char ** argv) ← Início do programa { ← demarcador de início de bloco printf(“Hello world !\n”); return 0; } ← demarcador de fim de bloco 4 Lógica de Programação Linguagem C: estrutura básica de um programa #include <stdio.h> ← Inclusão de definições de arquivo externo int main(int argc, char ** argv) ← Início do programa { ← demarcador de início de bloco int x; ← declaracão de variável x = 0; printf(“x = %d\n”, x); x = x + 1; printf(“x = %d\n”, x); return 0; } ← demarcador de fim de bloco 5 Lógica de Programação Linguagem C: estrutura básica de um programa ● Programa em C é composto por um conjunto de funções A principal função se chama main, e corresponde ao início do programa ● int main(int argc, char ** argv) ← Início do programa { ← demarcador de início de bloco ... } ← demarcador de fim de bloco 6 Lógica de Programação Linguagem C: estrutura básica de um programa ● Variáveis são declaradas no início de um bloco int main(int argc, char ** argv) { int x; ← Início do programa ← demarcador de início de bloco ← declaração de variável ... } ← demarcador de fim de bloco 7 Lógica de Programação Linguagem C: estrutura básica de um programa ● As sentenças são terminadas por ; int main(int argc, char ** argv) ← Início do programa { ← demarcador de início de bloco int x; ← declaração de variável x = 0; printf(“x = %d\n”, x); x = x + 1; printf(“x = %d\n”, x); return 0; } ← Sentenças ← demarcador de fim de bloco 8 Lógica de Programação Linguagem C: estrutura básica de um programa ● Operação de atribuição: operador “=” ● Funções úteis: ● ● ● scanf(“%d”, &x): leitura de um número inteiro (variável x deve ser do tipo int) printf(“Valor de x = %d\n”, x): mostra mensagem na tela, podendo usar valores de variáveis Para ambas as funções, dependendo do tipo de variável deve-se usar um formatador diferente. Nos exemplos, “%d” corresponde a números inteiros. 9 Lógica de Programação Linguagem C: estrutura básica de um programa Programas modulares: funções e outras definições contidas em outros arquivos podem ser incluídas ● #include <stdio.h> ← Inclusão de definições externas int main(int argc, char ** argv) { int x; ← Início do programa ← demarcador de início de bloco ← declaração de variável x = 0; printf(“x = %d\n”, x); x = x + 1; printf(“x = %d\n”, x); return 0; } ← Sentenças ← demarcador de fim de bloco 10 Lógica de Programação Linguagem C: estrutura básica de um programa ● Programas ficam guardados em arquivos com extensão .c ● Definições ficam guardadas em arquivos com extensão .h ● ● ● ● Arquivos de definições a rigor não contêm implementações de funções Esses arquivos contêm apenas as declarações, que informam que determinadas funções e estruturas de dados existem As funções declaradas estão em outros arquivos .c, ou já compiladas e guardados em arquivos de bibliotecas. Por convenção, arquivos .h ficam no subdiretório /usr/include 11 Lógica de Programação Linguagem C: do programa C ao arquivo executável Programas C não são executáveis ● O processador não entende as construções da linguagem C ● O processador somente executa instruções de código de máquina ● Para transformar um programa C em executável, usam-se programas tradutores ● Compilador Assemblador Linkador 12 Lógica de Programação Linguagem C: do programa C ao arquivo executável ● Programas tradutores: ● Compilador: transforma programa C para Assembly ● Assemblador: transforma programa Assembly para código de máquina ● Linkador: une programas em código de máquina e os torna executáveis 13 Lógica de Programação Linguagem C: ferramentas do Linux ● gcc (Gnu Compiler Collection): Compilador C no Linux: ● Inclui as três tarefas de geração de arquivo executável: ● Compilação (compiling) ● Montagem (assembly) ● Ligação (linkage) Programa hello.c #include <stdio.h> int main(int argc, char ** argv) { printf(“Hello world !”); } Compilação de hello.c > gcc -o hello hello.c > ls -l hello -rwxr-xr-x 1 sobral users 9361 2009-05-04 12:42 hello > ./hello Hello world! > 14 Lógica de Programação Linguagem C: ferramentas do Linux ● gdb (Gnu Debugger): Depurador (debugador) no Linux: ● Possibilita a execução monitorada de um programa ● Ajuda a acompanhar a sequência de execução ● Possibilita visualizar os valores de variáveis ● Ajuda a localizar erros ● Portanto, ferramenta fundamental para auxílio no desenvolvimento de programas ! 15 Lógica de Programação Linguagem C: ferramentas do Linux ● gdb (Gnu Debugger): Depurador (debugador) no Linux: ● Obs: programa deve ser compilado usando-se opção -g (ex: gcc -g -o hello hello.c) ● Essa opção armazena no executável informações sobre o código fonte > gdb hello GNU gdb 6.8 Copyright (C) 2008 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i586-suse-linux"... (gdb) 16 Lógica de Programação Linguagem C: ferramentas do Linux ● gdb (Gnu Debugger): comandos: ● break {função | linha de arquivo}: define um breakpoint; o depurador para a execução do programa ao encontrar um breakpoint ● next: executa a linha de programa atual ● step: executa a linha atual; se for uma chamada de função, entra dentro da função ● cont: continua a execução até o próximo breakpoint, ou até o fim do arquivo ● display var: mostra o valor da variável var ● help: mostra a ajuda 17 Lógica de Programação Linguagem C: ferramentas do Linux ● gdb (Gnu Debugger): exemplo: (gdb) break main Breakpoint 1 at 0x80483e5: file hello.c, line 4. (gdb) run Starting program: /home/sobral/Cefet/SOP/Aulas/C/hello Breakpoint 1, main () at hello.c:4 4 printf("Hello world !\n"); (gdb) next Hello world ! 5 } (gdb) next 0xb7eef5f5 in __libc_start_main () from /lib/libc.so.6 (gdb) 18 Lógica de Programação Linguagem C: ferramentas do Linux ● gdb (Gnu Debugger): exemplo: #include <stdio.h> int main(int argc, char ** argv) { int x; x = 0; while (x < 5) { printf("Hello world %d !\n", x); x = x + 1; } } (gdb) run Starting program: /home/sobral/hello2 Breakpoint 1, main () at hello2.c:6 6 x = 0; (gdb) display x 1: x = -1207015856 (gdb) next 7 while (x < 5) { 1: x = 0 (gdb) next 8 printf("Hello world %d !\n", x); 1: x = 0 (gdb) 19 Lógica de Programação Exercícios: edite seus programas com o editor vi, compileos com gcc, e depure-os com gdb. 1) Faça um programa que leia cinco valores inteiros e mostre sua média 2) Modifique o programa acima para que mostre o desvio padrão desse conjunto de valores 3) Faça um programa para calcular a comissão de 5% dada a vendedores de peças, usando os seguintes dados: identificação do vendedor, código da peça, preço unitário da peça e quantidade de peças vendidas. Faça um teste de mesa de seu algoritmo usando o gdb. 20