You are on page 1of 64

Algoritmos

Prof. Ms. Mauricio Duarte








Apostila de
Linguagem C
2010












Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


2
Prefcio

Este material o resultado das notas de aulas das disciplinas Algoritmos e
Estruturas de Dados.

O principal objetivo deste material auxiliar os alunos na disciplina de
Algoritmos. Vale destacar tambm que este material no substitui em hiptese
alguma os livros indicados como bibliografia bsica, pois devero ser
consultados para uma melhor formao profissional.





Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


3
ndice


Captulo 1 - Introduo Microinformtica ............... Erro! Indicador no definido.
1.1 Introduo .......................................................... Erro! Indicador no definido.
1.2 Precursores do Computador ............................... Erro! Indicador no definido.
1.3 Geraes dos Computadores .............................. Erro! Indicador no definido.
Captulo 2 - Programao de Computadores .............. Erro! Indicador no definido.
2.1 Introduo .......................................................... Erro! Indicador no definido.
2.2 Lgica de Programao ...................................... Erro! Indicador no definido.
2.3 Algoritmos ......................................................... Erro! Indicador no definido.
2.4 Representao de Algoritmos............................. Erro! Indicador no definido.
2.5 Linguagens de Programao .............................. Erro! Indicador no definido.
2.6 Variveis ............................................................ Erro! Indicador no definido.
2.7 Tipos de Dados .................................................. Erro! Indicador no definido.
2.8 Declarao de Variveis..................................... Erro! Indicador no definido.
2.9 Operadores ......................................................... Erro! Indicador no definido.
2.10 Comandos de Entrada e Sada de Dados .......... Erro! Indicador no definido.
2.11 Exemplos de Algoritmos .................................. Erro! Indicador no definido.
2.12 Exerccios em Classe ....................................... Erro! Indicador no definido.
2.13 Exerccios Complementares ............................. Erro! Indicador no definido.
Captulo 3 - Estruturas de Seleo ............................... Erro! Indicador no definido.
3.1 Introduo .......................................................... Erro! Indicador no definido.
3.2 Estrutura de Seleo Simples ............................. Erro! Indicador no definido.
3.3 Estrutura de Seleo Composta .......................... Erro! Indicador no definido.
3.4 Estrutura de Seleo Agrupada .......................... Erro! Indicador no definido.
3.5 Exerccios em Classe ......................................... Erro! Indicador no definido.
3.6 Exerccios Complementares ............................... Erro! Indicador no definido.
Captulo 4 - Estruturas de Repetio ........................... Erro! Indicador no definido.
4.1 Introduo .......................................................... Erro! Indicador no definido.
4.2 Estrutura de Repetio Enquanto ... ................... Erro! Indicador no definido.
4.3 Estrutura de Repetio Faa-Enquanto ............... Erro! Indicador no definido.
4.4 Estrutura de Repetio Para ............................... Erro! Indicador no definido.
4.5 Exerccios em Classe ......................................... Erro! Indicador no definido.




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


4
4.6 Exerccios Complementares ............................... Erro! Indicador no definido.
Captulo 5 - Introduo a Linguagem C ................................................................. 6
5.1 Introduo ......................................................................................................... 6
5.2 Mapa de Memria em C ................................................................................... 7
5.3 Tipos de Dados em C ........................................................................................ 7
5.4 Inicializao de Variveis ................................................................................. 8
5.5 Operadores em C .............................................................................................. 8
5.6 Comandos de entrada e sada de dados ............................................................. 8
5.7 Estrutura de um programa em C........................................................................ 9
5.8 Estrutura de Seleo........................................................................................ 10
5.8.1 Comando de Seleo if ................................................................................................. 10
5.8.2 Comando de Seleo switch ......................................................................................... 13
5.9 Estruturas de repetio .................................................................................... 14
5.9.1 Comando while ............................................................................................................ 14
5.9.2 Comando do - while ..................................................................................................... 15
5.9.3 Comando for ................................................................................................................ 16
Captulo 6 - Arrays Unidimensionais (Vetores) ................................................... 18
6.1 Introduo ....................................................................................................... 18
6.2 Arrays unidimensionais .................................................................................. 18
6.3 Acessando elementos de um array unidimensional ......................................... 19
6.4 Inicializao de arrays..................................................................................... 20
6.5 Exemplos de manipulao de arrays ............................................................... 20
6.6 Exerccios em Classe ...................................................................................... 21
6.7 Exerccios Complementares ............................................................................ 22
Captulo 7 - Manipulao de Strings e Caracteres ............................................... 23
7.1 Introduo ....................................................................................................... 23
7.2 Funes para manipulao de strings .............................................................. 24
7.3 Exerccios em Classe ...................................................................................... 26
7.4 Exerccios Complementares ............................................................................ 28
Captulo 8 - Arrays Bidimensionais (Matrizes) .................................................... 29
8.1 Introduo ....................................................................................................... 29
8.2 Declarando um array bidimensional ................................................................ 29
8.3 Exerccios em Classe ...................................................................................... 31
8.4 Exerccios Complementares ............................................................................ 33






Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


5
Captulo 9 - Introduo aos Ponteiros .................................................................. 35
9.1 Definio ........................................................................................................ 35
9.2 Declarao de ponteiros .................................................................................. 35
9.3 Operadores de ponteiros (& e *) ..................................................................... 36
9.4 Cuidados com ponteiros .................................................................................. 37
9.5 Exerccios em Classe ...................................................................................... 38
Captulo 10 - Funes ............................................................................................ 39
10.1 Introduo ..................................................................................................... 39
10.2 Prottipos de funes .................................................................................... 40
10.3 Passagem de Parmetros ............................................................................... 42
10.4 Passagem de arrays para funes .................................................................. 43
10.5 Escopo de variveis ...................................................................................... 44
10.6 Exerccios em Classe .................................................................................... 44
Captulo 11 - Estruturas ........................................................................................ 49
11.1 Definio e declarao de estruturas em C .................................................... 49
11.2 Matrizes de estruturas ................................................................................... 51
11.3 Passando elementos de estruturas como parmetros para funes ................. 51
11.4 Passando estruturas inteiras para funes ...................................................... 52
11.5 Ponteiros para estruturas ............................................................................... 53
11.6 Comando typedef .......................................................................................... 53
11.7 Exerccios em Classe .................................................................................... 54
11.8 Exerccios Complementares .......................................................................... 55
Captulo 12 - Manipulao de arquivos em C ...................................................... 57
12.1 Introduo ..................................................................................................... 57
12.2 Streams ......................................................................................................... 57
12.3 Abrindo um arquivo ...................................................................................... 58
12.4 Fechando um arquivo .................................................................................... 59
12.5 Escrevendo e lendo caracteres em um arquivo .............................................. 59
12.6 Escrevendo e lendo strings em um arquivo ................................................... 60
12.7 Funes fread() e fwrite().............................................................................. 61
12.8 Exerccios ..................................................................................................... 62
Bibliografia ............................................................................................................. 63




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


6
Captulo 5
Introduo a Linguagem C

5.1 Introduo

A linguagem de programao C surgiu em 1972. uma linguagem de programao de uso geral
desenvolvida por Dennis Ritche no Bell Laboratory. Os princpios bsicos de C so originrios de
outras linguagens tais como: B, BCPL e CPL. Estas linguagens so classificadas como linguagens
de alto nvel, mas que permitem a manipulao das informaes atravs dos bits.

Inicialmente a linguagem C ficou restrita as Universidades e aos centros de pesquisas. A maioria
dos programadores achava que era uma linguagem de difcil manipulao. O surgimento da
linguagem C est intimamente relacionada com o sistema operacional UNIX. Ken Thompson
utilizou a linguagem Assembler e a linguagem B para produzir verses do sistema UNIX e a
linguagem C surge devido as limitaes da linguagem B.

Da mesma forma, a linguagem C deu origem a linguagem C++, desenvolvida na dcada de 80. A
diferena que a linguagem C++ uma linguagem orientada a objetos que utiliza um paradigma de
programa diferente do que ser abordado aqui.

As vrias implementaes da linguagem C esto baseadas no padro ANSI C e acrescentam
diversos recursos especficos.

A linguagem C classificada como uma linguagem de nvel mdio por sua capacidade de
manipulao em baixo nvel, ou seja, permite a manipulao de endereos de memria, bits e bytes
(elementos bsicos atravs dos quais o computador funciona). Essa classificao no faz com que C
seja mais fcil ou mais difcil que as outras linguagens.

Por ser tambm uma linguagem de alto nvel, o programa escrito (cdigo fonte) em C dever ser
convertido em linguagem de mquina para que possa ser executado. O processo de converso pode
ser realizado por dois programas diferentes: compilador ou interpretador.

No processo de compilao, o cdigo fonte todo convertido em uma linguagem intermediria
chamada de cdigo objeto. Na execuo do programa, o computador l cdigo objeto.

Na interpretao, o programa interpretador l o cdigo fonte linha por linha, executando cada
instruo. Este processo diferente da compilao onde todo o cdigo fonte convertido em cdigo
objeto antes da execuo.

As linguagens interpretadas so mais lentas que as linguagens compiladas.





Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


7
5.2 Mapa de Memria em C

Todo programa em C ao ser compilado, cria e usa quatro regies na memria. Cada uma dessas
regies distinta e possuem funes especficas. A figura abaixo ilustra as quatro regies.


















A pilha tem diversas aplicaes durante a execuo de um programa. na pilha que ficam
armazenados os endereos de retorno das funes. O heap uma rea livre que utilizado atravs
das funes de alocao dinmica de memria.

5.3. Tipos de Dados em C

Em tem-se basicamente cinco tipos de dados:
Caractere char
Inteiro int
Ponto flutuante (real) float
Ponto flutuante de preciso dupla (real) double
Sem valor void

A declarao de uma varivel em C feita da mesma forma que foi utilizada em Porto-C: primeiro
o tipo da varivel e logo depois o nome da varivel. Toda linha de comando em C terminada por
ponto e vrgula (;). Exemplos:

int x;
int a, b;
float g;
double v, s;
char nome;

Cdigo do programa
Variveis globais
Heap
Pilha




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


8
Repare que em C no existe um tipo especfico para trabalhar com cadeias de caracteres (strings).
Sua formao ser estudada no captulo 7.

5.4 Inicializao de Variveis

No momento da declarao de uma varivel pode-se atribuir um valor inicial a mesma. O operador
responsvel pela atribuio de valores a uma varivel representado pelo smbolo de igualdade (=).
Exemplos:

int x = 5;
int a = 2, b = 3;
float y = 12.3;
char letra = a;

5.5 Operadores em C

Operador de atribuio:
Como j mostrado, o operador de atribuio responsvel por atribuir um valor a uma varivel.
Esse operador representado pelo smbolo de igualdade. Exemplos:

int x = 2, y = 5;
x = 10;
y = x;
x = y = 20;

Operadores aritmticos:
Os operadores aritmticos em C so: adio (+), subtrao (-), multiplicao (*), diviso (/) e
mdulo da diviso ou resto (%).

Operadores relacionais:
Os operadores relacionais em C so: >, >=, <, <=, == e !=.

Operadores lgicos:
Os operadores lgicos so: e (&&), ou (||) e no (!).

5.6 Comandos de entrada e sada de dados

Comando de sada:
Um comando de sada de dados responsvel por enviar uma mensagem, ou seja, uma string
podendo ser composta por letras ou nmero para o vdeo. Em C o comando para sada de dado ser
representado pela instruo printf(). A sintaxe para o comando printf() semelhante a do comando
escreva() usado em Porto-C. Exemplo:

printf(Esta uma mensagem de exemplo);




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


9
printf(Tenham todos uma\n boa noite);
printf(Sua nota %f, y);
printf(Os valores so %d e %d, x, y );

Comando de entrada:
Um comando de entrada responsvel por leia a informao informada via teclado por um
operador e armazenar em uma posio de memria, ou seja, em uma varivel j declarada. O
comando utilizado para entrada de dados scanf(). A sintaxe semelhante ao do comando leia()
previamente utilizado. Exemplo:

scanf(%d, &x );
scanf(%f, &media);
scanf(%c, &letra);
scanf(%d %d %d, x, y, z);

