(Parte 1 de 10)

Aprendendo

Programar

Programando na Linguagem C

Para Iniciantes

Jaime Evaristo

Terceira Edição Revisada/Ampliada

Edição Digital

(cópias autorizadas)

Aprendendo

Programar

Programando na Linguagem C

Jaime Evaristo

Professor Adjunto

Instituto de Computação Universidade Federal de Alagoas

Aos meus netos Mateus, Vitor e Lucas

1 Introdução à Programação4
1.1 Organização básica de um computador4
1.2 Linguagem de máquina4
1.3 Programas de computadores5
1.4 Lógica de programação6
1.5 Resolução de problemas6
1.6 Processador de um algoritmo9
1.7 Exemplos de algoritmos matemáticos10
1.8 Linguagens de alto nível13
1.9 Sintaxe e semântica de uma instrução14
1.10 Sistemas de computação14
1.1 Exercícios propostos15
2. Introdução à Linguagem C17
2.1 Variáveis simples17
2.2 Constantes18
2.3 Expressões aritméticas19
2.4 Relações20
2.5 Expressões lógicas20
2.6 Estrutura de um programa em C21
2.7 Entrada dos dados de entrada21
2.8 Saída de dados23
2.9 Comando de atribuição28
2.10 Exemplos Parte I30
2.1 Funções de biblioteca3
2.12 Exercícios propostos34
3 Estruturas de seleção36
3.1 O que é uma estrutura de seleção36
3.2 O comando if36
3.3 O comando if else37
3.4 O operador condicional ternário38
3.5 Exemplos Parte I38
3.6 O comando switch4
3.7 Exemplos Parte I45
3.8 Exercícios propostos47
4. Estruturas de repetição49
4.1 Para que servem as estruturas de repetição49
4.2 O comando for50
4.3 O comando while52
4.4 O comando do while56
4.5 O comando break em estruturas de repetição57
4.6 Exemplos Parte IV58
4.7 Exercícios propostos63
5. Funções e ponteiros65
5.1 O que são funções65
5.2 Para que servem funções67
5.3 Passagem de parâmetros68

Sumário 5.4 Ponteiros.................................................................................................................................. 72

5.6 Uma urna eletrônica73
5.7 Recursividade75
5.8 Usando funções de outros arquivos79
5.9 "Tipos" de variáveis80
5.10 Uma aplicação à História da Matemática82
5.1 Exercícios propostos83
6 Vetores84
6.1 O que são vetores84
6.2 Declaração de um vetor unidimensional84
6.3 Vetores e ponteiros85
6.4 Lendo e escrevendo um vetor85
6.5 Exemplos Parte IV86
6.6 Vetores multidimensionais90
6.7 Exemplos Parte V92
6.8 Uma aplicação esportiva94
6.9 Exercícios propostos95
7 Pesquisa e ordenação9
7.1 Introdução9
7.2 Pesquisa sequencial9
7.3 Pesquisa binária9
7.4 Ordenação101
7.5 Exercícios propostos103
8. Cadeias de caracteres (strings)104
8.1 Introdução104
8.2 Funções de biblioteca para manipulação de cadeias de caracteres105
8.3 Exemplos Parte VI107
8.4 Exercícios propostos1
9 Estruturas e Arquivos113
9.1 O que são estruturas113
9.2 Exemplos Parte VII114
9.3 O que são arquivos116
9.4 Arquivos de registros (Arquivos binários)117
9.5 Arquivo texto126
9.6 Exercícios propostos130
10 Noções básicas de alocação dinâmica de memória132
10.1 O que é alocação dinâmica132
10.2 Armazenando dinamicamente um polinômio133
10.3 Listas134
10.4 Exercícios propostos136
Bibliografia137

5.5 Passagem de parâmetros por referência no Turbo C 2.01.......................................................73 Índice remissivo................................................................................................................................138

1 Introdução à Programação

1.1 Organização básica de um computador

Um computador é constituído de quatro unidades básicas: unidade de entrada, unidade de saída, unidade de processamento central e memória. Como indica sua denominação, uma unidade de entrada é um dispositivo que permite que o usuário interaja com o computador, fornecendo-lhe dados e informações que serão processadas, sendo o teclado o seu exemplo mais trivial. Uma unidade de saída, por seu turno, serve para que sejam fornecidos ao usuário do computador os resultados do processamento realizado. O monitor de vídeo e uma impressora são exemplos de unidades de saída. A unidade central de processamento é responsável por todo o processamento requerido, sendo muito conhecida por cpu, acrossemia de central processing unit. Já a memória armazena dados e informações que serão utilizados no processamento, armazenamento temporário, pois quando o computador é desligado tudo que está nela armazenado deixa de sê-lo (dizemos que toda a memória é "apagada").

Linguagens decomunicação

1.2 Linguagem de máquina

Evidentemente, há a necessidade de que as unidades que compõem um computador se comuniquem umas com as outra. Por exemplo, um dado fornecido pelo teclado deve ser armazenado na memória; para a cpu realizar uma operação aritmética, ela vai “buscar” valores que estão armazenados na memória, e assim por diante. Para que haja comunicação entre as unidades do computador é necessário que se estabeleça uma linguagem.

