




























































































Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Apostila de introdução a programação em C
Tipologia: Notas de estudo
1 / 139
Esta página não é visível na pré-visualização
Não perca as partes importantes!





























































































Computação I – ECA301 (2006) Informações sobre o curso
A média de aproveitamento (MA) será calculada pela expressão:
em que MS1 e MS2 representam as médias de trabalhos do primeiro e segundo semestre, calculadas pela média aritmética simples das notas de trabalho de cada um dos semestres. De acordo as normas vigentes na EEM:
Literatura indicada
Literatura adicional
Computação I – ECA301 (2006) Informações sobre o curso
Compilador C
O compilador utilizado no curso é o Dev-C++ (versão 4.9.9.2), disponível para download gratuito no endereço http://www.bloodshed.net/devcpp.html. Para uso doméstico, o aluno poderá utilizar qualquer compilador C/C++ compatível com o padrão ANSI.
Atividades em laboratório
Avaliação dos trabalhos
A disciplina utilizará o suporte de um ambiente de Educação à Distância (EaD) acessível pelo endereço www.ead.maua.br. Nele serão realizadas interações com os alunos a partir de listas de discussão, fóruns e atividades que serão utilizadas para geração de parte das notas de trabalho.
Existe um formulário eletrônico para comunicações na página da disciplina, hospedada no website do IMT (www.maua.br/cursos). Sugere-se também que o aluno acesse, sempre que possível, o sistema de Educação à Distância, pois nele serão divulgados avisos e informações importantes para o acompanhamento do curso.
Documento atualizado em 10.02.
Computação I – ECA301 (2006) Informações sobre o curso
Aula 14 : Semana 31 (de 01.08 a 05.08) Listas ligadas I
Aula 15 : Semana 32 (de 07.08 a 12.08) Listas ligadas II
Aula 16 : Semana 33 (de 14.08 a 19.08) Estruturas dinâmicas de dados
Aula 17 : Semana 34 (de 21.08 a 26.08) Grafos
Aula 18 : Semana 35 (de 28.08 a 02.09) Árvores binárias
Semana 36 (de 04.09 a 09.09) Não haverá aula
Aulas suspensas – 3ª prova de 2006
Aula 19 : Semana 39 (de 25.09 a 30.09) Otimização em redes
Aula 20 : Semana 40 (de 02.10 a 07.10) Tópicos em programação
Semana 41 (de 09.10 a 14.10) Não haverá aula
Aula 21 : Semana 42 (de 16.10 a 21.10) Noções de Inteligência Artificial I
Aula 22 : Semana 43 (de 23.10 a 28.10) Noções de Inteligência Artificial II
Semana 44 (de 30.10 a 04.11) Não haverá aula
Aulas suspensas – 4ª prova de 2006
ECA301 – Computação I (2006) 1 – Conceitos básicos
1 - Conceitos básicos
Neste capitulo serão discutidos os principais paradigmas de programação e sua relação com os tipos de linguagens de programação existentes. Ao final do capítulo, serão comentadas as principais características da linguagem C, linguagem a ser usada no curso.
Paradigmas de programação são modelos, padrões ou estilos de programação, suportados por linguagens que agrupam certas características comuns.
1.1.1 Programação não-estruturada
É um modo de programação essencialmente seqüencial com o uso de desvios controlados ou incondicionais, que permitem a simulação de estruturas de programação e sub-rotinas. Linguagens não-estruturadas são usadas em situações didáticas (Basic) ou para programação específica em baixo nível ( Assembly ). Programas não-estruturados são extremamente flexíveis, mas de difícil manutenção pela existência dos desvios.
1.1.2 Programação estruturada
A forma mais difundida de programar computadores, e que deu origem a linguagens como C e Pascal é um paradigma centrado no conceito de variáveis e comandos. Neste paradigma, os programas são decompostos em passos de processamento que usam sub-rotinas ou procedimentos, o que faz com que também seja chamado de paradigma procedural.
Uma grande vantagem da programação estruturada sobre a não-estruturada é o alto índice de reaproveitamento de código, já que as sub-rotinas podem ser agrupadas em bibliotecas e utilizadas por outros programas. O uso de sub-rotinas também se presta à modularização e encapsulamento funcional.
O paradigma da programação estruturada tem base no Teorema de Bohm e Jacopini, que afirma que qualquer programa pode ser criado a partir de três tipos de estruturas de programação: seqüencial, condicional e repetitiva.
1.1.3 Programação orientada a objetos e eventos
Trata-se de um paradigma que procura modelar computacionalmente objetos do mundo real. Para isso, utiliza o conceito de classes , definindo um programa como um conjuntode objetos (instâncias das classes), cada um com suas propriedades e métodos. É talvez o paradigma de maior expressão no mercado atual, implementado em linguagens como C++, Java e Object Pascal, usada no ambiente Delphi.
As classes e os objetos constituem uma forma de se encapsular informações e comandos em uma única estrutura, criando camadas de proteção aos dados e permitindo que se faça deles uma ramificação posterior ( herança ). Enquanto os outros paradigmas dão maior ênfase às ações do programa, deixando os dados em segundo plano, este busca tratar ambos com o mesmo grau de importância. Com isto, o índice de reaproveitamento de código se torna muito maior, permitindo o desenvolvimento mais rápido de aplicativos grandes e complexos.
Um programa de computador é um conjunto instruções que representam um algoritmo para a resolução de um determinado problema. Essas instruções devem ser escritas por meio de um conjunto de símbolos e palavras, cujas regras de estruturação lógica e sintática formam uma linguagem de programação.
ECA301 – Computação I (2006) 1 – Conceitos básicos
programação e seu conteúdo não pode ser alterado. Os interpretadores , por outro lado, traduzem e executam instruções isoladas ou pequenos grupos de instruções por vez, dentro de um ambiente de programação. O interpretador precisa estar presente a cada execução do programa-fonte para a checagem da sintaxe e conversão do código.
Toda linguagem de alto nível precisa ter seu próprio compilador ou interpretador para um determinado computador ou família de computadores. Por exemplo, programas em linguagem Java se servem de uma máquina virtual, conhecida como Java Virtual Machine , que é, na prática, um interpretador desenvolvido para o hardware em que o programa irá rodar. A portabilidade do código Java é oriunda desta máquina virtual. Para o caso de programas compilados, o arquivo executável deve ser criado (compilado) especificamente para a plataforma desejada.
Em programas complexos é desejável que a rotina principal não seja muito extensa, contendo apenas chamadas a sub-rotinas que indiquem, em linhas gerais, a utilidade do programa. Esta abordagem, implementada pela técnica Top-Down , facilita a interpretação de como um programa funciona e permite que se identifique com facilidade em que ponto do código pode haver algum problema.
Nesta técnica, o problema original é dividido em pequenas partes que possam ser facilmente entendidas e resolvidas. Este processo inicial de análise permite a resolução de um problema complexo, separando-o em soluções mais simples. Em uma segunda etapa, faz-se o processo inverso, realizando uma síntese da solução final a partir das soluções separadas.
A técnica Top-Down possui este nome porque analisa primeiramente um problema como um todo (Top), identificando a seguir uma primeira divisão deste em subproblemas menores (Down). O processo é realizado desta forma até que não seja mais necessária nenhuma subdivisão.
A linguagem C é uma linguagem estruturada genérica de alto nível^1 , criada por (e para) programadores, tendo como metas principais a flexibilidade e a portabilidade. Por ter nascido juntamente com o advento da teoria de linguagem estruturada e do computador pessoal, é uma linguagem que se tornou rapidamente popular entre os programadores. Foi usada para desenvolver o sistema operacional UNIX, e, mais recentemente, as linguagens C++ e Java. Algumas características da linguagem C:
A linguagem C foi desenvolvida nos anos 80 por Dennis Ritchie nos laboratórios da Bell Telephones Inc. como uma ramificação das linguagens BCPL e B. Seu uso ficou restrito à Bell até 1978 quando, juntamente com Brian Kernighan, Ritchie publicou uma descrição da linguagem, conhecida como K&R C.
(^1) Alguns autores classificam a linguagem C como sendo de médio nível , por combinar elementos de linguagens
de alto nível – estruturação, compartimentalização – com a funcionalidade da linguagem Assembly.
ECA301 – Computação I (2006) 1 – Conceitos básicos
As características de portabilidade e estruturação da linguagem tornaram-na muito popular: diversos compiladores e interpretadores C foram escritos para computadores de todos os tamanhos e muitas aplicações comerciais foram desenvolvidas. Além disso, muitos softwares escritos originalmente em outras linguagens foram reescritos em C, como o sistema operacional Unix, escrito originalmente em Assembly.
A maioria das implementações comerciais de C criadas inicialmente diferia ligeiramente da definição original de Kernighan e Ritchie, gerando incompatibilidades e diminuindo a portabilidade que a linguagem tentou oferecer. Como conseqüência disso, o American National Standards Institute (ANSI) iniciou, em 1983, um trabalho de padronização da linguagem C cujo resultado é conhecido hoje como ANSI C. Atualmente, todos os compiladores e interpretadores comerciais adotam o padrão ANSI, além de oferecer recursos adicionais próprios.
Em 1990 a Borland International Co ., fabricante de compiladores profissionais, escolheu as linguagens C e Pascal como linguagens de trabalho para seus ambientes integrados de desenvolvimento, o Turbo C e o Turbo Pascal. Em 1992, C tornou-se ponto de concordância entre teóricos do desenvolvimento da teoria de programação orientada a objetos, o que resultou na criação da versão orientada a objetos de C, conhecida como C++.
ECA301 – Computação I (2006) 2 – Expressões, entrada e saída de dados
Tipo Espaço ( bytes ) Armazenamento char 1 -128 a 127 unsigned char 1 0 a 255 int 4 -2.147.483.648 a 2.147.483. unsigned int 4 0 a 4.294.967. short int 2 -32.768 a 32. unsigned short int 2 0 a 65535 long int 4 idem a int unsigned long int 4 idem a int long long int 8 Ver a seguir float 4 ± 1,17.10 -38^ a ± 3,40.10 38 double 8 ± 2,22.10 -308^ a ± 1,79.10 308 long double 12 ± 2,22.10 -4932^ a ± 1,79.10 4932
Tabela 2.1: espaço de memória ocupado por variáveis
O tipo de dados long long int é um tipo inteiro de 8 bytes , suportado por alguns compiladores (como o Dev-C++). A faixa de armazenamento desse tipo de dados (com sinal) é de -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 ou de 0 a 2 64 (sem sinal).
2.2.1 Declaração de variáveis
A declaração de variáveis é feita sempre no início de um bloco de código, usando-se o nome do tipo de dados seguido pelo nome da variável ou por uma lista de nomes de variáveis. Exemplos:
int x,y; float a,b,c = 2.2; char opcao;
Uma variável declarada no corpo de uma função é uma variável local , reconhecida apenas pela função. Uma variável declarada fora do corpo de uma função é global , sendo reconhecida por todas as funções que estiverem após o ponto em que for feita a declaração.
Os nomes dados às variáveis e funções de um programa, chamados de identificadores , devem respeitar regras básicas, comuns à maioria das linguagens de programação: iniciar sempre por um caractere ou sublinhado, não conter espaços ou caracteres acentuados, etc.
Ao contrário da maioria das linguagens de programação, a linguagem C não possui comandos internos para entrada e saída de dados, dependendo de funções de biblioteca. A maneira mais simples de realizar entrada e saída de dados em linguagem C é pelo uso das funções genéricas scanf e printf.
A linguagem C é sensível à caixa, ou seja, identificadores como nome e Nome representam variáveis ou funções diferentes. Além disso, existem palavras de uso reservado que não podem ser usadas como identificadores (ver Apêndice 6).
ECA301 – Computação I (2006) 2 – Expressões, entrada e saída de dados
2.3.1 Exibição de dados usando a função printf
A função printf , definida no arquivo de cabeçalho^2 stdio.h , imprime valores de uma lista de argumentos, formatados de acordo com uma string de controle, que pode incluir textos estáticos e especificadores de formatação. Exemplo:
printf("Valor da área = %f",A);
Esta instrução exibe na tela a frase " Valor da área = " (sem as aspas), seguida pelo valor armazenado na variável A , formatado como um número em ponto flutuante pelo especificador de formatação " %f ". Os especificadores mais usados na prática, além de " %f " (para números reais), são " %i " (para valores inteiros), " %c " (para um caractere) e " %s " (para textos). Na exibição de valores em ponto flutuante é possível controlar a quantidade de casas decimais exibidas, usando " %. n f ", sendo n o número desejado de casas decimais^3. Cada especificador de formatação deve ter uma variável ou expressão correspondente na lista de argumentos. Exemplo:
printf("A área do círculo de raio %f vale %.2f",raio, A);
A existência da string de controle é obrigatória, mas a lista de argumentos não tem sentido na impressão de textos fixos. Para pular uma linha é preciso usar a seqüência de escape ' \n ', no ponto do texto em que deve ocorrer o salto. Por exemplo, a instrução
printf("Linha 1 \n Linha 2\n\nLinha3");
produzirá o seguinte resultado:
Linha 1 Linha 2
Linha 3
2.3.2 Leitura de dados usando a função scanf
A função de leitura geral scanf , definida no arquivo de cabeçalho stdio.h , lê e formata informações do dispositivo de entrada padrão do computador. De forma semelhante à função printf , a função scanf utiliza uma string de controle e especificadores de formatação para indicar como o valor de entrada será tratado (ver Apêndice 3).
Por exemplo, a instrução a seguir lê um valor digitado no teclado, formata-o como um valor em ponto flutuante e o armazena na variável raio.
(^2) Arquivos de cabeçalho são discutidos nos capítulos 3 e 5. (^3) O Apêndice 1 mostra exemplos de uso da função printf com outros especificadores de formatação.
String de controle
Lista de argumentos
Especificador de formatação
ECA301 – Computação I (2006) 2 – Expressões, entrada e saída de dados
Neste caso, o resultado correto pode ser obtido se um dos operandos for entendido como um valor de ponto flutuante por meio de uma conversão temporária para float. Exemplo:
float x; /* Declaração de variável float */
x = 5/2; /* INCORRETO: x recebe 2.0 */ x = ( float )5/2; /* CORRETO: x recebe 2.5 */
Outras opções que fornecem o resultado correto:
x = 5/( float )2; x = 5.0/2; x = 5/2.0; x = 5.0/2.0;
2.4.1 Atividade
Elabore um programa em linguagem C para calcular a força exercida pela coluna de um líquido sobre a área da válvula de um reservatório. Considere como dados de entrada do problema a altura h (m) do reservatório, o diâmetro d (m) da válvula e o peso específico γ do líquido (N/m 3 ). O resultado final deve ser o valor da força exercida (em Newtons) calculada como:
⋅ ⋅ d^2 ⋅ h ←
Solução
/* FORCA.C - Última modificação em 13/02/2006 / / Objetivo: Ilustrar a programação básica em C */
/* Diretivas de compilação */ #include <stdio.h> #define PI 3. main() { float h,d,gama,F; /* Declaração de variáveis */
printf("Cálculo de força\n"); printf("Altura do reservatório: "); scanf("%f",&h);
printf("Diâmetro da válvula: "); scanf("%f",&d);
printf("Peso específico do líquido: "); scanf("%f",&gama);
F = (PIgamaddh)/4;
printf("Valor da força exercida = %f",F); }
ECA301 – Computação I (2006) 2 – Expressões, entrada e saída de dados
Toda expressão válida em linguagem C possui um valor numérico. Por exemplo, a expressão A = (12/2)3 – (3+5)/2* resulta igual a 14. Este valor é calculado de acordo com as regras de precedência da linguagem, ilustradas na tabela 2.2, em que os operadores de maior prioridade aparecem no topo da tabela^4.
Operadores ( ) [ ]. (operador ponto) -> (operador seta) Funções
Tabela 2.2: precedência dos operadores
Em uma expressão, todas as ocorrências de operadores unários e do operador condicional ternário ( ?: ) são avaliadas da direita para a esquerda. Os demais operadores são avaliados da esquerda para a direita.
2.5.1 Operadores aritméticos
A tabela 2.3 mostra os operadores aritméticos válidos em C.
Operador Ação
Tabela 2.3: operadores aritméticos
(^4) Alguns dos operadores mostrados na tabela serão discutidos nos próximos capítulos. Existem outros
operadores válidos em linguagem C que não estão relacionados na tabela 2.2!