5.7 Estrutura de um programa em C

Um programa em linguagem C composto por vrios blocos de cdigos e pela declarao de
bibliotecas. Dentro do programa deve haver um bloco principal de cdigo chamado main() que
representa o incio do programa. a partir do main() que todo as outras instrues do programa
sero executadas. Exemplo:

#include <stdio.h>
void main()
{
int y;
printf(digite um valor inteiro: );
scanf(%d, &y);
printf(o valor informado foi %d, y );
}




















Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


10


5.8 Estrutura de Seleo

5.8.1 Comando de Seleo if

Em C tem-se dois comandos utilizados para trabalhar com seleo: if e switch. O funcionamento
destas estruturas semelhando ao apresentado em Porto-C:

Seleo Simples:















Seleo Composta:




















se (condio_lgica)
Incio
Instruo_1;
Instruo_2;
. . .
Instruo_n;
Fim

if (condio_lgica)
{
Instruo_1;
Instruo_2;
. . .
Instruo_n;
}
Em Porto-C
Em C
se (condio_lgica)
Incio
Instruo_1;
Instruo_2;
. . .
Instruo_n;
Fim
Seno
Incio
Instruo_1;
Instruo_2;
. . .
Instruo_n;
Fim

if (condio_lgica)
{
Instruo_1;
Instruo_2;
. . .
Instruo_n;
}
else
{
Instruo_1;
Instruo_2;
. . .
Instruo_n;
}

Em Porto-C
Em C




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


11
Seleo Encadeada ou Aninhada
Uma seleo encadeada ou aninhada um agrupamento de instrues de seleo, ou seja, pode-se
uma instruo de seleo interna a outra instruo e assim por diante. A sintaxe em Porto-C :












































se(condio_lgicaA)
incio
Instruo_1A;
Instruo_2A;
. . .
Instruo_nA;
fim
seno
incio
se(condio_lgicaB)
inicio
Instruo_1B;
Instruo_2B;
. . .
Instruo_nB;
fim
seno
incio
se(condio_lgicaC)
inicio
Instruo_1C;
Instruo_2C;
. . .
Instruo_nC;
fim
seno
inicio
Instruo_1B;
Instruo_2C;
. . .
Instruo_nC;
fim
fim
fim









Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


12
A estrutura de seleo encadeada tem a desvantagem de ser complicada de entender a medida que o
nmero de instrues de seleo aumenta. A sintaxe do comando de seleo encadeado em C :














































if(condio_lgicaA)
{
Instruo_1A;
Instruo_2A;
. . .
Instruo_nA;
}
else
{
if(condio_lgicaB)
{
Instruo_1B;
Instruo_2B;
. . .
Instruo_nB;
}
else
{
if(condio_lgicaC)
{
Instruo_1C;
Instruo_2C;
. . .
Instruo_nC;
}
else
{
if(condio_lgicaD)
{
Instruo_1D;
Instruo_2D;
. . .
Instruo_nD;
}
else
{
Instruo_1;
Instruo_2;
. . .
Instruo_n;
}
}
}
}









Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


13
5.8.2 Comando de Seleo switch

Uma alternativa para o comando de seleo if o comando switch. O comando switch tambm
utilizado para realizar selees. A sua sintaxe :

switch ( op )
{
case valorA:
instruo 1A;
instruo 2A;
...
instruo nA;
break;
case valorB:
instruo 1B;
instruo 2B;
...
instruo nB;
break;
. . .
case valorn:
instruo 1n;
instruo 2n;
...
instruo nn;
break;
default:
instruo 1;
instruo 2;
...
instruo n;
}


A varivel op passada para o comando switch s pode ser de dois tipos: ou inteira ou caractere. O
comando switch testa o valor de op contra cada um dos valores presentes na instruo case. Caso
algum valor seja igual, todas as instrues internas ao case so executadas e o comando break
utilizado para interromper a execuo do switch. Se o comando switch no encontrar nenhum case
corresponde ao valor da varivel que est sendo testada as instrues internas ao comando default
so executadas.










Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


14
5.9 Estruturas de repetio

5.9.1 Comando while
O comando while em C a traduo para o comando enquanto utilizado em Porto-C. Sua sintaxe
e utilizao so a mesma.
Exemplo 1: algoritmo para escreva os valores de 1 at 10 no vdeo.

#include <stdio.h>
void main()
{
int cont;
cont = 1;
while( cont <= 10 )
{
printf(%d, cont);
cont = cont + 1;
}
}

Exemplo 2: Algoritmo para calcular a mdia dos nmeros pares entre 0 e 100.

#include <stdio.h>
void main()
{
int cont, soma;
cont = 1;
soma = 0;
while(cont <= 100)
{
if(cont % 2 == 0 )
soma = soma + cont;
cont = cont + 1;
}
printf(A soma dos nmeros pares %d, soma);
}

Exemplo 3: Calcular e escreva a mdia dos 50 alunos de uma sala de aluno. Suponha que cada
aluno fez duas provas durante o semestre.

#include <stdio.h>
void main()
{
int cont = 1;
float p1, p2, media;
while(cont <= 50)
{
printf(Digite a primeira nota: );




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


15
scanf(%f, &p1);
printf(Digite a segunda nota: );
scanf(%f, &p2);
media = (p1+p2)/2;
printf(A media do aluno %d %f, cont, media);
cont = cont + 1;
}
}

5.9.2 Comando do - while
O comando do - while em C a traduo para o comando faa - enquanto utilizado em Porto-C.
Sua sintaxe e utilizao so a mesma.

Exemplo 4: Refazendo o exemplo 1 usando a estrutura do - while.

#include <stdio.h>
void main()
{
int cont;
cont = 1;
do
{
printf(%d, cont);
cont = cont + 1;
} while( cont <= 10 );
}

Exemplo 5: Refazendo o exemplo 2 usando a estrutura do - while

#include <stdio.h>
void main()
{
int cont, soma;
cont = 1;
soma = 0;
do
{
if(cont % 2 == 0 )
soma = soma + cont;
cont = cont + 1;
} while(cont <= 100);
printf(A soma dos nmeros pares %d, soma);
}








Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


16
Exemplo 6: Refazendo o exemplo 3 usando a estrutura do - while

#include <stdio.h>
void main()
{
int cont = 1;
float p1, p2, media;
do
{
printf(Digite a primeira nota: );
scanf(%f, &p1);
printf(Digite a segunda nota: );
scanf(%f, &p2);
media = (p1+p2)/2;
printf(A media do aluno %d %f, cont, media);
cont = cont + 1;
} while(cont <= 50);
}

5.9.3 Comando for
O comando for em C a traduo para o comando para utilizado em Porto-C. Sua sintaxe e
utilizao so a mesma. Exemplos:

Exemplo 7: Refazendo o exemplo 1 usando a estrutura de repetio for.

#include <stdio.h>
void main()
{
int cont;
for( cont = 1; cont <= 10; cont = cont + 1)
printf(%d, cont);
}

Exemplo 8

#include <stdio.h>
void main()
{
int cont;
cont = 1;
for(; cont <= 10; cont = cont + 1)
printf(%d, cont);
}









Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


17
Exemplo 9

#include <stdio.h>
void main()
{
int cont;
for( cont = 1; cont <= 10;)
{
printf(%d, cont);
cont = cont + 1;
}
}


Exemplo 10

#include <stdio.h>
void main()
{
int cont;
cont = 1;
for( ; cont <= 10;)
{
printf(%d, cont);
cont = cont + 1;
}
}






Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


18
Captulo 6
Arrays Unidimensionais (Vetores)

6.1 Introduo

Nos captulos 3 e 4 foram apresentadas as estruturas de seleo e de repetio que so de extrema
importncia no desenvolvimento de algoritmos. Nas tcnicas de construo de algoritmos j
comentadas em nenhum momento houve a necessidade de armazenar grandes quantidades de
informao.

Considere a seguinte situao prtica. Um professor tem um total de 100 alunos. O professor
gostaria de armazenar para processamento as duas notas referentes as provas aplicadas e tambm
calcular e armazenar a mdia de cada aluno.

Do ponto de vista prtico sabe-se que a rea de armazenamento utilizada por um programa a
memria RAM e que um programa armazena dados na memria atravs da declarao de variveis
que realizada logo no inicio do programa. No problema descrito, qual seria inicialmente o nmero
de variveis necessrias para armazenar todas as informaes? Para quem pensou em 150 variveis
acerto! Declarar 150 variveis parece algo muito complicado e tambm nada prtico.

As linguagens de programao oferecem um recurso muito interessante e importante chamado de
arrays. Os arrays so utilizados quando h a necessidade de manipular e conseqentemente
armazenar grandes quantidades de informao.

6.2 Arrays unidimensionais

Um array definido formalmente como um conjunto de variveis, ou seja, um conjunto de posies
de memria contguas que so referenciadas pelo mesmo nome. A sintaxe para a declarao de um
array unidimensional :

tipo nome_varivel[tamanho]

onde: tipo representa qualquer tipo vlido da linguagem C, nome_varivel o nome que ser
utilizado para referenciar os contedos das posies de memria e tamanho representa o nmero
mximo de elementos que podem ser armazenados na varivel. Exemplo de declaraes:
int y[50];
float media[1000];

Na primeira declarao tem-se uma varivel x do tipo inteiro armazenando no mximo 50 valores
inteiros e na segunda declarao tem-se uma varivel chamada media com capacidade para 1000
valores do tipo float.
Graficamente pode-se visualizar um array da seguinte forma:


10 2 4 87 23 . . . 50 90 28 y =




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


19

J vimos como declarar um array e tambm como um array pode ser visualizado graficamente. Mas
como podemos acessar os elementos individuais de um array se todos so representados pela
mesma varivel?

6.3 Acessando elementos de um array unidimensional

Como todos os elementos so referenciados pelo mesmo nome deve haver uma maneira de
diferenciar o primeiro valor do segundo, do terceiro e assim por diante. O acesso a cada elemento
do array feito atravs de sua posio dentro da varivel. Essa posio, chamada de ndice do array,
deve ser especificada atravs do uso de colchetes. Por exemplo:
y[0] 10
y[1] 2
y[3] 4

Como j foi mencionado, as posies de memria ocupadas por um array so contguas, ou seja,
uma ao lado da outra. O ndice do primeiro elemento do array sempre comear em zero e o ltimo
ndice depender do tamanho total do array, especificado no momento da declarao da varivel.
Por exemplo, ao escrever:

int z[10]

est sendo declarado um array com 10 elementos onde o primeiro elemento est na posio z[0] e o
ltimo est na posio z[9]. Para atribuir um elemento a um array deve-se especificar o nome do
array juntamente com a posio que ir armazenar o valor. Por exemplo:

z[0] = 2;
z[1] = 45;
...

Na prtica a utilizao de arrays sempre est associada com o uso de estruturas de repetio.
Suponha um array com 1000 posies que dever armazenar as mdias de um aluno. Para
armazenar os valores, deve-se executar 1000 atribuies. Com o uso de estruturas de repetio fica
mais fcil realizar as operaes.

O espao total em bytes ocupado por um array depender do tipo do array e tambm do nmero
total de posies. Com essas informaes consegue-se determinar o espao total atravs da
expresso:

espao = sizeof(tipo) * tamanho

onde, sizeof() uma funo da linguagem C utilizada para determinar o nmero de bytes ocupados
por um tipo de dado da linguagem e tamanho representa o nmero de posies definidas para o
array.






Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


20
6.4 Inicializao de arrays

Um array como qualquer outra varivel pode ser declarado e tambm inicializado. Como j visto,
na inicializao das variveis devemos especificar quais valores a varivel ir receber. Exemplo:

int y[5] = {1, 2, 3, 4, 5};
int y[] = {1, 2, 3, 4, 5};

Os dois exemplos acima produzem o mesmo efeito. Ao declarar a varivel y, o compilador j
atribuir cada valor especificado entre chaves ({}) para cada uma das posies do array, ou seja,
y[0] armazenar o valor 1 e y[4] o valor 5.

6.5 Exemplos de manipulao de arrays

Exemplo 1: programa em C para preencher um array unidimensional com 100 posies com
valores informados por um usurio.