Os seres humanos se comunicam basicamente através de duas linguagens: a linguagem escrita e a fala.

Uma comunicação através de uma linguagem escrita é constituída de parágrafos, os quais contêm períodos, que contêm frases, que são constituídas de palavras, sendo cada uma das palavras formadas por letras e esta sequência termina aí. Assim, uma letra é um ente indivisível da linguagem escrita e, em função disto, é chamada símbolo básico desta linguagem. Este exemplo foi apresentado para que se justifique a afirmação de que toda linguagem requer a existência de símbolos básicos, como - e para mais um exemplo - os fonemas para a linguagem falada.

A linguagem de comunicação entre as unidades

Como a comunicação entre as unidades do computador teria que ser obtida através de fenômenos físicos, os cientistas que conceberam os computadores atuais estabeleceram dois símbolos básicos para a linguagem. Esta quantidade de símbolos foi escolhida pelo fato de que através de fenômenos físicos é muito fácil obter dois estados distintos e não confundíveis, como passar corrente elétrica/não passar corrente elétrica, estar magnetizado/não estar magnetizado, etc., podendo cada um destes estados ser um dos símbolos. Assim a linguagem utilizada para comunicação interna num computador, chamada linguagem de máquina, possui apenas dois símbolos. Cada um destes símbolos é denominado bit (binary digit) e eles são representados por 0 (zero) e 1 (um). Esta forma de representar os bit's justifica a sua denominação: binary digit, que significa dígito binário (além disto, bit em inglês significa fragmento). Portanto, as palavras da linguagem de máquina são sequências de bits, ou seja, sequências de dígitos zero e um.

O código ASCII

