




























































































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 C, resumo de toda a matéria de c
Tipologia: Slides
1 / 170
Esta página não é visível na pré-visualização
Não perca as partes importantes!





























































































S˜ao Paulo – 2010
Pref´acio
Esta apostila ´e uma compilac¸˜ao de notas de aulas de disciplinas de Introduc¸˜ao `a Ciˆencia da Computac¸˜ao ofereci- das pelo Departamento de Ciˆencia da Computac¸˜ao do IME/USP e tem por objetivo apresentar conceitos b´asicos de computac¸˜ao e programac¸˜ao por meio de exerc´ıcios pr´aticos.
Originalmente, a compilac¸˜ao destas notas de aulas foi realizada com o objetivo de apresentar um material de apoio para o curso n˜ao-presencial de MAC2166 oferecido aos alunos da Escola Polit´ecnica da USP. Tradicional- mente, a linguagem C ´e utilizada no ensino dessa disciplina, e por isso ela tamb´em ´e utilizada nessa apostila. Com este material pronto, pensamos que ele possa ser ´util tamb´em aos alunos de cursos presenciais.
Pela nossa experiˆencia, o m´etodo mais eficaz para aprender a programar ´e programando. Por isso, as notas de aula est˜ao organizadas na forma de resoluc¸˜ao de v´arios exerc´ıcios, com foco na resoluc¸˜ao de problemas, estruturando a soluc¸˜ao na forma de um programa, ao inv´es da simples descric¸˜ao de comandos da linguagem C.
Obviamente, cada professor confere `a sua aula um “sabor” e um “colorido” diferente: cada um tem sua pr´opria maneira de ensinar. Por isso, advertimos que n˜ao necessariamente estas notas de aulas ser˜ao seguidas pelo seu professor, mas de toda maneira, esperamos que esta apostila seja ´util para os alunos como material de estudo e de apoio em seu primeiro contato com um curso introdut´orio de computac¸˜ao e programac¸˜ao.
Vale a pena ressaltar que estas notas de aula s˜ao resultado de uma experiˆencia e de um esforc¸o conjunto de muitos professores do departamento que j´a ministraram estas disciplinas. Por isso, queremos deixar aqui nosso reconhecimento deste esforc¸o e tamb´em nossos agradecimentos.
Um bom estudo!
S˜ao Paulo, janeiro de 2010.
Carlos Hitoshi Morimoto e Ronaldo Fumio Hashimoto
1 Como Funciona um Computador
Carlos H. Morimoto e Thiago T. Santos
O objetivo dessa aula ´e apresentar uma breve descric¸˜ao do funcionamento de um computador, para que vocˆe possa se familiarizar com alguns termos que ser˜ao muito utilizados ao longo do curso. Para descric¸˜oes mais completas, vocˆe pode encontrar na Internet v´arios s´ıtios que descrevem o funcionamento dessa m´aquina, como por exemplo http://www.ime.usp.br/~macmulti/historico/.
Ao final dessa aula vocˆe deve ser capaz de:
A maioria dos computadores segue a arquitetura de von Neumann, que descreve um computador como um conjunto de trˆes partes principais: a unidade central de processamento ou UCP (que por sua vez ´e composta pela unidade l´ogico-aritm´etica (ULA) e pela unidade de controle (UC)), a mem´oria e os dispositivos de entrada e sa´ıda (E/S). Todas as partes s˜ao conectadas por um conjunto de cabos, o barramento. Esses componentes podem ser vistos na figura 1.1a.
( a ) ( b )
Figura 1: a) Componentes b´asicos de um computador e (b) elementos b´asicos da UCP.
1.1.1 Unidade Central de Processamento - UCP
A figura 1.1b mostra uma UCP em uma configurac¸˜ao muito simples. De forma geral, a UCP pode ser dividida em duas partes, a unidade l´ogica e aritm´etica (ULA) e a unidade de controle (UC). A ULA ´e capaz de desempenhar dois tipos de operac¸˜oes: operac¸˜oes aritm´eticas, como somas e subtrac¸˜oes, e comparac¸˜oes, como igual a ou maior que. A UC orquestra todo o resto. Seu trabalho ´e ler instruc¸˜oes e dados da mem´oria ou dos dispositivos de entrada, decodificar as instruc¸˜oes, alimentar a ULA com as entradas corretas de acordo com as instruc¸˜oes e enviar os resultados de volta `a mem´oria ou aos dispositivos de sa´ıda. Um componente chave dos sistema de controle ´e um contador de programa (ou PC = program counter) que mant´em o enderec¸o da instruc¸˜ao corrente e que, tipicamente, ´e incrementado cada vez que uma instruc¸˜ao ´e executada, a n˜ao ser que a pr´opria instruc¸˜ao
corrente indique onde se encontra a pr´oxima instruc¸˜ao, permitindo assim que um conjuntos de instruc¸˜oes seja repetido v´arias vezes. Desde a d´ecada de 1980, a ULA e a UC s˜ao inseridas em um ´unico circuito integrado: o microprocessador.
H´a v´arios fabricantes e modelos de microprocessadores, como o Pentium da Intel, o Athlon da AMD e o PowerPC da IBM. Cada microprocessador possui um conjunto de instruc¸˜oes finito, que s˜ao executadas a uma determinada frequˆencia. As frequˆencias comuns atualmente giram entre 1 e 3 GHz (Giga Hertz). O microprocessador apenas busca a pr´oxima instruc¸˜ao (ou dados) na mem´oria e a executa, em um ciclo infinito (ou at´e desligarem o com- putador). A figura 1.1b mostra a ULA, recebendo informac¸˜oes dos registradores^1 A e B e colocando o resultado no registrador C. O registrador de instruc¸˜oes (RI) define a operac¸˜ao a ser executada. Esses registradores fazem parte da unidade de controle. A UC ´e capaz de configurar seus recursos (como registradores e a ULA) para executar cada instruc¸˜ao.
1.1.2 Mem´oria
Conceitualmente, a mem´oria do computador pode ser vista como uma lista de c´elulas. Cada c´elula tem um enderec¸o numerado sequencialmente que pode armazenar uma quantidade fixa e pequena de informac¸˜ao. Essa informac¸˜ao pode ser ou uma instruc¸˜ao , que diz ao computador o que fazer, ou dados , a informac¸˜ao que o computador deve processar utilizando as instruc¸˜oes.
A mem´oria pode ser classificada em 2 grupos, as mem´orias vol´ateis e n˜ao vol´ateis (ou permanentes). As mem´orias vol´ateis (mem´orias do tipo RAM - Random Access Memory) precisam de energia para manter seu conte´udo (ou seja, s´o funcionam quando o computador est´a ligado). Quando desligamos o computador, as informac¸˜oes importantes s˜ao armazenadas nos dispositivos de mem´oria n˜ao vol´ateis (como o disco r´ıgido ou HD - Hard Drive). Os dispositivos de mem´oria vol´atil s˜ao mais caros e de menor capacidade, por´em s˜ao muito mais r´apidos, tornando poss´ıvel ao computador realizar o processamento de forma mais eficiente. Tipicamente, um computador pessoal hoje tem 1GB a 4GB de RAM e 80GB a 250GB de HD.
1.1.3 Dispositivos de Entrada e Sa´ıda - E/S
Os dispositivos de E/S definem como o computador recebe informac¸˜ao do mundo exterior e como ele devolve informac¸˜ao para o mundo exterior. Teclados, mouses, scanners , microfones e cˆameras s˜ao dispositivos comuns de entrada enquanto monitores e impressoras s˜ao dispositivos comuns de sa´ıda. Discos r´ıgidos e placas de rede, que permitem conex˜oes entre computadores, podem atuar como dispositivos tanto de entrada quanto de sa´ıda.
Vimos que o processador executa uma instruc¸˜ao por vez, e que as instruc¸˜oes s˜ao bastante simples. Um pro- grama pode ser definido como uma sequˆencia de instruc¸˜oes, que ficam armazenadas na mem´oria. Na pr´atica, ´e muito dif´ıcil trabalhar diretamente com instruc¸˜oes da m´aquina. Durante o curso vocˆe aprender´a como solu- cionar problemas computacionais usando uma linguagem de alto n´ıvel como C. Um programa escrito em uma linguagem de alto n´ıvel ´e mais f´acil de escrever e entender, por´em n˜ao pode ser executado diretamente pelo microprocessador. ´E necess´ario converter o programa em linguagem de alto n´ıvel (conhecido como programa fonte) para um programa em linguagem de m´aquina (ou linguagem de baixo n´ıvel), que possa ser executado pelo computador. Essa convers˜ao ´e realizada por um programa chamado de compilador.
E como instruc¸˜oes e dados podem ser utilizados para produzir algo ´util? Imagine uma cozinha, contendo arm´arios com diversos ingredientes, utens´ılios de cozinha, um forno e... um padeiro. O padeiro segue uma receita para obter, a partir dos ingredientes e com o aux´ılio do forno e dos utens´ılios, um bolo. Cada receita produz um tipo de bolo diferente, ou seja, mudando a receita, muda-se o bolo.
(^1) Registradores s˜ao elementos de mem´oria utilizados dentro da UCP
2 Um Primeiro Programa em C
Ronaldo F. Hashimoto, Carlos H. Morimoto e Jos´e A. R. Soares
O objetivo dessa aula ´e introduzir vocˆe `a linguagem C em ambiente Linux, primeiramente mostrando a sua estrutura, e a seguir com um exemplo simples. Antes de iniciar essa aula, ´e desej´avel que vocˆe disponha de um editor de texto para escrever o programa, e verifique tamb´em a existˆencia do compilador gcc em seu sistema.
Ao final dessa aula vocˆe deve ser capaz de:
Todo programa roda em um ambiente definido pelo conjunto de hardware e software a sua disposic¸˜ao. Como mais de 90% dos computadores pessoais (PCs) no mundo usam algum sistema operacional da Microsoft, vocˆe provavelmente n˜ao sabe o que ´e Linux, e muito menos ainda sabe por que esses professores de Computac¸˜ao teimam em insistir que h´a alguma vantagem em usar Linux em seu PC, quando vocˆe est´a muito satisfeito (ou confort´avel) com o sistema que vocˆe possui agora.
O Linux comec¸ou a ser desenvolvido em 1991 por Linus Torvalds e ´e baseado no sistema operacional Unix. Esse projeto pode ser considerado hoje como um dos melhores exemplos de sucesso no desenvolvimento de software aberto (e que ´e gr´atis!). A maior aplicac¸˜ao do Linux se encontra em servidores (essas m´aquinas que mantem a Internet no ar) e por isso muitas companhias j´a apoiam esse sistema, como a Dell, HP e a IBM, entre outras. Como exemplo de usu´ario podemos citar a Google, que (estima-se) possui cerca de 450.000 servidores rodando Linux. Al´em de servidores, o Linux ´e utilizado tamb´em em supercomputadores, em plataformas de jogos como o PlayStation 2 e 3, em telefones celulares, e muitos outros sistemas computacionais. No entanto, apenas cerca de 1% dos desktops rodam Linux.
Para aprender a programar em C vocˆe n˜ao precisa instalar Linux em seu computador, pois h´a v´arias alternativas de ferramentas que vocˆe pode usar para desenvolver seus programas no ambiente Windows que seu professor pode lhe indicar. Por´em, essa ´e uma excelente oportunidade de conhecer o Linux, o que lhe pode trazer uma grande vantagem profissional no futuro (assim como, por exemplo, talvez seja importante aprender inglˆes e chinˆes). Um exemplo de projeto de grande porte que pode impulsionar ainda mais o uso de Linux ´e o projeto OLPC (one laptop per child), tamb´em conhecido como laptop de 100 d´olares, que tem o potencial de atingir milh˜oes de crianc¸as em todo o mundo.
Vocˆe provavelmente j´a est´a familiarizado com interfaces gr´aficas, essas que apresentam janelas, menus, ´ıcones e outros componentes gr´aficos que vocˆe pode clicar, um cursor que vocˆe controla com o mouse, etc. Essas interfaces foram desenvolvidas na d´ecada de 1990, sendo que na d´ecada de 1980 as melhores interfaces eram do tipo linha de comando. Nesse tipo de interface, o monitor, em geral verde, era capaz de apresentar apenas texto. Dessa forma o usu´ario precisava digitar o nome do comando a ser executado pelo computador.
Atualmente, no Linux, vocˆe tem aplicac¸˜oes do tipo Terminal que criam uma janela no ambiente gr´afico onde vocˆe pode entrar com comandos usando o teclado 2. ´E no Terminal, que vocˆe vai compilar e executar o seu
(^2) Veja em nossa p´agina como fazer isso no Windows, usando por exemplo uma janela do CYGWIN
programa.
As informac¸˜oes que vocˆe possui no computador s˜ao armazenadas nos dispositivos de mem´oria n˜ao vol´atil na forma de arquivos. De forma geral, podemos definir 3 tipos de arquivos: diret´orios, dados e aplicativos. Di- ret´orios s˜ao arquivos que cont´em outros arquivos e permitem que vocˆe organize todas as informac¸˜oes em seu disco (HD). Os outros tipos de arquivos contem informac¸˜oes. A diferenc¸a b´asica entre eles ´e que os aplicativos podem ser executados pelo computador, enquanto os dados (as vezes chamados de documentos) s˜ao utilizados como entrada e/ou sa´ıda dos aplicativos.
O compilador gcc, por exemplo, ´e um aplicativo 3 que recebe como entrada um arquivo fonte, e gera um arquivo execut´avel (um outro aplicativo). O editor de texto ´e um exemplo de outro tipo de aplicativo, que n˜ao necessariamente precisa receber um arquivo de entrada, e pode gerar arquivos de dados na sa´ıda. Digamos que vocˆe use um editor de texto para escrever um programa em C, e salva esse programa no arquivo “exemplo.c”. Embora esse arquivo contenha um programa, ele n˜ao pode ser executado enquanto n˜ao for traduzido para linguagem de m´aquina pelo compilador gcc.
Para esse curso, recomendamos que vocˆe sempre rode o gcc com as seguintes opc¸˜oes: “-Wall -ansi -O2 -pedantic”. Essas opc¸˜oes garantem que o gcc vai lhe fornecer todas os avisos que ele ´e capaz de gerar para prevenir vocˆe contra poss´ıveis falhas no seu programa. Assim, para compilar o arquivo “exemplo.c”, podemos utilizar o seguinte comando na janela Terminal:
gcc -Wall -ansi -O2 -pedantic exemplo.c -o exemplo
A opc¸˜ao “-o” indica o nome do arquivo de sa´ıda, no caso, apenas “exemplo”, sem nenhuma extens˜ao.
Finalmente, vamos ver qual o conte´udo de um arquivo com um programa em C. Para que vocˆe consiga compilar o seu programa em C sem problemas utilizando o gcc, todos os seus programas devem possuir o seguinte esqueleto:
1 #include 2 3 i n t main ( ) 4 { 5 / ∗ d e c l a r a c¸˜a o de v a r i ´a v e i s ∗ / 6 7 / ∗ l i s t a de comandos ∗ / 8 9 return 0 ; 10 }
Por enquanto considere esse esqueleto como uma “receita de bolo”, ou seja, todo programa em C deve conter os comandos das linhas 1 , 3 , 4 , 9 e 10.
Para entendermos melhor, considere o programa em C apresentado na Fig. 2. Esse programa faz uma pergunta ao usu´ario (quantos anos vocˆe tem?), espera que o usu´ario entre com uma resposta num´erica atrav´es do teclado,
(^3) Muitas vezes chamamos aplicativos de programas, mas isso seria confuso em nosso contexto j´a que os programas que vocˆe vai escrever em C n˜ao podem ser executados antes de compilados.
2.5.4 Func¸˜ao de Impress˜ao na Tela
Basicamente, a func¸˜ao printf imprime todos os caracteres que est˜ao entre aspas. Assim, o printf da linha 13 imprime a mensagem (sem as aspas) "Quantos anos voce tem?: ". Note o espac¸o em branco no final da mensagem que tamb´em ´e impresso!
Agora observe o printf da linha 16. Este printf tem duas diferenc¸as com relac¸˜ao ao printf da linha 13. A primeira diferenc¸a ´e que dentro da mensagem do printf da linha 16 (caracteres que est˜ao entre aspas) podemos encontrar duas sequˆencias de caracteres: "%d" e "\n". Al´em disso, depois da mensagem, temos duas express˜oes aritm´eticas envolvendo a vari´avel idade separadas por v´ırgulas: (a) "idade" (seria como a express˜ao aritm´etica "idade * 1") ; and (b) a express˜ao aritm´etica "idade * 2".
O printf da linha 16 imprime na tela todos os caracteres que est˜ao entre aspas, com excec¸˜ao da sequˆencia de caracteres "%d" e "\n".
Para cada sequˆencia de caracteres "%d", a func¸˜ao printf imprime na tela um n´umero inteiro que ´e resultado das express˜oes aritm´eticas contidas no printf separadas por v´ırgula. Assim, o primeiro "%d" imprime na tela o conte´udo da vari´avel "idade" e segundo "%d" imprime na tela o resultado da express˜ao "idade * 2" (uma vez que a express˜ao "idade" vem antes da express˜ao "idade * 2" no printf da linha 16.
A sequˆencia de caracteres "\n", indica `a func¸˜ao printf para “pular de linha”, isto ´e, faz com que o cursor da tela v´a para a pr´oxima linha. No printf da linha 16 , como a sequˆencia est´a no final da mensagem, isto significa que depois de imprimir a mesma na tela, o cursor ir´a para a pr´oxima linha.
2.5.5 Func¸˜ao de Leitura pelo Teclado
Para ler um n´umero inteiro pelo teclado, vocˆe deve usar a func¸˜ao scanf da seguninte forma:
scanf ("%d", &
o scanf ir´a esperar o usu´ario digitar um n´umero inteiro pelo teclado e, ap´os o usu´ario digitar a tecla
2.5.6 Retornando ao nosso Exemplo
Executando o programa, temos:
Observe que:
"Quantos anos voce tem?: "
foi digitado pelo usu´ario e lido pela func¸˜ao scanf.
"20? Puxa voce parece que tem so 40 anos!"
aparece na pr´oxima linha.
2.5.7 Impress˜ao de %d e \ n
Para imprimir na tela a sequˆencia de caracteres "%d", vocˆe deve usar
printf ("%%d");
e para imprimir "\n", vocˆe de usar
printf ("\n");
3 Fundamentos
Ronaldo F. Hashimoto, Carlos H. Morimoto e Jos´e A. R. Soares
Essa aula introduz v´arios fundamentos necess´arios para compreender a linguagem C e o funcionamento de seus comandos. Ao final dessa aula vocˆe dever´a saber:
A declarac¸˜ao de uma vari´avel que guarda n´umeros inteiros em C de nome <nome_da_variavel> ´e feita da seguinte forma:
int <nome_da_variavel>;
Exemplo: declarac¸˜ao de uma vari´avel inteira "soma"
int soma;
Se vocˆe quiser declarar v´arias vari´aveis, ´e poss´ıvel fazer da seguinte forma:
int <nome_da_variavel_1>, <nome_da_variavel_2>, <nome_da_variavel_3>,.. ., <nome_da_variavel_n>;
Exemplo: declarac¸˜ao de duas vari´aveis inteiras "num" e "soma".
int num, soma;
Express˜oes aritm´eticas s˜ao express˜oes matem´aticas envolvendo n´umeros inteiros, vari´aveis inteiras, e os oper- adores "+" (soma), "-" (subtrac¸˜ao), "/" (quociente de divis˜ao inteira), "%" (resto de uma divis˜ao inteira) e "*" (multiplicac¸˜ao).
Exemplos:
Operador Aritm´etico Associatividade *, /, % da esquerda para a direita +, - da esquerda para a direita
Tabela 1: Precedˆencia dos Operadores Aritm´eticos.
3.2.1 Precedˆencia de Operadores
Qual seria o resultado da express˜ao: 2 + 3 ∗ 4? Sua resposta provavelmente seria 14 , pois ´e o resultado de 2 + (3 ∗ 4), mas porque n˜ao 20 , resultado de (2 + 3) ∗ 4? A resposta est´a na prioridade com que as operac¸˜oes s˜ao realizadas, ou precedˆencia dos operadores. A operac¸˜ao "*" tem maior precedˆencia que a operac¸˜ao "+", e portanto ´e feita primeiro.
A Tabela 1 mostra a precedˆencia dos operadores em C. Na d´uvida, ou at´e para deixar mais claro e f´acil de entender, use parˆenteses. Al´em de n´umeros as express˜oes podem conter o nome de vari´aveis, como na soma "num1 + num2".
Um outro fator importante ´e o tipo dos valores utilizados pelos operadores, no caso, estamos trabalhando apenas com o tipo inteiro ( int ). Isso ´e muito importante para entender o resultado de algumas express˜oes. Por exemplo, usando agora o compilador, fac¸a um programa que imprima o valor da express˜ao (3 / 4 ∗ 100). O resultado ´e zero. Por quˆe?
Como a precedˆencia de / e * s˜ao iguais, a tabela diz tamb´em que esses operadores s˜ao calculados da esquerda para a direita, ou seja, o resultado de 3/4 ´e multiplicado por 100 , e o resultado final esperado seria 75. Por´em, o resultado do seu programa deve ter sido zero. Por que isso?
Como todas as operac¸˜oes s˜ao inteiras, o resultado de 3/4 ´e zero (e n˜ao 0.75, que ´e um n´umero real). Sendo assim, o resultado de 9/2 ´e 4 , 9/3 ´e 3 , 9/4 ´e 2 , e assim por diante. A parte fracion´aria ´e simplesmente eliminada (ou truncada ao inv´es de ser aproximada para um valor inteiro mais pr´oximo), ou seja, mesmo o resultado de 99999/100000 ´e zero.
Considere as vari´aveis inteiras x = 2 e y = 3. Verifique o valor das seguintes express˜oes:
Express˜ao Valor x / y 0 y / x 1 y / x ∗ 10 10 x + y ∗ 4 14 (x + y) ∗ 4 20
V´arias instruc¸˜oes depedem do resultado de comparac¸˜oes (ou condic¸˜oes) do tipo num1 > num2 (num1 ´e maior que num2). O resultado de uma condic¸˜ao ´e verdadeiro ou falso.
Express˜oes relacionais s˜ao express˜oes que envolvem comparac¸˜oes simples envolvendo operadores relacionais "<" (menor), ">" (maior), "<=" (menor ou igual), ">=" (maior ou igual), "!=" (diferente), "==" (igual).
Uma comparac¸˜ao simples s´o pode ser feita entre pares de express˜oes aritm´eticas da forma:
<expr_aritm´etica_01> <oper_relacional> <expr_aritm´etica_02>
onde <expr_aritm´etica_01> e <expr_aritm´etica_02> s˜ao express˜oes aritm´eticas e <oper_relacional> ´e um operador relacional.