#include <stdio.h
void main()
{
int x[100], cont;
for( cont = 0; cont < 100; cont++ )
{
printf(Digite um valor: );
scanf(%d, &x[cont] );
}
}

Exemplo 2: programa em C para escreva os valores do vetor do exemplo 1.

#include <stdio.h>
void main()
{
int x[100], cont;
clrscr();
for( cont = 0; cont < 100; cont++ )
printf(Posio %d = %d, cont, x[cont]);
}












Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


21
6.6 Exerccios em Classe

1. Considere o vetor V igual a:

2 6 8 3 10 9 1 21 33 14

e as variveis x = 2 e y = 4, escreva o valor de cada uma das expresses.
a) V[x+1]
b) V[x+2]
c) V[x+3]
d) V[x*4]
e) V[V[x+y]]
f) V[8-V[2]]

2. Escreva um programa em C que preencha um vetor de 50 posies com nmeros inteiros pares
sucessivos comeando em 10.

3. Escreva um programa em C que preencha um vetor de 1000 posies com valores fornecidos
pelo usurio. Escreva no vdeo o maior valor armazenado.

4. Escreva um programa em C que preencha um vetor de 5000 posies com valores aleatrios.
Escreva no vdeo a quantidade de nmeros pares gerados.

5. Escreva um programa em C que preencha um vetor de 500 posies com valores aleatrios
entre 1000 e 4000. Escreva o menor valor armazenado.

6. Escreva um programa em C para preencher um vetor de 100 posies com valores aleatrios
pares.

7. Em uma sala de aula tem-se um total de 75 alunos. Cada aluno fez duas provas durante o
semestre. Escreva um programa em C que armazene o valor das duas notas e tambm calcule e
armazene o valor da mdia aritmtica de cada aluno. Escreva no vdeo em formato tabular as
duas notas de cada aluno, sua mdia e a situao (aprovado ou reprovado). Para ser
aprovado a mdia do aluno dever ser maior ou igual a 6.

8. Considere um vetor A de 10 posies. Preencha o vetor com valores aleatrios e em seguida
faa a inverso dos valores, ou seja: A[0] = A[9], A[1] = A[8] e assim por diante. Escreva o
vetor antes e aps a inverso.

9. Escreva um programa em C para armazenar em um vetor os 15 primeiros termos da srie
numrica de Fibonacci. Os dois primeiros valores da srie so 0 e 1. Escreva os valores no
vdeo.

10. Considere a seguinte srie numrica:

+ + =
4
1
3
1
2
1
1 k
V =




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


22

Escreva um programa em C para armazenar os 20 primeiros termos da srie em um vetor. Cada
termo da srie dever ser armazenado em uma posio do vetor.

11. Dado um vetor H de 10 posies. Preencha o vetor com valores aleatrios entre 0 e 50 e em
seguida ordene os valores do vetor em ordem crescente. Escreva os elementos do vetor antes e
aps a ordenao.


6.7 Exerccios Complementares

1. Escreva um programa em C que preencha um vetor de 3000 posies com valores aleatrios.
Escreva no vdeo o menor valor armazenado e tambm a mdia aritmtica dos valores. A mdia
dever ser impressa com 4 casas decimais.

2. Escreva um programa em C que preencha um vetor de 500 posies com valores aleatrios.
Escreva a quantidade de nmeros mpares.

3. Escreva um programa em C que preencha um vetor de 20 posies com valores aleatrios entre
100 e 200. Escreva o maior valor armazenado e tambm todos os seus divisores.

4. Altere o programa do exerccio anterior para escreva tambm a diferena entre o maior e o
menor elemento do vetor.

5. Escreva um programa em C que crie um algoritmo que leia um vetor de 30 nmeros inteiros e
gere um segundo vetor cujas posies pares so o dobro do vetor original e as mpares o triplo.

6. Escreva um programa em C que armazene 50 notas e calcule quantas so 10% acima da mdia e
quantas so 10% abaixo da mdia. Considere que a mdia seja 6.

7. Escreva um programa em C que leia a nota da primeira e da segunda prova de um aluno.
Calcule sua mdia levando em considerao que a prova 1 tem peso 4 e a segunda tem peso 6.
Escreva as notas e sua respectiva mdia.

8. Escreva um programa em C que leia dois vetores A e B, contendo cada um 25 elementos
inteiros. Intercale esses dois conjuntos (A[0] | B[0] | A[1] | B[1] | ...) formando um vetor V de
50 elementos.

9. Fazer um algoritmo que leia a matrcula e a mdia de 10 alunos. Ordene da maior nota para a
menor e escreva uma relao contendo todas as matrculas e mdias.

10. Escreva um programa em C que preencha um vetor de 20 posies com valores aleatrios. Em
seguida, escreva as seguintes informaes: i) quantos nmeros pares foram armazenados? ii)
quantos nmeros mpares? iii) qual a mdia aritmtica do vetor? iv) qual a porcentagem de
nmeros acima da mdia?







Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


23
Captulo 7
Manipulao de Strings e Caracteres

7.1 Introduo

Como j comentado anteriormente em nosso curso de Algoritmos, a linguagem C no apresenta um
tipo string. Sabemos tambm desde o incio do nosso curso que uma string nada mais do que
uma cadeia (conjunto) de caracteres. Dessa forma temos:

Maria
So Paulo
Faculdade de Informtica

Para manipularmos uma cadeia de caracteres em C devemos trabalhar com vetores
unidimensionais. A utilizao mais comum de um array unidimensional em C na definio de
uma string. Portanto, strings so vetores de do tipo char. Devemos estar atentos ao fato de que as
strings tm como ltimo elemento um \0, que adicionado automaticamente ao final da string.

A forma geral para declararmos uma string segue o mesmo padro para a declarao de um array
unidimensional:

char nome_da_string[tamanho];

sendo tamanho representa o nmero mximo de caracteres que a string ir armazenar. Devemos
incluir neste valor o finalizador de strings.

Exemplo de declarao:

char nome[20];

No exemplo acima, temos uma varivel vetor que armazena no mximo 20 caracteres. Lembre-se
que o tamanho da string deve incluir o finalizador de strings (\0).

As variveis strings podem ser inicializadas no momento da declarao da mesma forma que as
variveis de outros tipos. No se esquea que uma string sempre vem entre aspas ( ). Exemplo:

char x[] = Testando o programa;
char y[] = {T,e,s,t,e, ,d,e, ,c,o,n,h,e,c,i,m,e,n,t,o,\0};
char t[] = {84, 101, 115, 116, 101, \0};

Nos exemplos acima, percebemos trs maneiras diferentes de inicializar uma varivel string.
Quando fornecemos valores decimais, estes so convertidos em caracteres conforme tabela ASCII
(veja no final do captulo).





Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


24
7.2 Funes para manipulao de strings

A linguagem C apesar de no apresentar um tipo especfico string, apresenta uma srie de
funes que podem ser aplicadas a uma varivel do tipo vetor de caracteres. Essas funes
apresentam seus cabealhos em string.h. Dentre as principais funes destacam-se:

Funo gets()

A funo gets() utilizada para leia uma string do teclado. A funo scanf() tambm pode ser
utilizada, mas no apresenta um bom desempenho quando a string formada por duas ou mais
palavras separadas por caracteres em branco. Dessa forma, a funo gets() apresenta um melhor
resultado. O cabealho da funo gets() est em stdio.h. Sua forma geral :

gets( nome_da_string );

Exemplo de utilizao da funo gets():

#include <stdio.h>
int main()
{
char string[100];
printf (Digite o seu nome: );
gets (string);
printf (\n\n Ola %s,string);
return(0);
}

A impresso de uma string no vdeo realizada com a funo printf(). Repare que o caractere de
impresso utilizado para string %s.

Funo strcpy()

Esta funo utilizada para copiar uma string para outra. A sua forma geral :

strcpy( string_destino, string_origem );

A string_origem copiada na string_destino. Exemplo:

#include <stdio.h>
#include <string.h>
int main()
{
char str1[100], str2[100], str3[100];
printf (Entre com uma string: );
gets (str1);
strcpy (str2, str1); /* Copia str1 em str2 */
strcpy (str3, Voce digitou a string );
printf (\n\n%s%s,str3,str2);
return(0);
}




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


25

No programa exemplo acima, a string informada via teclado armazenada na varivel str1. Em
seguida, o contedo de str1 copiado para a varivel str2 usando a funo strcpy(). Perceba que
neste caso teremos duas variveis com o mesmo contedo. Caso a varivel str2 tenha um contedo
inicial, este ser substitudo.

Funo strcat()

Esta funo utilizada para concatenar duas strings, ou seja, o contedo de uma string adicionado
ao final de outra string. A forma geral da funo :

strcat( string_destino, string_origem );

A string de origem permanecer inalterada e ser anexada ao fim da string de destino. Exemplo:

#include <stdio.h>
#include <string.h>
int main()
{
char str1[100], str2[100];
printf (Entre com uma string: );
gets (str1);
strcpy (str2,Voce digitou a string );
strcat (str2, str1);
printf (\n\n%s,str2);
return(0);
}

Funo strlen()

Uma funo bastante til na manipulao de strings a funo strlen() utilizada para retornar o
comprimento da string informada. No comprimento retornado no includo o finalizador de
strings. A forma geral para a funo :

strlen( nome_da_string );

A funo strlen() retorna um valor do tipo inteiro. Exemplo:

#include <stdio.h>
#include <string.h>
int main()
{
int tamanho;
char str[100];
printf( Entre com uma string: );
gets( str );
tamanho = strlen( str );
printf( \n\nTamanho da string digitada %d, tamanho );
return( 0 );
}




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


26

Funo strcmp()

Esta funo utilizada para comparar duas strings. O retorno desta funo um valor inteiro. A
forma geral da funo strcmp() :

strcmp( string1, string2 );

Caso as duas strings sejam idnticas a funo retorna o valor zero. Se o valor de retorno for
negativo significa que string1 menor que string2, e se o valor for positivo, string2 menor que
string1. Exemplo:

#include <stdio.h>
#include <string.h>
int main()
{
char str1[100], str2[100];
printf( Entre com uma string: );
gets( str1 );
printf( \n\nEntre com outra string: );
gets( str2 );
if( strcmp(str1,str2) )
printf( \n\nAs duas strings so diferentes. );
else
printf( \n\nAs duas strings so iguais. );

return( 0 );
}

7.3 Exerccios em Classe

1. Escreva um programa em C que leia uma string (no mximo 50 caracteres) via teclado e
informe a quantidade de letras a presentes na string (podendo ser maiscula ou minscula).

2. Escreva um programa em C que leia uma string (no mximo 30 caracteres) via teclado e a
escreva invertido.

3. Escreva um programa em C que conte o nmero de vogais presentes em uma string informada
via teclado por um usurio.













Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


27
4. Usando a tabela de cdigos ASCII, responda o que est escrito na propaganda abaixo:

char msg[] = {69,83,84,65,77,79,83,32,67,79,78,84,82,65,84,65,78,68,79,\0};

Tabela ASCII American Standard Code for Interchange Information
Char Dec Char Dec Char Dec Char Dec
NUL ^@ 0 SPACE 32 @ 64 96
^A 1 ! 33 A 65 a 97
^B 2 34 B 66 b 98
^C 3 # 35 C 67 c 99
^D 4 $ 36 D 68 d 100
^F 5 % 37 E 69 e 101
^F 6 & 38 F 70 f 102
^G 7 39 G 71 g 103
^H 8 ( 40 H 72 h 104
TAB ^I 9 ) 41 I 73 i 105
^J 10 * 42 J 74 j 106
^K 11 + 43 K 75 k 107
^L 12 , 44 L 76 l 108
^M 13 - 45 M 77 m 109
^N 14 . 46 N 78 n 110
^O 15 / 47 O 79 o 111
^P 16 0 48 P 80 p 112
^Q 17 1 49 Q 81 q 113
^R 18 2 50 R 82 r 114
^S 19 3 51 S 83 s 115
^T 20 4 52 T 84 t 116
^U 21 5 53 U 85 u 117
^V 22 6 54 V 86 v 118
^W 23 7 55 W 87 w 119
^X 24 8 56 X 88 x 120
^Y 25 9 57 Y 89 y 121
^Z 26 : 58 Z 90 z 122
^[ 27 ; 59 [ 91 { 123
^| 28 < 60 \ 92 | 124
^] 29 = 61 ] 93 } 125
^^ 30 > 62 ^ 94 ~ 126
^_ 31 ? 63 _ 95 del 127