Para que haja a possibilidade da comunicação do homem com o computador, é necessário que as palavras da linguagem escrita sejam traduzidas para a linguagem de máquina e vice-versa. Para que isto seja possível, é necessário que se estabeleça qual a sequência de bit's que corresponde a cada caractere usado na linguagem escrita. Ou seja, é necessário que se estabeleça uma codificação em sequência de bit's para cada um dos caracteres. Uma codificação muito utilizada é o código ASCII (American Standard Code for Information Interchange ou Código Padrão Americano para Intercâmbio de Informações), estabelecido pelo ANSI (American National Standards Institute). Nesta codificação, cada caractere é representado por uma sequência de oito bits (normalmente, um conjunto de oito bit's é chamado byte). Só para exemplificar (será visto ao longo do livro que, em geral, não há necessidade de que se conheça os códigos dos caracteres), apresentamos a tabela abaixo com os códigos ASCII de alguns caracteres.

Tabela 1 Códigos ASCII de alguns caracteres

Caractere Código ASCII

Observe a necessidade de se haver codificado o espaço em branco (este "caractere" é utilizado para separar nossas palavras) e de se haver codificado diferentemente as letras maiusculas e minúsculas, para que se possa considerá-las como coisas distintas.

Levando em conta que cada sequência de zeros e uns pode ser vista como a representação de um número inteiro no sistema binário de numeração [Evaristo, J 2002], podemos, até para facilitar a sua manipulação, associar a cada código ASCII o inteiro correspondente, obtendo assim o que se costuma chamar de código ASCII decimal. Por exemplo, como 1000001 é a representação do número (decimal) 65 no sistema binário de numeração, dizemos que o código ASCII decimal de A é 65.

1.3 Programas de computadores

Para que um computador tenha alguma utilidade, ele deve executar um programa que tenha uma finalidade específica. Games são programas que têm como objetivo propiciar entretenimento aos seus usuários. Processadores de texto são programas que permitem que textos sejam digitados, impressos e armazenados para futuras modificações ou impressões. Planilhas eletrônicas são programas que oferecem recursos para manipulação de tabelas de valores numéricos. Navegadores permitem acessos a páginas da internet, a rede mundial de computadores. Estes programas destinam-se a usuários finais, aquelas pessoas que vão utilizar o computador com um determinado objetivo específico, usando para tal um programa que ela aprendeu a usar, não tendo nenhuma preocupação relativa ao funcionamento interno do sistema computador/programa. Por exemplo, um usuário de um processador de texto deve aprender o que fazer para que o processador destaque em negrito alguma parte do texto ou localize uma palavra, não havendo necessidade de saber como o programa realiza estas ações.

Na verdade, para que um processador de texto propicie ao usuário a possibilidade de que textos sejam digitados, corrigidos, gravados, inseridos em outros textos e de que palavras sejam localizadas dentro de um texto, é necessária a execução de muitas instruções com objetivos bem mais específicos e restritos. Um programa de computador é, na realidade, um conjunto de instruções que podem ser executadas pelo computador, de tal forma que a execução de subconjuntos destas instruções permitem a realização de ações mais genéricas.

É muito grande o número de instruções dos programas citados acima, chegando à casa dos milhares.

Rigorosamente falando, um programa dos acima citados são conjunto de programas menores, cada um deles com objetivos mais restritos, e que podem ser executados de forma integrada. É comum se utilizar a palavra inglesa software para designar um conjunto de programas com objetivos mais restritos que, sendo executados de forma integrada, propiciam a execução de ações bem mais genéricas.

A parte da Ciência da Computação que trata do desenvolvimento de softwares é denominada

Engenharia de Software. Naturalmente, o estudo da Engenharia de Software deve ser precedido da aprendizagem do desenvolvimento de programas “menores”, ação que comumente é denominada de Programação de Computadores.

1.4 Lógica de programação

Sendo um conjunto de instruções cujas execuções redundam na realização da tarefa para a qual foi desenvolvido, o desenvolvimento de um programa requer a utilização de um raciocínio ímpar em relação aos raciocínios utilizados na solução de problemas de outros campos do saber. Por exemplo (e de forma simplificada) ao se tentar resolver um problema de Mecânica Newtoniana deve-se procurar capturar da especificação da questão as grandezas físicas envolvidas e aplicar as fórmulas que relacionam estas grandezas.

Para se desenvolver um programa que resolva um determinado problema é necessário que encontremos uma sequência de instruções que cujas execuções resultem na solução da questão. É comum se utilizar a termo algoritmo para indicar uma sequência de instruções que resolvem um dado problema, ficando, neste caso, o termo programa para indicar um algoritmo que pode ser executado num computador. A Lógica de Programação pode ser entendida como o conjunto de raciocínios utilizados para o desenvolvimento de algoritmos (e, portanto, de programas).

Por exemplo, imagine a seguinte questão: um senhor, infelizmente bastante gordo, está numa das margens de um rio com uma raposa, uma dúzia de galinhas e um saco de milho. O senhor pretende atravessar o rio com suas cargas, num barco a remo que só comporta o senhor e uma das cargas. Evidentemente, o senhor não pode deixar em uma das margens, sozinhos, a raposa e a galinha, nem a galinha e o milho. A questão é escrever um algoritmo que oriente o senhor a realizar o seu intento. Naturalmente, na primeira viagem, ele não pode levar a raposa (neste caso, as galinhas comeriam o milho), nem o milho (caso em que a raposa devoraria as galinhas). Logo, na primeira viagem ele deve levar as galinhas. Como ele estará presente na chegada, na segunda viagem ele pode levar a raposa ou o milho. Mas, e a volta para apanhar terceira carga? A solução é ele voltar com as galinhas e, aí, atravessar o milho, já que não há problema em que a raposa e o milho fiquem juntos. Escrevendo as instruções na sequência em que elas devem ser executadas, teremos o seguinte algoritmo.

1. Atravesse as galinhas. 2. Retorne sozinho. 3. Atravesse a raposa. 4. Retorne com as galinhas. 5. Atravesse o milho. 6. Retorne sozinho. 7. Atravesse as galinhas.

1.5 Resolução de problemas

Uma pergunta que o leitor pode estar se fazendo é: como vou "descobrir" que a primeira instrução deve ser a travessia das galinhas? Algumas tarefas para as quais se pretende escrever um algoritmo podem ser vistas como um problema a ser resolvido. O exemplo anterior é um exemplo claro de uma tarefa com esta característica. Existem algumas técnicas que podem ser utilizadas para a resolução de problemas. No exemplo anterior, para se definir qual seria a primeira instrução, como existem apenas três possibilidades, verifica-se o que aconteceria ao se escolher determinada instrução. Foi o que, de passagem, foi feito acima: se o homem atravessasse primeiro o milho, a raposa devoraria as galinhas; se o homem atravessasse primeiro a raposa, as galinhas comeriam o milho. Neste caso, podemos dizer que foi utilizada a técnica da exaustão: como o número de alternativas era pequeno, analisamos todas elas, uma a uma.

Esta técnica pode ser utilizada também na solução do seguinte problema: dispõe-se de três esferas idênticas na forma, sendo duas delas de mesmo peso e a terceira de peso maior. A questão é descobrir qual a esfera de peso diferente, realizando-se apenas uma pesagem numa balança de dois pratos. Para isto chamemos de A e B as esferas de mesmo peso e de C a de maior peso. Se optarmos por colocar duas esferas num dos pratos e a outra esfera no outro, temos as seguintes possibilidades:

a) (A+B, C). b) (A+C, B). c) (B+C, A).

No primeiro caso, pode acontecer qualquer coisa: a balança pode ficar equilibrada, se Peso(C) =

Peso(A+B); ficar inclinada para o lado esquerdo, se Peso(C) > Peso(A+B) ou ficar inclinada para o lado direito se Peso(C) < Peso(A+B). Observe que nada pode distinguir a esfera C. Nos dois últimos casos, a balança se inclinará para a esquerda, mas, outra vez, nada distingue a esfera C. Por exaustão, resta então escolhermos duas esferas e colocarmos cada uma delas num dos pratos da balança. Agora os casos possíveis são:

(Parte 1 de 10)

Comentários