5. Faa um programa em C que leia uma palavra pelo teclado e faa a impresso conforme o
exemplo a seguir para a palavra AMOR

AMOR
AMO
AM
A




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


28

6. Faa um programa em C que leia uma palavra pelo teclado e faa a impresso conforme o
exemplo a seguir para a palavra AMOR
A
AM
AMO
AMOR

7. Escreva um programa em C que leia uma string via teclado. Converta os caracteres para
minsculo e informe a quantidade de caracteres que tem cdigo ASCII par.

8. Escreva um programa em C que solicite o nome do usurio do sistema. O seu programa ir
gerar uma senha que formada apenas pelos caracteres das posies mpares mais a soma do
cdigo ASCII dos caracteres nas posies pares.

7.4 Exerccios Complementares

1. Faa um programa em C que leia quatro strings pelo teclado. Depois, concatene todas as strings
lidas em nica e escreva-a no vdeo.

2. Faa um programa em C que leia uma palavra pelo teclado e informe a quantidade de caracteres
que no so vogais.

3. Escreva um programa em C que leia uma palavra fornecida pelo teclado e em seguida escreva o
caractere presente no meio da palavra, caso esta tenha um nmero mpar de caracteres. Como
exemplo, considere a palavra SONHO. O caractere a ser impresso ser o N.

4. Uma string considerada um palndromo se quando lida da esquerda para a direita e da direita
para a esquerda apresentam o mesmo valor. Por exemplo: ANA. Escreva um programa em C em
que o usurio possa digitar vrias palavras e informe se so palndromos ou no. A cada palavra
informada pergunte ao usurio se ele deseja continuar a execuo do programa.

5. Escreva um programa em C que leia uma string (no mximo 100 caracteres) via teclado e
informe a quantidade de palavras presentes na string.








Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


29
Captulo 8

Arrays Bidimensionais (Matrizes)

8.1 Introduo

At agora, trabalhos com arrays unidimensionais (vetores). Um array bidimensional formado por
linhas e colunas, ou seja, temos uma tabela de elementos dispostos em linhas e colunas. Podemos
tambm afirmar que um array bidimensional basicamente um array de arrays unidimensionais.

Um array bidimensional pode ser representado pela figura abaixo:





2 10 5 0
1 256 33 85
9 66 65 63
69 63 58 70


8.2 Declarando um array bidimensional

Para declararmos um array bidimensional devemos especificar o nmero de linhas e o nmero de
colunas presentes. A forma geral para declarao :

tipo nome_do_array[nmero_de_linhas][nmero_de_colunas];

tipo pode ser qualquer tipo vlido em C (int, float, double, char). O primeiro ndice presente
representa o nmero total de linhas presentes no array e o segundo ndice o nmero total de colunas.
Exemplos de declarao:

int x[5][5];
float y[2][3];

O primeiro exemplo declara um array x com 5 linhas e 5 colunas e, no segundo exemplo temos um
array y com 2 linhas e 3 colunas. Tanto o ndice da linha quanto da coluna comeam em 0.

Para acessarmos um elemento especfico em um array bidimensional devemos informar o ndice da
linha e o da coluna. Por exemplo: x[2][1], retorna o elemento armazenado no array x, na linha 2 e
coluna 1. Por exemplo, considere o array x abaixo:


linhas
colunas




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


30
2 10 5 0
1 256 33 85
9 66 65 63
69 63 58 70

x[0][0] = 2 x[1][0] = 1 x[2][0] = 9 x[3][0] = 69
x[0][1] = 10 x[1][1] = 256 x[2][1] = 66 x[3][1] = 63
x[0][2] = 5 x[1][2] = 33 x[2][2] = 65 x[3][2] = 58
x[0][3] = 0 x[1][3] = 85 x[2][3] = 63 x[3][3] = 70

Como podemos perceber no exemplo acima, para acessar os elementos de uma determinada linha,
devemos fixar o ndice que representa a linha e variar o ndice que representa a coluna. Da mesma
forma, se quisermos acessar os elementos de uma coluna, fixamos o ndice da coluna e variamos o
ndice da linha. Em um programa que trabalha com um array bidimensional que processa todos os
elementos, usamos duas estruturas de repetio: uma para controlar o ndice que representa a linha e
a outra para controlar o ndice que representa a coluna.

O nmero de bytes de memria requerido por um array bidimensional computado utilizando a
seguinte frmula:

bytes = nmero_de_linhas * nmero_de_colunas * tamanho_do_tipo

Por exemplo, um array com 2 linhas e 2 colunas do tipo inteiro ocuparia 8 bytes na memria,
supondo que os nmeros inteiros ocupam apenas dois bytes (2 * 2 * 2).

Exemplo 1: o programa abaixo declara e preenche um array bidimensional com valores aleatrios
entre 0 e 20.

#include <stdio.h>
#include <stdlib.h>
int main()
{
int m[2][2], l, c;
for( l = 0; l < 2; l++ )
for( c = 0; c < 2; c++ )
m[l][c] = rand()%20;

return( 0 );
}













Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


31
Exemplo 2: Neste exemplo, o array que foi preenchido no exemplo 1 impresso no vdeo.

#include <stdio.h>
int main()
{
int m[2][2], l, c;
for( l = 0; l < 2; l++ )
{
for( c = 0; c < 2; c++ )
printf( %d\t, m[l][c] );

printf(\n);
}

}

No primeiro exemplo, o array m preenchido com valores aleatrios gerados pela funo rand().
Podemos tambm preencher o array com valores informados via teclado. Veja o exemplo abaixo:

#include <stdio.h>
int main()
{
int m[2][2], l, c;
for( l = 0; l < 2; l++ )
for( c = 0; c < 2; c++ )
{
printf(Digite um valor: );
scanf(%d, &m[l][c]);
}

return( 0 );
}

Outro ponto j comentado nas aulas de vetores que a linguagem de programao C no faz a
verificao dos limites do array. Isso tarefa do programador!

8.3 Exerccios em Classe

1. Considere uma matriz B , quadrada de ordem 3 inicialmente vazia. O programa abaixo ir
preench-la. Aps a execuo do programa, desenhe a matriz com os elementos.

#include <stdio.h>
int main()
{
int i, j, B[3][3];
for( j = 0; j < 3; j++ )
for( i = 0; i < 3; i++ )
B[i][j] = 2*j+i;

return( 0 );
}





Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


32
2. Dada a matriz:
(
(
(

=
7 0 2
6 4 2
5 1 3
A . Considere o programa abaixo que manipula a matriz A .

#include <stdio.h>
int main()
{
int i, j, A[3][3];
for( i = 0; i < 3; i++ )
for( j = 0; j < 3; j++ )
if( A[i][j] % 2 == 0 )
A[i][j] = A[i][j] * 3;

return( 0 );
}

Desenhe a nova matriz resultante aps a execuo do programa acima.

3. Escreva um programa em C que preencha uma matriz quadrada de ordem 4 com valores inteiros
fornecidos pelo usurio. Mostre a soma de todos os elementos da matriz.

4. Para a matriz do exerccio anterior, calcule e escreva a soma dos elementos da diagonal
principal.

5. Para a matriz do exerccio 3, calcule e escreva a soma dos elementos da diagonal secundria.

6. Dadas as matrizes
3 3x
A e
3 3x
B preenchidas com valores aleatrios entre 0 e 20, gere a matriz
B A C + = .

7. Escreva um programa em C que preencha uma matriz
10 10x
D com valores aleatrios entre 0 e
1000. Escreva o maior valor armazenado bem como a sua localizao.

8. Faa um programa em C que entre com valores reais para uma matriz
3 2x
C . Gere e escreva a
t
C . A matriz transposta gerada trocando linha por coluna. Veja o exemplo a seguir:

(

=
6 5 4
3 2 1
C
(
(
(

=
6 3
5 2
4 1
t
C

9. Dadas as matrizes
2 3x
A e
3 2x
B , gere B A C * = .

10. Escreva um programa em C que leia e armazene 50 nomes. Mostre a quantidade de nomes que
comeam com a letra a.





Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


33
11. Para o exerccio 10, escreva apenas os nomes que comeam com a letra c.

12. Para a matriz do exerccio 10, escreva o maior nome armazenado (aquele que apresenta o maior
nmero de caracteres).

13. Escreva um programa em C que leia o nome de 10 alunos de uma turma. Leia tambm a nota da
primeira e da segunda prova. Calcule a mdia aritmtica e escreva todas as informaes no vdeo.


8.4 Exerccios Complementares

10. O que o programa abaixo imprime?

#include <stdio.h>
int main()
{
int t, i, M[3][4];

for (t=0; t<3; ++t)
for (i=0; i<4; ++i)
M[t][i] = (t*4)+i+1;

for (t=0; t<3; ++t)
{
for (i=0; i<4; ++i)
printf ("%d ", M[t][i]);
printf ("\n");
}
return(0);
}

11. Escreva um programa em C para gerar a seguinte matriz:

(
(
(
(

=
16 12 8 4
12 9 6 3
8 6 4 2
4 3 2 1
t

12. Faa um programa em C que preencha uma matriz quadrada de ordem 5 com valores aleatrios
entre 0 e 50. Em seguida, escreva todos os elementos que esto acima da diagonal secundria bem
como a sua soma.

13. Escreva um programa em C que preencha uma matriz quadrada de ordem 10 com valores
aleatrios entre 0 e 1000. Escreva todos os elementos da diagonal principal e da secundria.





Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


34
14. Dadas as matrizes
2 2x
X e
2 2x
Y preenchidas com valores inteiros fornecidos pelo usurio, gere a
matriz Y X Z = .

15. Escreva um programa em C que entre com valores para uma matriz
4 3x
A . Gere e escreva a
matriz B que o triplo da matriz A .

16. Escreva um programa em C que preencha uma matriz
5 4x
C com valores reais informados pelo
usurio. Calcular e escreva a soma de todos os seus elementos.

17. Dada uma matriz B (quadrada de ordem 10) de nmeros inteiros, determine a quantidade de
nmeros mpares e pares armazenados.

18. Faa um programa em C que leia uma matriz 12 x 4 com valores das vendas de uma loja, em
que cada linha representa um ms do ano, e cada coluna, uma semana do ms. Calcule e escreva:
a) total vendido em cada ms;
b) total vendido no ano;

19. Escreva um programa em C que preencha uma matriz quadrada de ordem 5 com valores inteiros
fornecidos pelo usurio. Verifique se a matriz ou no uma matriz triangular superior. Matriz
triangular superior uma matriz onde todos os elementos de posio L < C so diferentes de 0 e
todos os elementos de L > C so iguais a 0. L e C representam respectivamente linha e coluna.

20. Considere a seguinte matriz ] 3 ][ 2 ][ 3 [ B . Preencha a matriz com valores aleatrios entre 0 e 50.
Em seguida calcule e escreva a soma dos elementos.

21. Criar um programa em C que possa armazenar as alturas de dez atletas de cinco delegaes que
participaro dos jogos de vero. Escreva a maior altura de cada delegao.

22. Escreva um programa em C que leia 10 nomes via teclado. Os nomes devero ser armazenados
em ordem crescente de tamanho (em relao ao nmero de caracteres presentes na string).





Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


35

Captulo 9
Introduo aos Ponteiros

9.1 Definio
Os ints guardam inteiros. Os floats guardam nmeros de ponto flutuante. Os chars guardam
caracteres. Ponteiros guardam endereos de memria. Quando voc anota o endereo de um colega
voc est criando um ponteiro. O ponteiro o seu pedao de papel. Ele tem anotado um endereo.
Qual o sentido disto? Simples. Quando voc anota o endereo de um colega, depois voc vai usar
este endereo para ach-lo. A linguagem C funciona assim. Voc anota o endereo de algo numa
varivel ponteiro para depois usar.
Da mesma maneira, uma agenda, onde so guardados endereos de vrios amigos, poderia ser vista
como sendo uma matriz de ponteiros na linguagem C.
Um ponteiro tambm tem tipo. Veja: quando voc anota um endereo de um amigo voc o trata
diferente de quando voc anota o endereo de uma firma. Apesar de o endereo dos dois locais ter o
mesmo formato (rua, nmero, bairro, cidade, etc.) eles indicam locais cujos contedos so
diferentes. Ento os dois endereos so ponteiros de tipos diferentes.
Na linguagem C quando declaramos ponteiros ns informamos ao compilador para que tipo de
varivel vamos apont-lo. Um ponteiro int aponta para um inteiro, isto , guarda o endereo de um
inteiro.
9.2 Declarao de ponteiros
Para declarar um ponteiro temos a seguinte forma geral:
tipo_do_ponteiro *nome_da_varivel;

o asterisco (*) que faz o compilador saber que uma varivel no vai guardar um valor e sim um
endereo para aquele tipo especificado. Exemplos de declaraes:

int *pt;
char *temp,*pt2;
O primeiro exemplo declara um ponteiro para um inteiro. O segundo declara dois ponteiros para
caracteres. Eles ainda no foram inicializados (como toda varivel do C que apenas declarada).
Isto significa que eles apontam para um lugar indefinido. Este lugar pode estar, por exemplo, na
poro da memria reservada ao sistema operacional do computador. Usar o ponteiro nestas
circunstncias pode levar a um travamento do micro, ou a algo pior. O ponteiro deve ser




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


36
inicializado (apontado para algum lugar conhecido) antes de ser usado! Isto de suma
importncia!
9.3 Operadores de ponteiros (& e *)
Para atribuir um valor a um ponteiro recm-criado poderamos igual-lo a um valor de memria.
Mas, como saber a posio na memria de uma varivel do nosso programa? Seria muito difcil
saber o endereo de cada varivel que usamos, mesmo porque estes endereos so determinados
pelo compilador na hora da compilao e realocados na execuo. Podemos ento deixar que o
compilador faa este trabalho por ns. Para saber o endereo de uma varivel basta usar o operador
&. Veja o exemplo:
int count = 10;
int *pt;
pt = &count;

Criamos um inteiro count com o valor 10 e um ponteiro para um inteiro pt. A expresso &count
nos d o endereo de count, o qual armazenamos em pt. Simples, no ? Repare que no alteramos
o valor de count, que continua valendo 10.
Como ns colocamos um endereo em pt, ele est agora "liberado" para ser usado. Podemos, por
exemplo, alterar o valor de count usando pt. Para tanto vamos usar o operador "inverso" do
operador &. o operador *. No exemplo acima, uma vez que fizemos pt = &count a expresso *pt
equivalente ao prprio count. Isto significa que, se quisermos mudar o valor de count para 12,
basta fazer *pt=12.
Vamos fazer uma pausa e voltar nossa analogia para ver o que est acontecendo.
Digamos que exista uma firma. Ela como uma varivel que j foi declarada. Voc tem um papel
em branco onde vai anotar o endereo da firma. O papel um ponteiro do tipo firma. Voc ento
liga para a firma e pede o seu endereo, o qual voc vai anotar no papel. Isto equivalente, no C, a
associar o papel firma com o operador &. Ou seja, o operador & aplicado firma equivalente a
voc ligar para a mesma e pedir o endereo. Uma vez de posse do endereo no papel voc poderia,
por exemplo, fazer uma visita firma. No C voc faz uma visita firma aplicando o operador * ao
papel. Uma vez dentro da firma voc pode copiar seu contedo ou modific-lo.
Uma observao importante: apesar do smbolo ser o mesmo, o operador * (multiplicao) no o
mesmo operador que o * (referncia de ponteiros). Para comear o primeiro binrio, e o segundo
unrio.
Aqui vo dois exemplos de usos simples de ponteiros:
#include <stdio.h>
int main()
{
int num, valor;
int *p;




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


37
num = 55;
p = &num;
valor = *p; //atribuio de forma indireta
printf("\n\n%d\n",valor);
printf("Endereo para onde o ponteiro aponta: %p\n",p);
printf("Valor da varivel apontada: %d\n",*p);
return(0);
}

#include <stdio.h>
int main()
{
int num,*p;
num = 55;
p = &num; /* Pega o endereo de num */
printf("\nValor inicial: %d\n",num);
*p = 100; /*Muda o valor de num de uma maneira indireta */
printf("\nValor final: %d\n",num);
return(0);
}
Nos exemplos acima vemos um primeiro exemplo do funcionamento dos ponteiros. No primeiro
exemplo, o cdigo %p usado na funo printf() indica funo que ela deve escreva um endereo.
Podemos fazer algumas operaes aritmticas com ponteiros. A primeira, e mais simples, igualar
dois ponteiros. Se temos dois ponteiros p1 e p2 podemos igual-los fazendo p1=p2. Repare que
estamos fazendo com que p1 aponte para o mesmo lugar que p2. Se quisermos que a varivel
apontada por p1 tenha o mesmo contedo da varivel apontada por p2 devemos fazer *p1=*p2.
Basicamente, depois que se aprende a usar os dois operadores (& e *) fica fcil entender operaes
com ponteiros.
9.4 Cuidados com ponteiros
O principal cuidado ao se usar um ponteiro deve ser: saiba sempre para onde o ponteiro est
apontando. Isto inclui: nunca use um ponteiro que no foi inicializado. Um pequeno programa que
demonstra como no usar um ponteiro:
#include <stdio.h>
int main() /* Errado - No Execute */
{
int x,*p;
x = 13;
*p = x;
return(0);
}
Este programa compilar e rodar. O que acontecer? Ningum sabe. O ponteiro p pode estar
apontando para qualquer lugar. Voc estar gravando o nmero 13 em um lugar desconhecido. Com




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


38
um nmero apenas, voc provavelmente no vai ver nenhum defeito. Agora, se voc comear a
gravar nmeros em posies aleatrias no seu computador, no vai demorar muito para travar o
micro (se no acontecer coisa pior).
9.5 Exerccios em Classe

1. Aps a execuo do trecho de programa abaixo, o que ser impresso?

#include <stdio.h>
void main( void )
{
int x, *y;
x = 25;
y = &x;
*y += 2;
printf(%d, x );
}

2. Considere o trecho de programa abaixo. Quais sero os valores armazenados nas variveis aps
sua execuo?

#include <stdio.h>
void main( void )
{
int a = 2, b = 3, temp;
int *pa, *pb;

pb = &b;
pa = &a;

temp = *pb;
*pb = *pa;
*pa = temp;
}

3. Analise o trecho de programa abaixo e informe o que ser impresso aps a execuo.

#include <stdio.h>
void main( void )
{
float x, y, *z;
x = 10.0;
z = y;
*z = x + 2.5;
printf(x = %f, y = %f, x, y);
}




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


39
Captulo 10
Funes

10.1 Introduo
At agora os nossos programas foram codificados com uma funo principal (main()) onde toda a
atividade do programa ocorre. Em algumas situaes, utilizamos algumas funes definidas da
linguagem C tais como: rand(), pow(), sqrt(). Lembre-se que essas funes foram utilizadas dentro
da funo principal.
A medida que os nossos programas vo ficando maiores, sua complexidade aumenta e portanto fica
tambm mais difcil fazer manutenes e at mesmo entender a lgica do programa. Dessa forma,
as linguagens de programao permitem que os usurios separem seus programas em blocos. A
idia dividir programas grandes e complexos em blocos para facilitar a sua construo. Esses
blocos de construo so chamados em C de funes. Portanto, uma funo nada mais do que um
bloco de construo que realiza uma atividade especfica.
A declarao de uma funo em C segue o mesmo padro adotado para a funo principal do
programa. A sua forma geral :


tipo_de_retorno nome_da_funo ( declarao_de_parmetros )
{
corpo_da_funo;
}

O tipo_de_retorno o tipo de varivel que a funo vai retornar. O default o tipo int, ou seja, uma
funo para qual no declaramos o tipo de retorno considerada como retornando um inteiro. A
declarao de parmetros feita de forma semelhante a declarao de variveis que estamos
acostumados a fazer em nossos programas. A grande diferena na declarao dos parmetros que
devemos especificar o tipo para cada varivel. Exemplo:

tipo variavel1, tipo variavel2, tipo variavel3, ..., tipo variavelN

Estas variveis que compem os parmetros da funo representam as entradas para a funo. A
sada da funo est especifica no tipo de retorno. O copo_da_funo contm as instrues que iro
processar os dados de entrada (parmetros), gerando as sadas da funo.

Para que um valor seja retornado pela funo, deve-se utilizar o comando return. Quando se chega
a uma declarao return a funo encerrada imediatamente e, se o valor de retorno informado, a
funo retorna este valor. importante lembrar que o valor de retorno fornecido tem que ser
compatvel com o tipo de retorno declarado para a funo. A forma geral do comando return :

return valor_de_retorno;





Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


40
Ou

return;

Abaixo apresentado um exemplo simples de um programa que calcula a raiz quadrada de um
nmero inteiro, usando uma funo definida.

#include <stdio.h>

int quadrado( int x )
{
return x*x;
}

int main()
{
int y, total;
printf(Digite um valor: );
scanf(%d, &y );
total = quadrado(y);
printf(O quadrado de %d %d, y, total);
return( 0 );
}


No exemplo acima, note que o retorno da funo quadrado() atribudo a uma varivel do tipo
inteiro. A situao abaixo no pode ser realizada, pois causar erros:

quadrado(y) = total;

10.2 Prottipos de funes

No exemplo anterior onde codificamos uma funo para calcular o quadrado de um nmero, o
cdigo da funo foi escrito antes da funo principal main(). Existe uma explicao para isso. No
momento da compilao da funo principal, nos locais onde as funes so chamadas, temos que
saber o tipo de retorno das funes e os parmetros das funes. Quando as funes definidas pelo
usurio esto antes da funo principal, ao compilar a funo main() o compilador j compilou as
funes e sabe os tipos de parmetros e retornos das funes.

Caso no seja possvel codificar as funes antes da funo main(), a linguagem C apresenta o
conceito de prottipos de funes. Os prottipos nada mais so do que declaraes de funes, ou
seja, voc declara a funo que ir usar. Dessa forma, o compilador ser informado sobre a funo e
os tipos de valores que a funo recebe e retorna. O formato para um prottipo de funo :

tipo_de_retorno nome_da_funo( lista_de_parmetros );

sendo que o tipo_de_retorno, o nome_da_funo e a lista_de_parmetros so os mesmo que voc
utilizar na codificao da funo. O prottipo representa o cabealho da funo (sem o cdigo).




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


41
Repare tambm que o prottipo de uma funo termina com ponto e vrgula. Na codificao da
funo no podemos terminar o cabealho com ponto e vrgula.

Como exemplo vamos reescrever o programa que utiliza uma funo definida pelo usurio para
calcular o quadrado de um nmero, usando prottipos.

#include <stdio.h>

int quadrado( int x );

int main()
{
int y, total;
printf(Digite um valor: );
scanf(%d, &y );
total = quadrado(y);
printf(O quadrado de %d %d, y, total);
return( 0 );
}

int quadrado( int x )
{
return x*x;
}

No exemplo acima, a funo quadrado() foi codificada aps a funo main(), mas seu prottipo foi
declarado antes.

Quando temos uma funo que no retorna nenhum tipo de valor ou que no recebe nenhum
parmetro, utilizamos o tipo void na especificao. A palavra void do ingls significa vazio. Como
exemplo, considere a funo abaixo que no retorna nenhum valor e tambm no recebe nenhum
parmetro.

#include <stdio.h>

void escreva( void );

int main( main )
{
escreva();

return( 0 );
}
void escreva( void )
{
printf(Testando!);
}





Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


42
Repare no exemplo acima que s utilizamos o comando return quando uma funo deve retornar
um valor ou ser interrompida (como j foi visto).

10.3 Passagem de Parmetros

Nos exemplos anteriores, quando chamamos as funes passamos valores paras as mesmas. Isso
acontece porque valores declarados em uma funo no so acessveis dentro de outra. Em C temos
dois tipos de passagem de parmetros: passagem por valor e passagem por referncia.

Na passagem por valor como o prprio nome indica, apenas uma cpia dos valores so passados
para a funo. As alteraes realizadas pela funo no so feitas nos valores originais do
parmetro. Como exemplo podemos citar o programa para o clculo do quadrado de um nmero
codificado anteriormente. Vamos considerar outro exemplo abaixo:

#include <stdio.h>

float somar( float x, float y );

int main( void )
{
float a, b, total;
printf(Digite um valor: );
scanf(%f, &a );
printf(Digite um valor: );
scanf(%f, &b );
total = somar( a, b );
printf(a soma dos nmeros : %f, total );
return( 0 );
}

float somar( float x, float y )
{
float t;
t = x + y;
return t;
}

No exemplo acima, os valores declarados na funo main() so passados para a funo somar(),
que realiza a soma e retorna o resultado. Veja que os valores originais na funo main() no so
alterados. Esse tipo de passagem de parmetro por valor, e o padro da linguagem.

Uma outra maneira de passagem de parmetros quando a funo que recebe os parmetros
consegue alterar os valores originais na funo onde os mesmos foram declarados. Esse tipo de
passagem de parmetro conhecido como passagem por referncia. Neste caso a referncia
(endereo) das variveis so passadas para as funes. Considere o exemplo abaixo:







Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


43
#include <stdio.h>

void troca( float *x, float *y );

int main( void )
{
float a, b;
printf(Digite um valor: );
scanf(%f, &a );
printf(Digite um valor: );
scanf(%f, &b );
troca( &a, &b );
printf(a = %f e b = %f, a, b );
return( 0 );
}

void troca( float *x, float *y )
{
float t;
t = *x;
*x = *y;
*y = t;
}

O que acontece no exemplo acima que estamos passando para a funo troca() os endereos das
variveis a e b. Estes endereos so armazenados nos ponteiros x e y da funo. Como vimos no
captulo anterior, o operador (*) utilizado para acessar o contedo apontado pelos ponteiros.

Uma utilizao muito comum de passagem de parmetros por referncia quando uma funo deve
retornar dois ou mais valores. Lembre-se que uma funo retorna apenas um valor. Dessa forma, a
soluo passar os parmetros por referncia.

10.4 Passagem de arrays para funes

Da mesma forma que passamos variveis comuns para as funes, tambm podemos passar arrays.
Vamos considerar como exemplo a seguinte declarao para um array unidimensional:

int y[200];

Considere tambm que queiramos chamar a funo alterar() e passar o array y como parmetro.
Para passarmos o array para a funo, apenas referenciamos o nome da varivel. Exemplo:

alterar( y );









Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


44
O diferencial est na declarao da varivel que ir receber o parmetro. Essa declarao pode ser
feita de duas maneiras diferentes:

1. void alterar( int t[200] );
2. void alterar( int *t );

Quando passamos um array para uma funo em C, a passagem de parmetros feita por
referncia. Nas trs situaes acima, a funo alterar() recebe um ponteiro (endereo) do primeiro
elemento armazenado no array. Esse tipo de passagem de parmetro bem prtico para a
linguagem. Imagine a situao onde temos um array com uma quantidade grande de elementos, se a
passagem dos parmetros fosse por valor, o compilador teria que fazer uma cpia de todos os
valores para a funo, o que poderia haver uma perda de desempenho do programa.

A manipulao do array dentro da funo realizada da mesma forma que estvamos manipulando,
independentes da forma com que o parmetro declarado.

10.5 Escopo de variveis

As variveis que utilizamos em nossos programas podem ser declaradas em trs lugares diferentes.
Dependendo da sua declarao, a abrangncia das variveis muda. Os trs tipos so:
Variveis locais;
Variveis globais;
Parmetros formais.

Os nossos primeiros programas em C usavam apenas a funo main(). Dessa forma, todas as
variveis eram declaradas dentro dessa funo. Essas variveis so denominadas variveis locais, e
s tem validade dentro do bloco onde foram declaradas.

As variveis globais so declaradas fora das funes de um programa, podendo ser acessadas e
alteradas por todas as funes.

Os parmetros formais se referem as variveis que so declaradas para receber os parmetros das
funes. Essas variveis s apresentam abrangncia enquanto a funo est sendo executada, ou
seja, essas variveis so locais a funo.

10.6 Exerccios em Classe

1. Considere o programa em C abaixo

#include <stdio.h>

int teste( int a, int b );

int main( void )
{
int x = 9, y = 5, total;
total = teste( x, y );




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


45
return( 0 );
}

int teste( int a, int b )
{
int y;
y = a % b;
return y;
}

Qual ser o valor armazenado na varivel total aps a execuo do programa acima?

2. Analise o programa abaixo e responda:

#include <stdio.h>
#include <math.h>

int teste( int a );

int main( void )
{
int x = 144, total;
total = teste( x );
return( 0 );
}

int teste( int a )
{
int y;
y = sqrt( a );
return y;
}

a) Qual o valor armazenado na varivel total aps a execuo do programa?
b) Quais so as variveis globais do programa acima?
c) Indique todas as variveis locais e a quais funes elas pertencem.

3. Escreva um programa em C que contenha uma funo que receba como parmetro um array
unidimensional contendo 1000 nmeros inteiros. A funo dever encontrar e retornar o maior
elemento armazenado no array.

4. Reescreva apenas a funo do exerccio anterior, usando passagem de parmetros por
referncia.

5. Escreva apenas uma funo em C que receba como parmetro uma string e retorne a quantidade
de vogais presentes na string.






Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


46
6. Analise o programa abaixo:

#include <stdio.h>

void teste( int *x, int *y );

int main( void )
{
int a = 10, b = 7;
teste( &a, &b );
return( 0 );
}

void teste( int *x, int *y )
{
*x += *y;
*y -= 4;
}

Aps a execuo do programa acima, quais sero os valores armazenados respect ivamente nas
variveis a e b?

7. Escreva um programa em C contendo uma funo que receba como parmetro um valor inteiro
com trs dgitos. A funo dever determinar o valor armazenado na casa das dezenas. Por
exemplo: 123 = 2. Utilize passagem de parmetros por referncia.

8. Escreva um programa em C contendo uma funo que receba como parmetro um valor inteiro
positivo, representando um termo na seqncia de Fibonacci. A funo dever retornar o valor
correspondente ao termo. Utilize passagem de parmetros por referncia.

9. Um nmero chamado triangular quando o resultado do produto de trs nmeros
consecutivos. Por exemplo: 24 = 2 x 3 x 4. Escreva apenas uma funo em C que receba como
parmetro um nmero inteiro e positivo e verifique se o mesmo triangular. Utilize passagem de
parmetro por valor.

10. Escreva apenas uma funo em C que receba como parmetro um array bidimensional
(quadrado de ordem 10 contendo valores inteiros). Calcule e retorne a soma dos elementos da
diagonal principal.

10.7 Exerccios Complementares

11. Escreva um programa em C contendo uma funo que receba um nmero inteiro. A funo
dever retornar o sucessor e o antecessor do nmero. Utilize passagem de parmetro por referncia.

12. Escreva um programa em C que contenha uma funo que receba como parmetro trs valores
inteiros. A funo dever encontrar o maior dos trs valores e retornar para a funo principal que
dever escreva o valor no vdeo. Utilize passagem de parmetros por valor.





Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


47
13. Reescreva o programa do exerccio anterior utilizando passagem de parmetros por referncia.

14. Reescreva a funo do exerccio 9, utilizando passagem de parmetro por referncia.

15. Escreva apenas uma funo em C que receba como parmetro uma string e retorne a ltima
letra.

16. Escreva apenas uma funo em C que receba um valor representando uma temperatura na escala
Fahrenheit e converta para a escala Centgrados. A frmula de converso :
5
160 9 +
=
C
F , onde F
representa a temperatura em Fahrenheit e C em Centgrados.

17. Escreva um programa em C, contendo uma funo que receba trs valores inteiros. Seu
programa dever escreva os valores em ordem crescente. Utilize passagem de parmetros por
referncia.

18. Escreva um programa em C para calcular e escreva as razes de uma equao do 2 grau. Seu
programa dever ter duas funes: uma para o clculo do delta e a outra para calcular as razes da
equao.

19. Escreva apenas uma funo em C que receba como parmetro trs valores inteiros e positivos e
verifique se os mesmo podem formar um tringulo. Lembre-se que: trs nmeros podem representar
os lados de um tringulo se cada lado menor que a soma dos outros dois. Utilize passagem de
parmetro por referncia.

20. Escreva um programa em C, contendo uma funo que calcule e retorne o valor da expresso:
16
3 5
2

+
=
x
x
y .

21. Escreva apenas uma funo em C que receba como parmetro uma frase e retorne o valor do
caractere localizado no meio da frase, caso a frase tenha um nmero mpar de caracteres.

22. Escreva um programa em C, contendo uma funo que calcule e retorne o valor da expresso:
N
h
1
...
4
1
3
1
2
1
1 + + + = .

23. Escreva apenas uma funo em C que calcule e retorne o valor da expresso:
n
n
n n n
y +

+ +

+ =
2
1
...
2
3
1
2 1
.

24. Repare a seguinte caracterstica do nmero 3025: 30 + 25 = 55 e 55
2
= 3025. Escreva um
programa em C contendo uma funo que verifique um nmero com quatro dgitos apresenta a
caracterstica acima. Seu programa dever leia vrios nmeros(um de cada vez). O programa
termina quando for lido um valor menor do que 1000 ou maior que 9999.





Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


48
25. Uma empresa classifica seus funcionrios em trs nveis de acordo com um ndice de
produtividade. So eles: (1) Excelente, (2) Bom e (3) Regular. Cada nvel acrescenta um abono ao
salrio base do funcionrio, de acordo com a seguinte tabela:

Nvel Aumento
Excelente 80% do salrio base
Bom 50% do salrio base
Regular 30% do salrio base

Escreva um programa em C que leia o cdigo do funcionrio (numrico), seu salrio base e seu
nvel. O programa dever escreva o novo salrio do funcionrio. O clculo do salrio dever ser
feito por uma funo. O programa dever ser executado para vrios funcionrios at que o cdigo 0
seja informado.

26. Escreva um programa em C que apresente o seguinte menu de opes para os usurios:

Escolha uma opo:
1. somar
2. subtrair
3. Multiplicar
4. Dividir

Resultado:

O usurio dever escolher uma opo vlida e em seguida fornecer dois valores. Dependendo da
opo escolhida, seu programa dever executar os clculos e exibir o resultado. Utilize uma funo
para cada opo.

27. A concessionria local de telefonia de uma cidade do interior gostaria de fazer um programa
que pudesse controlar a central de 1000 assinantes que foi disponibilizada para a cidade. Faa um
programa que funcione de acordo com o seguinte menu:

Menu de Opes:

1. Incluso de novo telefone
2. Alterao de telefone
3. Excluso de telefone
4. Impresso dos telefones cadastrados.
5. Consulta por nome
6. Sair

Para cada uma das opes do menu dever ter uma funo no seu programa. Sugesto: trabalhe com
dois arrays, um para o nmero dos telefones e o outro para os nomes. Declare os arrays como
variveis globais.





Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


49
Captulo 11

Estruturas

11.1 Definio e declarao de estruturas em C

At o momento vimos como agrupar vrias informaes (utilizando arrays) do mesmo tipo. Em C
podemos agrupar tambm informaes de tipos diferentes formando um novo tipo de dados. Esse
novo tipo chamado de tipo personalizado ou tipos definidos pelo usurio. Este tipo conhecido
como estrutura em C ou como registro em algumas linguagens de programao como o pascal.
Define-se estrutura como um conjunto de variveis que so referenciadas sob o mesmo nome,
oferecendo um meio de manter as informaes relacionadas juntas. Como exemplo de uma
estrutura podemos citar uma ficha pessoal contendo nome, telefone e endereo. Essas trs
informaes esto relacionadas entre si para compor a ficha. A ficha em si a estrutura.
Para se criar uma estrutura em C usa-se o comando struct. Sua forma geral :

struct nome_da_estrutura
{
tipo_1 nome_1;
tipo_2 nome_2;
...
tipo_n nome_n;
} variveis_estrutura;

O nome_da_estrutura o nome para a estrutura. As variveis_estrutura so opcionais e seriam
nomes de variveis que o usurio j estaria declarando e que seriam do tipo nome_da_estrutura.
Note que a declarao terminada com ponto e vrgula (;). Um primeiro exemplo:

struct teste{
float i;
int f;
} a, b;

Neste caso, teste uma estrutura com dois campos, i e f. Foram tambm declaradas duas variveis,
a e b que so do tipo da estrutura, isto , a possui os campos i e f, o mesmo acontecendo com b. O
exemplo abaixo cria uma estrutura de endereos:

struct tipo_endereco
{
char rua [50];
int numero;




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


50
char bairro [20];
char cidade [30];
char sigla_estado [3];
long int CEP;
};
Um outro exemplo a criao de uma estrutura chamada pessoa, que contm os dados pessoais de
um individuo:

struct pessoa
{
char nome [50];
long int telefone;
struct tipo_endereco endereco;
};

Como mostrado no exemplo acima, uma estrutura pode fazer parte de outra (a struct tipo_endereco
usada pela struct ficha_pessoal).
O programa abaixo mostra como as duas estruturas declaradas acima podem ser utilizadas dentro de
um programa. O programa preenche uma ficha pessoal de um cliente.

#include <stdio.h>
#include <string.h>
struct tipo_endereco
{
char rua[50];
int numero;
char bairro[20];
char cidade[30];
char sigla_estado[3];
long int CEP;
};

struct pessoa
{
char nome[50];
long int telefone;
struct tipo_endereco endereco;
};

int main( void )
{
struct pessoa ficha;
strcpy (ficha.nome,"Luiz Osvaldo Silva");
ficha.telefone=4921234;
strcpy (ficha.endereco.rua,"Rua das Flores");
ficha.endereco.numero=10;




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


51
strcpy (ficha.endereco.bairro,"Cidade Velha");
strcpy (ficha.endereco.cidade,"Belo Horizonte");
strcpy (ficha.endereco.sigla_estado,"MG");
ficha.endereco.CEP=31340230;
return 0;
}

O programa acima declara uma varivel ficha do tipo pessoa e preenche os seus dados. O exemplo
mostra como podemos acessar um elemento de uma estrutura: basta usar o ponto (.). Assim, para
acessar o campo telefone de ficha, escrevemos:

ficha.telefone = 4921234;

Como a struct pessoa possui um campo, endereco, que tambm uma struct, podemos fazer acesso
aos campos desta struct interna da seguinte maneira:

ficha.endereco.numero = 10;
ficha.endereco.CEP=31340230;

Desta forma, estamos acessando, primeiramente, o campo endereco da struct ficha e, dentro deste
campo, estamos acessando o campo numero e o campo CEP.

11.2 Matrizes de estruturas

Uma estrutura como qualquer outro tipo de dado no C. Podemos, portanto, criar matrizes de
estruturas. Vamos ver como ficaria a declarao de um array de 100 do tipo struct pessoa:

struct pessoa fichas [100];
Poderamos ento acessar a segunda letra da sigla de estado da dcima terceira ficha fazendo:
fichas[12].endereco.sigla_estado[1];

Observao: Como todas as matrizes, matrizes de estruturas comeam a indexao em 0.

11.3 Passando elementos de estruturas como parmetros para funes

Nos exemplos apresentados acima para a utilizao de estruturas, as mesmas sempre foram
declaradas como variveis globais. Para passar um elemento de uma varivel estrutura para uma
funo simples, pois voc passa apenas o valor desse elemento para a funo. Exemplo:

struct misterio{
char x;
int y;




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


52
float z;
char s[10];
} teste;

func( teste.x ); //passa apenas o valor do caractere x para a funo
func( teste.y ); //passa apenas o valor da varivel y para funo
func( teste.s[2] ); //passa o valor do caractere de s[2]

Nos exemplos mostrados acima, temos a passagem de parmetros por valor. Caso seja necessrio
passar o endereo de um elemento individual da estrutura, basta colocar o operado & antes da
varivel do tipo da estrutura. Exemplo:

func( &teste.x ); //passa o endereo do caractere x para a funo
func( &teste.y ); //passa o endereo da varivel y para a funo
func( teste.s ); //passa o endereo da string s para a funo.

No se esquea que o operador & precede o nome da varivel do tipo estrutura e no o nome do
elemento individual da estrutura. Outro ponto a destacar com relao a variveis do tipo vetores
de caracteres (strings) que j significam endereos de memria, portanto a utilizao do operador &
dispensvel.

11.4 Passando estruturas inteiras para funes

No tpico anterior passamos elementos individuais como parmetros para funes. Da mesma
forma, podemos passar para uma funo a estrutura inteira. Quando uma estrutura for passada como
parmetro para uma funo, no se esquea que o tipo de argumento deve coincidir com o tipo de
parmetro. Veja o exemplo abaixo:

void main( void )
{
struct exemplo{
int a, b;
char c;
} d;

d.a = 1000;
f( d );
}

f( struct {
int x, y;
char h; } p )
{
printf(%d, p.x);
}






Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


53
11.5 Ponteiros para estruturas

A linguagem de programao C permite a utilizao de ponteiros para estruturas da mesma forma
que permite a utilizao de ponteiros para os outros tipos de variveis. Como para as outras
variveis, a declarao do ponteiro feita utilizando o operador * na frente do nome da estrutura.
Exemplo:

struct teste *p;

No exemplo acima, a varivel p armazena o endereo de memria da estrutura teste. Ponteiros para
estruturas apresentam duas aplicaes bsicas:
Gerar passagem por referncia
Criao de estruturas de dados encadeadas (listas). Este ser o enfoque do curso de Estruturas
de Dados 1 no prximo ano.

A principal desvantagem da passagem de estruturas por valor est no tempo necessrio para
armazenar e retirar todos os elementos da estrutura da pilha, caso a estrutura apresente muitos
membros. Estruturas grandes quando passadas por valor podem prejudicar o desempenho do
programa. O mesmo no acontece para estruturas pequenas.

Uma soluo para no comprometer o desempenho do programa quando uma estrutura grande
precisa ser passada para uma funo, a utilizao de ponteiros para estruturas. Neste caso, apenas
um endereo de memria armazenado na pilha. Exemplo da atribuio do endereo de uma
estrutura para uma varivel ponteiro.

struct teste {
int a, b;
float x;
} y;

struct teste *p;

p = &y;

Quando utilizamos ponteiros para estruturas, a forma de acessar os dados sofre alterao. Nesta
situao utiliza-se o operador () ao operador (.). Por exemplo:

pa = 10;

O operador seta somente utilizado quando se est acessando um elemento de estrutura atravs de
um ponteiro para a estrutura.

11.6 Comando typedef

A linguagem C permite que o programador defina novos nomes aos tipos de dados que esto sendo
criados. Para definir esses nomes utiliza-se o comando typedef. Vale salientar que o comando




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


54
typedef utilizado apenas para definir um novo nome para um tipo existente. A forma geral do
comando typedef :

typedef tipo nome;

sendo tipo qualquer tipo de dados permitido pela linguagem e nome o novo nome para esse tipo.
O novo nome a ser definido nada mais do que uma opo ao nome antigo e no uma substituio.
Como exemplo, podemos criar um novo nome para o tipo de dado int usando:

typedef int carro;

A instruo acima informa ao compilador que carro um outro nome para o tipo int. Dessa forma,
para declarar uma varivel do tipo inteiro podemos ter duas opes:

int y;
carro y;

11.7 Exerccios em Classe

1. Analise o programa em C abaixo:

#include <stdio.h>
struct teste {
int x, y;
};

void func ( struct teste *t );

int main( void )
{
struct teste p;

p.x = 10;
p.x = 20;

func( &p );
return( 0 );
}

void func( struct teste *t )
{
t x = t x * 2;
t y = t x - t y;
}

Aps a execuo do programa acima, quais so os valores armazenados respectivamente nas
variveis x e y?





Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


55
2. Escreva um programa em C que declare uma estrutura chamada ponto. Esta estrutura ser
composta por duas variveis x e y, que representam as coordenadas do ponto. Em seguida declare 2
pontos, leia as respectivas posies de cada um e calcule a distncia entre eles. A distncia entre
dois pontos dada pela seguinte expresso:
2 2
) 1 2 ( ) 1 2 ( y y x x d + = . Exiba a distncia entre
os pontos.

3. Escreva um programa em C para armazenar o nome e o salrio de 100 funcionrios de uma
empresa. O seu programa dever ter uma funo que retorne o valor do maior salrio pago pela
empresa.

4. Um nmero real um nmero que apresenta uma parte inteira e uma parte decimal. Por
exemplo: 1.567, 20.878 etc. Deseja-se criar uma representao computacional que simule um
nmero real.
a) Defina em C uma estrutura para representar um nmero real.
b) Escreva uma funo em C que receba como parmetro (passagem por referncia) um nmero
real conforme definido no item a e retorne apenas a parte inteira.

5. Para uma turma de 40 alunos, escreva um programa em C que permita armazenar o nome a
respectiva nota de cada um dos alunos na disciplina Algoritmos. Exiba a mdia geral da turma e
quantidade de alunos que ficaram com nota acima da mdia.

6. Em uma garagem existe um registro de todos os carros que esto venda. Sabe-se que a
garagem comporta no mximo 20 carros. Para cada carro tem-se registrado o modelo, a cor e o ano
de fabricao. Escreva apenas uma funo em C que retorne a quantidade de carros que foram
fabricados antes de 2000.

11.8 Exerccios Complementares

7. Com base no exerccio 2, escreva um programa em C que declare 3 pontos. Mostre qual a maior
distncia entre os pontos.

8. Em uma pizzaria, quando um cliente liga para fazer um pedido so anotados o nome do cliente,
e o sabor da pizza (mussarela, calabresa e marguerita). Suponha que em uma hora foram feitos 6
pedidos. Escreva um programa em C, que contenha uma funo que escreva a porcentagem de cada
sabor de pizza pedido.

9. Os nmeros complexos apareceram no sculo XVI ao longo das descobertas de procedimentos
gerais para resoluo de equaes algbricas de terceiro e quarto grau. No sculo XVII os
complexos so usados de maneira tmida para facilitar os clculos. No sculo XVIII so mais
usados na medida que se descobre que os complexos permitem a conexo de vrios resultados
dispersos da Matemtica no conjunto dos nmeros reais. No entanto, nada feito para esclarecer o
significado desses novos nmeros. No sculo XIX, aparece a representao geomtrica dos
nmeros complexos, motivada pela necessidade em Geometria, Topografia e Fsica, de se trabalhar
com o conceito de vetor no plano. Os nmeros complexos passam a ser aplicados em vrias reas
do conhecimento humano, dentro e fora da Matemtica.





Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


56
Um nmero complexo todo nmero que pode ser formado por duas partes: a parte real e a parte
imaginria. A representao geral de um nmero complexo :

bi a z + =

sendo a e b nmero reais. O nmero a a parte real e o nmero b a parte imaginria. Exemplos de
nmero complexos: 2+3i, 5+i. O smbolo i que indica que um nmero complexo tem valor 1 .

Com base nas informaes do texto, responda:
a) Defina em C uma estrutura que possa representar um nmero complexo.
b) Escreva uma funo em C que receba como parmetro (passagem por referncia) dois nmeros
complexos conforme definido no item a e verifique se so iguais. Por exemplo: y = a+bi e x
= c+di. Estes nmeros so iguais se a = c e b = d.

10. Escreva um programa em C que faa a manuteno da conta bancria de 10 possveis clientes
do banco Z. Dever ser apresentado o usurio o seguinte menu:






Cada uma das opes do menu dever ser codificada dentro de uma funo especifica.

Escolha uma opo:
1. Cadastro de clientes
2. Efeturar saque
3. Efeturar depsito
4. Imprimir clientes

Digite uma opo [ ]




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


57
Captulo 12

Manipulao de arquivos em C
12.1 Introduo

O armazenamento de dados em variveis e arrays temporrio, ou seja, os dados so perdidos
quando uma varivel local sai do escopo ou quando o programa termina. Portanto, os arquivos
so utilizados para reteno em longo prazo de grandes quantidades de dados, mesmo depois que o
programa termina. Estes dados so armazenados em dispositivos de armazenamento secundrio
como discos magnticos, discos pticos, etc.

12.2 Streams

Em C, o sistema de arquivos trabalha com vrios dispositivos diferentes. Dessa forma, o sistema de
arquivos deve conseguir trabalhar com esses dispositivos da mesma forma, embora esses
dispositivos sejam muito diferentes. Isso acontece porque o sistema de arquivo transforma-os em
um dispositivo lgico chamado streams. Estas streams so independentes do dispositivo.

Existem dois tipos de streams: texto e binria. Uma stream de texto nada mais do que uma
seqncia de caracteres. Por outro lado, uma stream binria uma seqncia de bytes. Em C
devemos associar uma stream com um arquivo especfico atravs da operao de abertura.

Cada stream associada a um arquivo tem uma estrutura de controle de arquivo do tipo FILE. Essa
estrutura definida no cabealho STDIO.H

As principais funes para manipular um arquivo esto relacionadas na tabela abaixo:

Nome Funo
fopen() Abre um arquivo
fclose() Fecha um arquivo
putc() Escreve um caractere em um arquivo
getc() L um caractere de um arquivo
fseek() Posiciona o ponteiro de arquivo em um byte especfico
feof() Devolve verdadeiro se o fim de arquivo for atingido
ferror() Devolve verdadeiro se ocorreu um erro
rewind() Repe o ponteiro de posio de arquivo no incio do arquivo
remove() Apaga um arquivo
fflush() Descarrega um arquivo

Para realizar as operaes bsicas em um arquivo (escrever e leia), seu programa precisa usar
ponteiros para arquivos.





Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


58
Um ponteiro de arquivo um ponteiro para as informaes sobre o arquivo tais como seu nome,
status e posio atual do arquivo. Um ponteiro de arquivo uma varivel do tipo FILE que
definido em STDIO.H. A declarao dessa varivel :

FILE *arq;

12.3 Abrindo um arquivo

A abertura de um arquivo realizada com a funo fopen(). Esta funo associa um arquivo a uma
stream. O retorno da funo fopen() um ponteiro do tipo FILE para o arquivo que est sendo
aberto. A funo fopen() necessita de dois parmetros: o primeiro um ponteiro para uma cadeia
de caracteres que representa o nome do arquivo e o segundo o modo como o arquivo ser aberto,
ou seja, apenas para leitura, apenas para escrita ou leitura e escrita ao mesmo tempo.

Os valores para o modo de leitura esto relacionados na tabela abaixo.

Modo Funo
r Abre um arquivo texto para leitura
w Cria um arquivo texto para escrita
a Anexa a um arquivo texto
rb Abre um arquivo binrio para leitura
wb Cria um arquivo binrio para escrita
ab Anexa a um arquivo binrio
r+ Abre um arquivo texto para leitura/escrita
w+ Cria um arquivo texto para leitura/escrita
a+ Anexa ou cria um arquivo texto para leitura/escrita
r+b Abre um arquivo binrio para leitura/escrita
w+b Cria um arquivo binrio para leitura/escrita
a+b Anexa um arquivo binrio para leitura/escrita

No momento da abertura de um arquivo, caso ocorra algum problema, a funo fopen() devolver
um ponteiro nulo. Portanto, devemos sempre testar o valor de retorno antes de utilizarmos o
ponteiro.

O trecho de cdigo abaixo mostra a abertura de um arquivo.

FILE *arq;
arq = fopen( teste, w );
if( arq == NULL )
{
printf(O arquivo no pde ser aberto);
exit(1);
}

Caso voc utilize a funo fopen() para abrir um arquivo no modo de escrita, e exista algum
arquivo com o mesmo nome este ser apagado e um novo arquivo ser criado, caso no exista, o
arquivo ser criado. Arquivos existentes s podem ser abertos no modo de leitura. Se porventura




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


59
voc quiser adicionar informaes ao final do arquivo, o mesmo deve ser aberto no modo anexar. O
modo de leitura/escrita no apagar um arquivo se ele j existir.

12.4 Fechando um arquivo

Para fechar um arquivo associado a uma stream usamos o comando fclose(). Se a operao for bem-
sucedida, a funo retornar o valor zero. Qualquer outro valor indica erro. A utilizao do
comando fclose() exemplificada abaixo.

fclose( arq );

12.5 Escrevendo e lendo caracteres em um arquivo

A operao para escrever caracteres em um arquivo pode ser realizada atravs de duas funes
equivalentes: putc() e fputc(). Ambas as funes so utilizadas para escrever caracteres em um
arquivo que foi previamente aberto no modo escrita. A sintaxe para a funo putc() :

int putc( int ch, FILE *arq );

sendo que ch o caractere que ser escrito no arquivo e arq o ponteiro de arquivo devolvido pela
funo fopen(). Por razes mais antigas, o caractere ch do tipo inteiro. Caso a operao for bem-
sucedida, a funo retornar o caractere escrito, caso contrrio retornar EOF (end of file).

O processo de leitura de caracteres de um arquivo tambm envolve duas funes: getc() e fgetc().
Ambas as funes lem caracteres de um arquivo previamente aberto no modo leitura. A sintaxe
para a funo getc() :

int getc( FILE *arq );

Se a operao for bem sucedida, a funo retornar um inteiro. Quando o final do arquivo for
atingido um EOF ser retornado.

O programa abaixo utiliza as funes apresentadas acima para abrir e escrever caracteres em um
arquivo.

#include <stdio.h>
#include <stdlib.h>

int main()
{
FILE *arq;
char ch;

arq = fopen( teste.txt, w );
if( arq == NULL )
{
printf(arquivo no pode ser aberto);
exit(1);
}





Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


60
do {
ch = getchar();
putc( ch, arq );
} while( ch != $ );
fclose( arq );

return( 0 );
}

Abaixo vamos abrir o arquivo criado no programa acima e leia os caracteres gravados.

#include <stdio.h>
#include <stdlib.h>

int main()
{
FILE *arq;
char ch;

arq = fopen( teste.txt, r );
if( arq == NULL )
{
printf(arquivo no pode ser aberto);
exit(1);
}

//l um caractere
ch = getc( arq );
while( ch != EOF )
{
putchar( ch );
ch = getchar( fp );
}

fclose( arq );

return( 0 );
}

12.6 Escrevendo e lendo strings em um arquivo

Da mesma forma que podemos escrever e leia apenas caracteres de um arquivo, C apresenta
funes para leitura e escrita de strings. As funes so: fputs() e fgets(). Ambas as funes operam
de forma semelhante s funes putc() e getc().

A funo fgets() l uma string at que um caractere de nova linha seja lido ou que o comprimento
de caracteres especificado para leitura tenham sido lidos. A string resultante ser terminada por um
nulo.

O programa abaixo mostra a utilizao das funes fputs() e fgets().

#include <stdio.h>




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


61
#include <stdlib.h>

int main()
{
char s[80];
FILE *arq;

arq = fopen( teste.txt, w );
if( arq == NULL )
{
printf(o arquivo no pode ser aberto );
exit(1);
}

do {
printf(Entre com uma string (enter para sair): \n);
gets( s );
strcat( s, \n );
fputs( s, arq );
} while( *s != \n);

return( 0 );
}

12.7 Funes fread() e fwrite()

Quando desejamos escrever ou leia tipos de dados que apresentam mais que um byte, as funes
fread() e fwrite() so utilizadas. Estas funes apresentam sintaxes diferentes das funes
apresentadas at agora.

size_t fread( void *buf, size_t num_bytes, size_t count, FILE *arq );

size_t fwrite( void *buf, size_t num_bytes, size_t count, FILE *arq );

Para fread(), buf um ponteiro para a regio de memria que contm os dados que sero lidos. Para
fwrite() um ponteiro para as informaes que sero escritas no arquivo; num_bytes o tamanho
da informao que ser lida ou escrita. O argumento count determina quantos itens sero copiados.
O tipo de dado size_t definido na biblioteca STDIO.H e aproximadamente o mesmo que
unsigned.

A funo fread() devolve o nmero de itens lidos e funo fwrite() o nmero de itens escritos.
Estas funes podem ser utilizadas tanto para arquivos do tipo texto quanto para arquivos do tipo
binrio.

O programa abaixo escreve um valor do tipo double e um do tipo inteiro em um arquivo e depois
faz a leitura dos dados.

#include <stdio.h>
#include <stdlib.h>

int main()




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


62
{
double d = 12.33;
long l = 1230456;
FILE *arq;

arq = fopen( num.txt, wb+ );
if( arq == NULL )
{
printf(o arquivo no pode ser aberto );
exit(1);
}

fwrite( &d, sizeof( double ), 1, arq );
fwrite( &l, sizeof( long ), 1, arq );
rewind( arq );
fread( &d, sizeof( double ), 1, arq );
fread( &l, sizeof( long ), 1, arq );
printf(Os valores so %f %ld, d, l );
fclose( arq );
return( 0 );
}

Uma das aplicaes que aparecem com freqncia na manipulao de arquivos envolve a leitura e a
escrita de valores definidos pelo usurio. Considere a seguinte declarao:

struct lista {
float salrio;
char nome[40];
} custo;

A instruo abaixo escreve o contedo de custo no arquivo apontado por arq.

fwrite( &custo, sizeof( lista ), 1, arq );


12.8 Exerccios

1. Escreva um programa em C que preencha uma matriz quadrada de ordem 4 com valores
aleatrios entre 0 e 100. Em seguida grave os dados em um arquivo do tipo texto.

2. Considere um registro contendo o nome o curso de 10 alunos. Escreva um programa em C que
permita entrar com os dados e armazen-los em um arquivo.





Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


63
Bibliografia


ARAKAKI R. e outros. Fundamentos de Programao C: Tcnicas e Aplicaes. Rio
de Janeiro, Livros Tcnicos e Cientficos Editora Ltda, 1989. Campinas, So Paulo,
2000.

Curso de C - http://ead1.eee.ufmg.br/cursos/C/c.html

DEITEL, H. M., DEITEL, P.J. C++ - Como Programar. 3 Edio, Editora Bookman,
Porto Alegre, RS.

FORBELLONE, A. L. V. & EBERSPCHER, H. F. Lgica de programao - a
construo de algoritmos e estruturas de dados. So Paulo, Makron Books, 2a Ed.,
2000.

http://www.icmc.sc.usp.br/ensino/material/ Apostila de Tpicos de Linguagens de
MANZANO, J. A. N. G. & OLIVEIRA, J. F. Algoritmos: lgica para
desenvolvimento de programao. So Paulo: rica, 8a Ed., 2000.

MANZANO, J. A. N. G. Estudo dirigido: Linguagem C. So Paulo: rica, 1997.

MIZRAHI, V. V. Treinamento em Linguagem C Curso Completo Mdulo 1. 1
Edio, Editora Makron Books, So Paulo, SP.

MIZRAHI, V. V. Treinamento em Linguagem C Curso Completo Mdulo 2. 1
Edio, Editora Makron Books, So Paulo, SP.

MORAES, P. S. Lgica de programao, Centro de Computao - DSC, Unicamp,
Programao. Instituto de Cincias Matemticas e de Computao USP, So
Carlos.

SALVETTI D.D. & BARBOSA L.M. Algoritmos. Makron Books, So Paulo, 1998.

SCHILDT, H. C Completo e Total. 3 Edio, Editora Makron Books, So Paulo, SP,
1997.

SCHILDT, H. Turbo C++. So Paulo, Makron Books, 1992.

SEBESTA R. W. Conceitos de linguagem de programao. Bookman Editora, 4
edio, Porto Alegre, 2000.




Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)


64

SMULLYAN, R. Alice no Pas dos Enigmas, Jorge Zahar Editor, Rio de Janeiro,
2000.

ZIVIANI, N. Projeto de Algoritmos com implementaes em Pascal e C. 2 Edio,
Editora Pioneira Informtica, So Paulo, SP, 1993.

You might also like