Você está na página 1de 283

INTRODUO COMPUTAO I

PROFESSORES:
TC QEM SOUSA FERNANDES ( RAMAL 7097 ) - TURMA A - jasousa@ime.eb.br Maj QEM MELLO (RAMAL 7091) - CG CAP QEM DUARTE (RAMAL 7094) - TURMA B CAP QEM WALLACE (RAMAL 7093) - TURMA C

1o PERODO DO ANO DE 2011

OBJETIVOS DA DISCIPLINA
IDENTIFICAR FATOS HISTRICOS QUE MARCARAM A EVOLUO DA COMPUTAO II. DESCREVER OS COMPONENTES BSICOS DA ARQUITETURA DOS COMPUTADORES III. IDENTIFICAR AS CARACTERSTICAS DOS ITENS FUNDAMENTAIS DE UMA LINGUAGEM DE PROGRAMAO DE ALTO NVEL ( C ) IV. USAR ESTRUTURAS SIMPLES DE DADOS E FUNES PARA MODULARIZAO DE PROGRAMAS (C ) V. ANALISAR PROBLEMAS E DESENVOLVER ALGORITMOS PARA A SUA SOLUO VI. APLICAR OS RECURSOS COMPUTACIONAIS EXISTENTES PARA A SOLUO DAS TAREFAS DAS DEMAIS DISCIPLINAS DO CURSO
I.

EMENTA DA DISCIPLINA
INTRODUO E ARQUITETURA DE COMPUTADORES II. ESTRUTURA DE UM PROGRAMA EM C III. VARIVEIS E OPERADORES IV. COMANDOS DE CONTROLE V. FUNES VI. VETORES, MATRIZES E STRINGS VII. NOES DE PONTEIROS E TIPOS DE DADOS DEFINIDOS PELO USURIO
I.

BIBLIOGRAFIA
LIVROS-TEXTO: TTULO: LINGUAGEM C AUTOR: LUS DAMAS EDITORA: LTC

LEITURA COMPLEMENTAR
TTULO: C COMPLETO E TOTAL AUTOR: HERBERT SCHILDT EDITORA: MAKRON BOOKS TTULO: FUNDAMENTOS DE PROGRAMAO AUTOR: LUIS JOYANES AGUILAR EDITORA: MCGRAWHILL

AVALIAO DA APRENDIZAGEM
TIPO DE PROVA MATRIA PROCESSO DE AVALIAO VE VC VF UD I A IV TODAS a ser definida ESCRITA ESCRITA DATA

XX/04/11 XX/06/11

MVe = ( VE #1 + VE #2 + ... + VE #n) / n NF = ( 2 x VF + VC + MVe ) / 4

FRASE DO DIA:
ACREDITO QUE EXISTA UM MERCADO MUNDIAL PARA TALVEZ CINCO COMPUTADORES

AUTOR: WATSON, T. PRESIDENTE DA IBM, 1943

FONTE:

LIVRO LINUX, DE CARDOSO, C.

UNIDADE I: INTRODUO E ARQUITETURA DE COMPUTADORES


ASSUNTOS
I II III CONCEITOS BSICOS DE CINCIA DA COMPUTAO HISTRICO DOS COMPUTADORES ARQUITETURA DE COMPUTADORES

IV V

ARMAZENAMENTO DE DADOS LINGUAGEM DE MQUINA x LINGUAGEM DE ALTO NVEL

CONCEITOS BSICOS DE CINCIA DA COMPUTAO

ARMAZENA INSTRUES E DADOS


ENTRADA DE DADOS => => SADA DE DADOS '' INFORMAO''

CONCEITOS BSICOS DE CINCIA DA COMPUTAO

HW SW

CONCEITOS BSICOS DE CINCIA DA COMPUTAO

HW SW

HARDWARE -> PARTE FSICA DO COMPUTADOR

CONCEITOS BSICOS DE CINCIA DA COMPUTAO

HW SW

HARDWARE -> PARTE FSICA DO COMPUTADOR SOFTWARE -> PROGRAMAS QUE RODAM NO COMPUTADOR

CONCEITOS BSICOS DE CINCIA DA COMPUTAO

HW SW

CONJUNTO DE INSTRUES QUE IMPLEMENTAM UM ALGORITMO HARDWARE -> PARTE FSICA DO COMPUTADOR SOFTWARE -> PROGRAMAS QUE RODAM NO COMPUTADOR

CONCEITOS BSICOS DE CINCIA DA COMPUTAO

ALGORITMO -> MTODO PARA RESOLVER UM PROBLEMA MEDIANTE UMA SRIE DE PASSOS PRECISOS, DEFINIDOS E FINITOS.
HARDWARE -> PARTE FSICA DO COMPUTADOR SOFTWARE -> PROGRAMAS QUE RODAM NO COMPUTADOR

CONCEITOS BSICOS DE CINCIA DA COMPUTAO ABSTRAO TCNICA EMPREGADA NO PROJETO DE ALGORITMOS QUE EXCLUI DETALHES INSIGNIFICANTES DO PROBLEMA

ALGORITMO -> MTODO PARA RESOLVER UM PROBLEMA MEDIANTE UMA SRIE DE PASSOS PRECISOS, DEFINIDOS E FINITOS.
HARDWARE -> PARTE FSICA DO COMPUTADOR SOFTWARE -> PROGRAMAS QUE RODAM NO COMPUTADOR

CONCEITOS BSICOS DE CINCIA DA COMPUTAO RESOLUO COMPUTACIONAL DE PROBLEMAS DE ENGENHARIA

- DEFINIO OU ANLISE DO PROBLEMA - PROJETO DO ALGORITMO - TRANSFORMAO DO ALGORITMO EM UM PROGRAMA - EXECUO E VALIDAO DO PROGRAMA

CONCEITOS BSICOS DE CINCIA DA COMPUTAO RESOLUO COMPUTACIONAL DE PROBLEMAS DE ENGENHARIA

- DEFINIO OU ANLISE DO PROBLEMA - PROJETO DO ALGORITMO - TRANSFORMAO DO ALGORITMO EM UM PROGRAMA - EXECUO E VALIDAO DO PROGRAMA - DIAGRAMA DE FLUXO - DIAGRAMA N-S - PSEUDOCDIGO

CONCEITOS BSICOS DE CINCIA DA COMPUTAO RESOLUO COMPUTACIONAL DE PROBLEMAS DE ENGENHARIA

- DEFINIO OU ANLISE DO PROBLEMA - PROJETO DO ALGORITMO - TRANSFORMAO DO ALGORITMO EM UM PROGRAMA - EXECUO E VALIDAO DO PROGRAMA TERMINADOR PROCESSO
ENTRADA / SADA

DECISO

- DIAGRAMA DE FLUXO - DIAGRAMA N-S - PSEUDOCDIGO

CONCEITOS BSICOS DE CINCIA DA COMPUTAO RESOLUO COMPUTACIONAL DE PROBLEMAS DE ENGENHARIA Exemplo 1: Calcular a velocidade ( metros/segundo ) dos corredores de uma corrida de 1500 metros. A entrada sero pares de nmeros ( minutos, segundos ) que daro o tempo de cada corredor. Para cada corredor, usaremos o tempo em minutos e segundos. O lao ser executado at que tenhamos uma entrada de 0,0 que ser a marca de fim de entrada de dados.

S um exemplo!
#include <stdio.h> main() { int tempo, corredor,distancia, minutos, segundos; float velocidade = 0; tempo = corredor = minutos = segundos = 1; distancia = 1500; while (minutos>0 || segundos>0) { //Obtem os dados printf("Forneca o tempo em minutos e segundos do \"corredor %d\".\n", corredor); scanf("%d%d",&minutos, &segundos); printf("O tempo fornecido foi %d minutos e %d segundos\n",minutos,segundos); //Realiza o calculo tempo = minutos * 60 + segundos; if (tempo > 0){ velocidade = (float)distancia / (float)tempo; printf("A velocidade do \"corredor %d\" e: %f metros/segundo\n", corredor, velocidade); corredor = corredor + 1; } } printf ("Algoritmo finalizado!"); }

II

HISTRICO DOS COMPUTADORES

1a GERAO
- Circuitos eletrnicos a vlvula ( 20000 vlvulas eletrnicas ). - Sem sistema operacional. - Pouca confiabilidade. - Altssimo consumo de energia. - Ciclo de instruo ( milisegundos )

HISTRICO DOS COMPUTADORES

MARK 1

II

CARACTERSITCAS: - 30 TONELADAS; HISTRICO DOS COMPUTADORES - 180 M2 DE REA; - SEM SISTEMA OPERACIONAL.

COMPUTADOR ENIAC: Electrical Numerical Integrator and Calculator

II

HISTRICO DOS COMPUTADORES

2a GERAO
- Circuitos eletrnicos transistorizados. - Linguagens Fortran, Cobol, Assembly. - Ciclo de instruo ( microsegundos )

IBM 1401

II

HISTRICO DOS COMPUTADORES

3a GERAO
- Circuitos integrados. - Redes de Computadores - Ciclo de instruo ( nanosegundos )

IBM 360

II

HISTRICO DOS COMPUTADORES

4a GERAO
- Circuitos com alto grau de integrao - Internet - Ciclo de instruo ( picosegundos )

Macintosh

II

ARQUITETURA DE COMPUTADORES

III

ARQUITETURA DE COMPUTADORES MACRO-COMPONENTES DO COMPUTADOR

CPU Unidade de Lgica e Aritmtica Unidade de Controle

PROCESSADOR

III

ARQUITETURA DE COMPUTADORES MACRO-COMPONENTES DO COMPUTADOR

MEMRIA PRINCIPAL

CPU Unidade de Lgica e Aritmtica Unidade de Controle

Memria
RAM

Memria
ROM

III

ARQUITETURA DE COMPUTADORES

MACRO-COMPONENTES DO COMPUTADOR
HD

CPU Unidade de Lgica e Aritmtica Unidade de Controle

IMPRESSORA

Memria
RAM

Memria
ROM

controla dores
de perifricos

MODEM UDIO DISCO FLEXVEL

TECLADO

II

ARQUITETURA DE COMPUTADORES

MACRO-COMPONENTES DO COMPUTADOR

CPU Unidade de Lgica e Aritmtica Unidade de Controle

Memria
RAM

Memria
ROM

controla dores
de perifricos

BARRAMENTO DE DADOS

MACRO-COMPONENTES DO COMPUTADOR BARRAMENTO DE CONTROLE

CPU Unidade de Lgica e Aritmtica Unidade de Controle

Memria
RAM

Memria
ROM

controla dores
de perifricos

BARRAMENTO DE DADOS

MACRO-COMPONENTES DO COMPUTADOR BARRAMENTO DE CONTROLE BARRAMENTO DE ENDEREOS

CPU Unidade de Lgica e Aritmtica Unidade de Controle

Memria
RAM

Memria
ROM

controla dores
de perifricos

BARRAMENTO DE DADOS

MACRO-COMPONENTES DO COMPUTADOR

Clock de um computador um pulso eletrnico gerado periodicamente por um oscilador, geralmente de cristal, usado para sincronizar o funcionamento dos diversos dispositivos e placas do sistema. Resumindo, a velocidade de funcionamento geral do sistema.

Geralmente medido em MHz (1 Hz = 1 ciclo/s, 1 KHz = 1 000 Hz, 1 MHz = 1 000 KHz = 1 000 000 Hz).

MACRO-COMPONENTES DO COMPUTADOR
ENDEREO DE 16 BITS

UNIDADES DE MEDIDA DE ARMAZENAMENTO


Byte: 8 bits kByte: 210 Bytes MByte: 220 Bytes GByte: 230 Bytes TByte: 240 Bytes

ENDEREOS
SINAL DE CONTROLE L OU ESCREVE

Memria
RAM
PALAVRA
CAPACIDADE DE ARMAZENAMENTO DE UMA POSIO DA MEMRIA

. . . 11010110 10000001 10101100 . . .

. 102 . 101 . 100 . 001 . 000

DADO

CONVERSES DE BASE

Converter da base 10 para a base x


1) Divida o nmero pela base, o resto o primeiro dgito, da *direita* para a *esquerda*. 2) O resultado da diviso anterior voc divide novamente e adiciona o dgito *esquerda* do dgito anterior. 3) Repita esse processo at a diviso for igual a zero (o dividendo menor que a base). Lembrete: na base 16, os dgitos vo de 0 a 15, sendo os dgitos de ordem 10 a 15 representados pelas letras A a F, respectivamente.

CONVERSES DE BASE

Converter da base 10 para a base x

CONVERSES DE BASE

Converter da base x para a base 10


1) Enumere os dgitos da *direita* para a *esquerda* comeando do zero, como em um array (observe que o ltimo dgito, que o primeiro da esquerda para a direita, ficar na "posio" n -1, onde n o nmero de dgitos) 2) Multiplique cada dgito pela base elevada ao ndice correspondente obtido no passo 1. 3) Some os resultados obtidos

CONVERSES DE BASE

Converter da base x para a base 10

IV

ARMAZENAMENTO DE DADOS

TECNOLOGIAS DE ARMAZENAMENTO DE DADOS - UTILIZAO DE MEIOS MAGNTICOS ( HD, DISQUETES ); - UTILIZAO DE MEIOS PTICOS ( Cds, DVDs ); - UTILIZAO DE MEIOS ELETRNICOS ( Memrias Flash: Pen Drives e cartes de memria ).

IV

ARMAZENAMENTO DE DADOS - Discos Rgidos ( HD );

IV

ARMAZENAMENTO DE DADOS - Discos Rgidos ( HD ) discos magnticos;

IV

ARMAZENAMENTO DE DADOS - Discos Rgidos ( HD ) discos magnticos;

IV

ARMAZENAMENTO DE DADOS - Discos Rgidos ( HD ) discos magnticos;

IV

ARMAZENAMENTO DE DADOS - Discos Rgidos ( HD ) discos magnticos;

IV

ARMAZENAMENTO DE DADOS - CDROM e DVD Discos pticos;

A superfcie da espiral varrida por um laser, que utiliza luz no comprimento infravermelho. Essa luz refletida pela superfcie do disco e captada por um detector. Esse detector envia ao controlador do aparelho a sequncia de pontos claros e escuros, que so convertidos em "1's ou 0's", os bits (dados binrios).

IV

ARMAZENAMENTO DE DADOS - Camadas fsicas de um CD-R;

Assim como o CD comum, o CD-R contm, em linhas gerais, quatro camadas de composies diferentes:
Camada Adesiva - a que contm o rtulo do disco. Camada Reflexiva - composta de um material reflexivo metlico, com ligas de ouro 24K ou prata. Camada de Gravao - a que contm os dados (informaes) do disco (faixas de udio, trilha de dados, etc). composta de cianino ou fitohalocianino, substncias metlicas predominantemente azuis com propriedades eletromagnticas. Camada Plstica - composta de policarbonato.

IV

ARMAZENAMENTO DE DADOS - Camadas fsicas de um CD-R;

IV

ARMAZENAMENTO DE DADOS

- Camada de Gravao
Cianino um composto metlico usado na fabricao de CDs gravveis (CD-R). Possui propriedades eletromagnticas para tornar possvel a gravao em equipamentos caseiros atravs da utilizao de unidades gravadoras de CD-R. Possui cor azulada. Os fabricantes no revelam sua composio. Fitohalocianino um material fotossensvel utilizado na fabricao de discos gravveis como CD-R, CD-RW, DVD-R ou DVD-RW. uma variao do Cianino.

IV

ARMAZENAMENTO DE DADOS - Memrias Flash: Pen Drives, Cartes de Memria.


TECNOLOGIA DE ESTADO SLIDO. NO H PARTES MECNICAS.

LINGUAGEM DE MQUINA X LINGUAGEM DE ALTO NVEL - LINGUAGEM DE MQUINA: Demanda o conhecimento da mquina ( conjunto de instrues e registradores ) por parte dos programadores. - LINGUAGEM DE ALTO NVEL: No requer o conhecimento da mquina. Oferece alto grau de abstrao para os programadores

LINGUAGEM DE MQUINA X LINGUAGEM DE ALTO NVEL - LINGUAGEM DE ALTO NVEL COMPILADORES X INTERPRETADORES

Unidade Didtica II
Estrutura de um Programa em C

Uma linguagem de programao um mtodo padronizado para expressar instrues para um computador.

composto por um conjunto de regras sintticas e semnticas que definem o programa a ser executado pelo computador.
Este conjunto de regras formam um conjunto de palavras (tokens) e constituem o cdigo fonte. Esse cdigo fonte depois traduzido para cdigo de mquina, que executado pelo processador.

Linguagens de programao so projetadas para adotar uma sintaxe de nvel mais alto a qual permite um fcil entendimento por programadores humanos.

Quanto gerao: Primeira gerao, as linguagens de baixo nvel (Assembly)

Segunda gerao, as primeiras linguagens (Fortran, ALGOL,...) Terceira gerao, as procedurais e estruturadas (Pascal, C). Quarta gerao, linguagens que geram programas em outras linguagens (Java, C++), linguagens de consulta (SQL).
Quinta gerao, linguagens lgicas (Prolog).

A linguagem C

Criada por Dennis Ritchie (1972) Bell Laboratories. Primeira utilizao importante: reescrita do SO UNIX (escrito em assembly).

Em 1980 j existiam vrias verses de compiladores C oferecidas por vrias empresas, no sendo mais restritas apenas ao ambiente UNIX (compatveis com outros SO).
O C uma linguagem de propsito geral, sendo adequada programao estruturada.

A linguagem C pertence a uma famlia de linguagens cujas caractersticas so:

Portabilidade Modularidade Compilao separada Recursos de baixo nvel Gerao de cdigo eficiente Confiabilidade Regularidade Simplicidade Facilidade de uso.

Viso geral de um programa C: A gerao do programa executvel a partir do programa fonte obedece a uma seqncia de operaes antes de tornar-se um executvel.

Depois de escrever o mdulo fonte em um editor de textos, o programador aciona o compilador (p. ex. gcc).
Essa ao desencadeia uma seqncia de etapas, cada qual traduzindo a codificao do usurio para uma forma de linguagem de nvel inferior, que termina com o executvel criado pelo lincador.

Editor (mdulo fonte em C)


Pr-processador (novo fonte expandido)

Compilador (arquivo objeto)


Lincador (executvel)

Sintaxe: So regras detalhadas para cada construo vlida na linguagem C.

Estas regras esto relacionadas com os tipos, as declaraes, as funes e as expresses.


Os tipos definem as propriedades dos dados manipulados em um programa.

As declaraes expressam as partes do programa, podendo dar significado a um identificador, alocar memria, definir contedo inicial, definir funes. As funes especificam as aes que um programa executa quando roda. So as entidades operacionais bsicas dos programas em C, que por sua vez so a unio de uma ou mais funes executando cada qual o seu trabalho. H funes bsicas que esto definidas na biblioteca C.

As funes printf() e scanf() por exemplo, permitem respectivamente escrever na tela e ler os dados a partir do teclado. O programador tambm pode definir novas funes em seus programas, como rotinas para clculos, impresso, etc. Todo programa C inicia sua execuo chamando a funo main(), sendo obrigatria a sua declarao no programa principal.

Comentrios no programa so colocados entre /* e */ no sendo considerados na compilao.

Cada instruo encerra com ; (ponto e vrgula) que faz parte do comando.

EXEMPLO:
#include <stdio.h> /* Pacotes c/ funes de entrada e sada */ #include <math.h> /* Este pacote desnecessrio, mas mostra podem ser adicionados outros pacotes */ int main(void) { printf("Ol, Mundo!\n"); return 0; /* Retorna 0, pois main retorna um int */ } /* Nova linha aps fechar a chave principal */

A estrutura de um programa em C: A estrutura genrica de um programa em C apresenta a seguinte forma, podendo alguns dos elementos no existir: * Comandos do pr-processador . * Definies de tipos . * Prottipos de funes - declarao dos tipos de retorno e dos tipos dos parmetros das funes . * Variveis globais . * Funes.

O pr-processador: O pr-processador C um programa que examina o programa fonte escrito em C e executa certas modificaes nele, baseado nas diretivas de compilao (ou diretivas do pr-processador).

As diretivas de compilao so comandos que no so compilados, sendo dirigidos ao prprocessador, executado pelo compilador antes da execuo do processo de compilao propriamente dito.

O pr-processador modifica o programa fonte, que ainda no estaria pronto para ser entregue ao compilador. Todas as diretivas de compilao so iniciadas pelo caractere #.

As diretivas podem ser colocadas em qualquer parte do programa, mas no podem ser colocadas na mesma linha que outra diretiva ou instruo.

As principais diretivas de compilao so: #include #define #undef #ifdef #ifndef #if #else #elif #endif

Bibliotecas em C: A biblioteca padro de C um conjunto de rotinas padronizadas da linguagem C que contm operaes comuns como por exemplo tratamentos de entrada/sada e cadeia de caracteres.
Padronizao: ANSI 1983 ANSI C.

stdio.h (extrato):
/* * stdio.h * This file has no copyright assigned and is placed in the Public Domain. * This file is a part of the mingw-runtime package. * No warranty is given; refer to the file DISCLAIMER within the package. * * Definitions of types and prototypes of functions for standard input and * output. * * NOTE: The file manipulation functions provided by Microsoft seem to * work with either slash (/) or backslash (\) as the directory separator. * */

stdio.h (extrato):
/* * The three standard file pointers provided by the run time library. * NOTE: These will go to the bit-bucket silently in GUI applications! */ #define STDIN_FILENO0 #define STDOUT_FILENO 1 #define STDERR_FILENO 2
/* Returned by various functions on end of file condition or error. */ #define EOF (-1) /* * The maximum number of files that may be open at once. I have set this to * a conservative number. The actual value may be higher. */ #define FOPEN_MAX (20)

stdio.h (extrato):
/* * Formatted Output */ _CRTIMP int __cdeclfprintf (FILE*, const char*, ...); _CRTIMP int __cdeclprintf (const char*, ...); _CRTIMP int __cdeclsprintf (char*, const char*, ...); _CRTIMP int __cdecl_snprintf (char*, size_t, const char*, ...); _CRTIMP int __cdeclvfprintf (FILE*, const char*, __VALIST); _CRTIMP int __cdeclvprintf (const char*, __VALIST); _CRTIMP int __cdeclvsprintf (char*, const char*, __VALIST); _CRTIMP int __cdecl_vsnprintf (char*, size_t, const char*, __VALIST);

stdio.h (extrato):
#ifndef __NO_ISOCEXT /* externs in libmingwex.a */ int __cdecl snprintf(char* s, size_t n, const char* format, ...); __CRT_INLINE int __cdecl vsnprintf (char* s, size_t n, const char* format, __VALIST arg) { return _vsnprintf ( s, n, format, arg); } int __cdecl vscanf (const char * __restrict__, __VALIST); int __cdecl vfscanf (FILE * __restrict__, const char * __restrict__, __VALIST); int __cdecl vsscanf (const char * __restrict__, const char * __restrict__, __VALIST); #endif

Cabealhos do ANSI C

Cabealhos do ANSI C
Macro para ajudar na deteco de erros lgicos e outros tipos de erros em verses de depurao de um programa. <complex.h> Conjunto de funes para manipular nmeros complexos. Funes usadas para classificar caracteres pelo tipo ou para converter entre caixa <ctype.h> alta e baixa independentemente da codificao. <errno.h> Teste de cdigos de erro reportados pelas funes de bibliotecas. <fenv.h> Controle de ponto flutuante. Constantes de propriedades especficas de implementao da biblioteca de ponto flutuante, como a menor diferena entre dois nmeros de ponto flutuante distintos <float.h> (_EPSILON), a quantidade mxima de dgitos de acurcia (_DIG) e a faixa de nmeros que pode ser representada (_MIN, _MAX). <inttypes.h> Converso precisa entre tipos inteiros. <iso646.h> Programao na codificao de caracteres ISO 646. <assert.h> <limits.h> <locale.h> <math.h> <setjmp.h> <signal.h> Constantes de propriedades especficas de implementao da biblioteca de tipos inteiros, como a faixa de nmeros que pode ser representada (_MIN, _MAX). Constantes para setlocale() e assuntos relacionados. Funes matemticas comuns em computao. Macros setjmp e longjmp, para sadas no locais. Tratamento de sinais.

Cabealhos do ANSI C

<stdarg.h> <stdbool.h> <stdint.h> <stddef.h> <stdio.h>


<stdlib.h>

Acesso dos argumentos passados para funes com parmetro varivel. Definio do tipo de dado booleano. Definio de tipos de dados inteiros. Diversos tipos e macros teis. Manipulao de entrada/sada.
Diversas operaes, incluindo converso, gerao de nmeros pseudo-aleatrios, alocao de memria, controle de processo, sinais, busca e ordenao.

<string.h> <tgmath.h> <time.h> <wchar.h> <wctype.h>

Tratamento de cadeia de caracteres. Funes matemticas. Converso de tipos de dado de data e horrio. Manipulao de caractere wide, usado para suportar diversas lnguas. Classificao de caracteres wide.

FUNES:

Conjunto de comandos agrupados em um bloco que recebe um nome e atravs deste pode ser ativado.

Porque usar funes ?


* Permitir o reaproveitamento de cdigo j construdo (por voc ou por outros programadores);

* Evitar que um trecho de cdigo que seja repetido vrias vezes dentro de um mesmo programa;

* Permitir a alterao de um trecho de cdigo de uma forma mais rpida (alterar apenas dentro da funo que se deseja);
* Diminuir o tamanho dos blocos do programa, facilitando seu entendimento;

* Facilita a leitura do programa-fonte;


* Separar o programa em partes(blocos) que possam ser logicamente compreendidos de forma isolada.

Formato Geral de uma Funo em C:


tipo_da_funcao NomeDaFuncao (Lista_de_Parametros) { /* corpo da funo */ }

OBS: A Lista_de_Parametros, tambm chamada de Lista_de_Argumentos, opcional.

#include <stdio.h> void EsperaEnter() // Definio da funo "EsperaEnter" { int tecla; printf("Pressione ENTER\n"); do { tecla = getch(); if (tecla !=13) // Se no for ENTER { puts(\a); // Emisso de um BEEP } } while(tecla != 13); // 13 o codigo ASCII do ENTER }

int main() { EsperaEnter(); // ........... EsperaEnter(); // ........... EsperaEnter(); return 0; }

// Chamada da funo definida antes // Chamada da funo definida antes

// Chamada da funo definida antes

PALAVRAS RESERVADAS: A linguagem C possui um total de 32 palavras conforme definido pelo padro ANSI, que so elas:
auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while

PALAVRAS RESERVADAS: importante lembrar que todas as palavras reservadas so escritas em minsculo e no podem ser utilizadas para outro propsito.

Alguns compiladores incluem outras palavras reservadas como, asm, cdecl, far, fortran, huge, interrupt, near, pascal, typeof.

Unidade Didtica III


Variveis e Operadores

Tipos Bsicos de Dados: char: Caracter: O valor armazenado um caractere. Caracateres geralmente so armazenados em cdigos (normalmente o cdigo ASCII).

int: Nmero inteiro o tipo padro e o tamanho do conjunto que pode ser representado normalmente depende da mquina em que o programa est rodando.

float: Nmero em ponto flutuante de preciso simples. So conhecidos normalmente como nmeros reais.

Tipos Bsicos de Dados:

double: Nmero em ponto flutuante de preciso dupla

void: Este tipo serve para indicar que um resultado no tem um tipo definido. Uma das aplicaes deste tipo em C criar um tipo vazio que pode posteriormente ser modificado para um dos tipos anteriores.

Modificadores dos Tipos Bsicos: Modificadores podem ser aplicados a estes tipos. Estes modificadores so palavras que alteram o tamanho do conjunto de valores que o tipo pode representar.
Por exemplo, um modificador permite que possam ser armazenados nmeros inteiros maiores. Um outro modificador obriga que s nmeros sem sinal possam ser armazenados pela varivel.

A Tabela a seguir mostra todos os tipos bsicos definidos no padro ANSI.

Constantes: Constantes so usadas em expresses para representar vrios tipos de valores. Em \C existem regras rgidas para determinar como devem ser escritos estes valores. Constantes Inteiras So valores numricos sem ponto decimal, precedidos ou no por um sinal. No possvel separar o sinal do valor numrico. Exemplo: 1997, -3, +5, 0 e -32000 Exemplos de erros: 1,234 (No possvel vrgula.) - 345 (No possvel separar sinal e o valor numrico.) 23 (No possvel usar notao de expoentes.)

Constantes Caracteres Uma constante caractere um nico caractere escrito entre ', como em 'a', podendo participar normalmente de expresses aritmticas. O valor que entra na expresso o do cdigo usado para representar o caractere.

Constantes Inteiras Longas So constantes armazenadas em um nmero maior de bits. Para diferenci-las de constantes inteiras comuns acrescentase um L ao final do nmero. Nos compiladores modernos o nmero de bytes usados para armazenar os valores inteiros o mesmo tanto para tipos inteiros ( int) quanto para tipos inteiros longos ( long int). Por esta razo esta diferena entre constantes inteiras perde a razo de ser. Exemplos de constantes inteira longas, so: 234L 320000L -120000L

Constantes em Ponto Flutuante So tambm conhecidos como constantes reais. Cada constante de ponto flutuante considerada ser do tipo double. Uma constante em ponto flutuante normalmente representada com ponto decimal, precedidas ou no de um sinal, podendo ser seguidas por um expoente. So exemplos de constantes em ponto flutuante. +23.45e-10 123.45 123.45E+10 123.45F

Constantes Hexadecimais So constantes representadas na base 16. Normalmente so representadas com um 0x ou 0X antecedendo o nmero. Exemplos: 0xF (15), 0x25 (37) e 0XAB (171). Constantes Octais So constantes representadas na base 8. Normalmente so representadas sempre sem sinal e devem iniciar com um algarismo 0. Exemplos: 025 (21), 077 (63) e 011 (9)

Variveis Para manipular dados dos mais diversos tipos, necessrio poder armazen-los na memria e poder referenci-los quando for preciso. por isso que existem as variveis, que nada mais so do que um espao reservado na memria, e que possuem um nome para facilitar a referncia, onde seu contedo pode ser alterado durante a execuo do programa.

As variveis podem ser de diversos tipos (int, char, float, double, etc).

Variveis Nomes das Variveis Existem algumas regras bsicas que regulam o batismo de variveis. Todo nome s pode conter letras e dgitos; O caractere "_" contado como uma letra; Todo primeiro caractere deve ser sempre uma letra; Letras maisculas e minsculas so consideradas caracteres diferentes.

Palavras reservadas no podem ser usadas como nome de variveis.

boa poltica escolher nomes que significam alguma coisa e indiquem a funo da varivel. Por exemplo: valor, soma, total, nome, raio.

Declarao de variveis: Para serem usadas, as variveis precisam ser declaradas de modo que o compilador possa reservar espao na memria para o valor a ser armazenado. A forma geral de uma declarao : tipo lista_de_variaveis ; IMPORTANTE: Todas as variveis em C devem ser declaradas antes de serem usadas.

Exemplos: int i; unsigned int a, b, c; unsigned short int dia, mes, ano; double salario;

Atribuio de valores s variveis Aps ser declarada, a varivel pode receber valores. O operador de atribuio "=" indica que o valor direita ser atribudo varivel. O valor inicial pode ser atribudo de duas formas:

Durante a declarao da varivel: int i=0, j=10; float raio=2.54; char c='d';

Durante execuo da funo: int funcao() { int i, j; float raio; char c; i = 0; j = 10; raio = 2.54; c = 'd'; ...

Ponto fixo Denotamos um nmero de ponto fixo quando especificamos o nmero de casas para a parte inteira e fracionria. Exemplo: Ponto fixo 1.15 (Um bit para a parte inteira e quinze para a parte fracionria). Neste caso sempre teremos nmeros menores que dois, pois como est reservado somente um bit para a parte inteira, o maior valor que esse bit pode valer 1. A parte fracionria comea do 2^-1 e vai at o 2^-15. Esses valores so interpretados literalmente. Exemplo: o binrio 1010 0000 0000 0000 corresponde a 2^0 + 2^-2 = 1.25.

Ponto flutuante (IEEE 754) Preciso simples Possui 32 bits

Uso dos bits: Sinal - Um bit que indica se o nmero positivo (0) ou se negativo (1). Expoente - Um byte que contem o expoente. O expoente corresponde a soma do expoente com 127 (ou seja, para encontrar o verdadeiro valor do expoente, deve-se subtrair esse byte de 127. Ateno: o expoente com valor zerado (00h) ou todo ativado (FFh) tem significado especial expoente.

Parte fracionria - Representa a parte fracionria do nmero.

E a parte inteira do nmero? Resposta: O ponto flutuante proposto pela IEEE 754 sugere que usemos nmeros em notao cientfica de modo que (em binrio): 101.11 x 2 ^ 15 = 1.0111 x 2 ^ 17
Ou seja: quando trabalhamos com notao cientfica, se temos um nmero que tenha mais de uma casa inteira, mechemos no expoente de modo que fique com uma. Assim ganhamos uma casa pro expoente.

PRTICA:

#include <stdio.h> #include <stdlib.h> #define PI 3.14159265;

EXEMPLO:

int main (void) { float raio; double area, comprimento; printf ("Digite o raio do seu circulo:\n cm\r"); scanf ("%f", &raio); area = (raio*raio)*PI; comprimento = raio*2*PI; system ("cls"); printf ("A area do seu circulo e: %.2f cm\n", area); printf ("O comprimento do seu circulo e: %.2f cm", comprimento); printf ("\n\n"); system ("pause"); }

Escopo e visibilidade
A visibilidade de um identificador determina as pores do programa no qual este identificador pode ser referenciado, ou seja, o seu escopo. Um identificador visvel somente dentro de seu escopo, que pode ser limitado para o arquivo, funo, bloco, ou prottipo de funo no qual ele aparece. Assim, o escopo de um identificador a parte do programa no qual o seu nome pode ser usado.

#include <stdio.h>

EXEMPLO:

int i = 1; // definido num nvel externo int main (void) { printf(%d\n, i); { int i = 2, j = 3; printf(%d %d\n, i, j); // imprime 2 e 3 { int i = 0; printf(%d %d\n, i, j); // imprime 0 e 3 } printf(%d\n, i); // imprime 2 } printf (%d\n, i); // imprime 1 return 0; }

Modificadores de Tipo de Acesso


Controlam a forma como as variveis podem ser modificadas ou acessadas: const volatile
Obs: Na declarao, esses modificadores devem preceder o tipo das variveis. const: faz com que a varivel possa apenas receber um valor inicial, no podendo ser alterada durante a execuo do programa. Exemplo:

const int a= 10;

Modificadores de Tipo de Acesso


volatile: usado quando uma varivel precisa ser alterada de forma no explcita no cdigo do programa. Por exemplo, uma varivel que armazena o tempo real do sistema, sendo alterada pela rotina de relgio do sistema operacional, e no por um comando de atribuio, precisa ser declarada como volatile. Exemplo da declarao: volatile char *address=0x3b;

Especificadores de Classe de Armazenamento


Alm dos modificadores vistos acima, que informam ao compilador a forma de acessar ou alterar uma varivel, existe tambm os especificadores de classe de armazenamento, que informam ao compilador a forma como a varivel deve ser armazenada. H quatro especificadores em C:

extern static register auto

Especificadores de Classe de Armazenamento


O especificador extern diz ao compilador que a varivel indicada foi declarada em outro arquivo que no podemos incluir diretamente, por exemplo o cdigo de uma biblioteca padro. Isso importante pois, se no colocarmos o modificador extern, o compilador ir declarar uma nova varivel com o nome especificado, "ocultando" a varivel que realmente desejamos usar. usado para variveis globais no estticas. extern float sum; extern int count; float returnSum (void) { count++; return sum; }

Especificadores de Classe de Armazenamento


As variveis declaradas como static dependem se so globais ou locais: Variveis globais static funcionam como variveis globais dentro de um mdulo, ou seja, so variveis globais que no so (e nem podem ser) conhecidas em outros mdulos (arquivos). Isto til se quisermos isolar pedaos de um programa para evitar mudanas acidentais em variveis globais. Variveis locais estticas so variveis cujo valor mantido de uma chamada da funo para a outra.

int count (void) { static int num = 0; num++; return num; }

Especificadores de Classe de Armazenamento


O especificador register informa ao compilador que a varivel deve ser armazenada em um registrador da CPU, e no na memria. Isto aumenta consideravelmente a velocidade de acesso.

Inicialmente, somente as variveis int e char poderiam ser register. O padro ANSI ento determinou que qualquer tipo pode utilizar o especificador register. Como alguns tipos de dados no cabem em um registrador, o compilador trata variveis register de forma que o acesso seja o mais rpido possvel. (Somente variveis locais podem ser register). O uso do especificador auto redundante. Todas as variveis que no possuem um especificador so auto por default.

Operadores:

Regras de Precedncia
Na tabela abaixo resume-se a precedncia dos operadores da linguagem C, assim como sua associatividade. Operadores em uma mesma linha tm a mesma precedncia, e as linhas esto ordenadas em ordem decrescente de precedncia.
Operador ( ) [ ] -> . ! ~ ++ -- - (type) * & sizeof */% +<< >> < <= > >= == != & ^ | && || ?: = += -= etc. Associatividade esq-dir dir-esq esq-dir esq-dir esq-dir esq-dir esq-dir esq-dir esq-dir esq-dir esq-dir esq-dir dir-esq dir-esq esq-dir

Operador sizeof()
O operador sizeof() um operador unrio que retorna o tamanho em bytes da expresso ou tipo fornecido como parmetro.
Por exemplo, suponha que o tipo float tenha quatro bytes ento a funo sizeof(float) retorna o valor quatro. Para se calcular o tamanho de bytes de uma expresso no necessrio o uso de parnteses.

Exemplo
#define DIM 10 #include ...
int main() { int i=0; float f=3.0; char c='a'; int v[DIM]; printf("Tamanho em bytes de alguns tipos\n"); printf("Tamanho de int %d\n", sizeof i); printf("Tamanho do float %d\n", sizeof f); printf("Tamanho do double %d\n", sizeof (double)); printf("Tamanho do char %d\n", sizeof c); printf("Tamanho do vetor de %d inteiros e %d\n", DIM, sizeof v);

Converso de Tipos
Quando operandos de tipos diferentes aparecem em expresses eles so convertidos para um tipo comum, que permita o clculo da expresso da forma mais eficientes. Por exemplo, uma operao que envolva um tipo inteiro e um float, o valor inteiro convertido para float.

As converses ocorrem somente quando necessrio. Assim, em uma diviso de inteiros o resultado do tipo inteiro.
Ex.: A expresso 1/4*4 tem como resultado o valor inteiro 0. J que a primeira expresso executada 1/4 tem como resultado 0.

Converso de Tipos
Operandos do tipo char e int podem ser livremente misturados em expresses aritmticas. Os tipos char so convertidos para int (conjunto de caracteres na tabela ASCII).

Exemplo: A converso de uma letra maiscula para minscula pode ser facilmente implementada com o comando:
c = c - 'A' + 'a'; // A letra armazenada na varivel c subtrada do cdigo da letra maiscula 'A', fornecendo a posio desta letra no alfabeto. Em seguida este valor somado ao cdigo da letra minscula 'a' resultando da converso para minscula. As converses aritmticas ocorrem de maneira quase que natural.

Correspondncia entre: Decimal, Hexadecimal, Octal e Caractere

Converso de Tipos
Em operaes binrias as seguintes converses ocorrem quando diferentes tipos esto envolvidos: char convertido para int float convertido para double Ento se algum dos operandos double o outro convertido para double e o resultado double. Isto vale para os demais tipos. Assim, o resultado de uma expresso ao ser avaliado convertido para o tipo da varivel onde o resultado ser armazenado. Um resultado float ao ser carregado em uma varivel do tipo int causa o truncamento da parte fracionria porventura existente.

EXEMPLO:

Unidade Didtica IV
Comandos de Controle

Precedncia de operadores: Quando mais de um operador se encontram em uma expresso aritmtica as operaes so efetuadas uma de cada vez respeitando algumas regras de precedncia (mesmas da matemtica elementar).
Exemplo:

Expresso 1 + 2 - 3 24 - 3 * 5 4 - 2 * 6 / 4 + 1 6 / 2 + 11 % 3 * 4

Valor 0 9 2 11

Ordem + * * / - + /%*+

Precedncia de operadores: A ordem de precedncia dos operadores pode ser quebrada usando-se parnteses: ( ) - Mais alta precedncia.
Parnteses internos so executados primeiro que parnteses externos. Exemplo: Expresso Valor Ordem 1 + (2 - 3) 0 - + (24 - 3) * 5 105 - * (4 - 2 * 6) / 4 + 1 -1 *-/+ 6 / ((2 + 11) % 3) * 4 24 +%/*

Regras de Precedncia

Operadores de endereo: & (endereo do operando) * (valor no endereo do operando)

So usados basicamente com ponteiros.

Operadores de Atribuio Aritmtica: Muitas vezes queremos alterar o valor de uma varivel realizando alguma operao aritmtica com ela. Exemplo: i = i + 1 ou val = val * 2. Foram desenvolvidas na linguagem C instrues otimizadas com o uso de operadores ditos operadores de atribuio aritmtica (+=, -=, *=, /= , %=). As instrues acima podem ser: i += 1 e val *= 2
Sintaxe: var (+=, -=, *=, /= , %=) exp; onde var o identificador da varivel e exp uma expresso vlida.

Operadores de Atribuio Aritmtica: Mais exemplos: Atribuio aritmtica i += 1; j -= val; num *= 1 + k; troco /= 10; resto %= 2; Instruo equivalente i = i + 1; j = j - val; num = num * (1 + k); troco = troco / 10; resto = resto % 2;

O operador de atribuio aritmtica tem precedncia menor que os outros operadores at aqui discutidos.

Operadores Relacionais: Os operadores relacionais permitem a comparao de valores. So os seguintes:

< "menor que <= "menor ou igual a == "igual a != "diferente de >= "maior ou igual a > "maior que

Os operadores relacionais tm todos a mesma precedncia ( menor que a precedncia dos operadores aritmticos).

O resultado de uma comparao ser um valor igual a zero se a condio testada resultar em falso ou um valor diferente de zero se a condio testada resultar em verdadeiro.
Mais exemplos if(a != b) a = a-b; else b = b - a; if(a != b) a -= b; else b -= a; if(x == 10) y = 1; else if (x == 11) y = 2; else y = 0;

Exemplo: No trecho de programa abaixo a operao j++ ser executada, pois a expresso lgica verdadeira:

int i = 5, j =7; if ( (i > 3) && ( j <= 7) && ( i != j) ) j++; V AND V AND V = V

Atribuio mltipla: E possvel atribuir um valor a muitas variveis em uma nica instruo (atribuio mltipla).
Sintaxe: var_1 = [var_2 = ... ] expresso;

onde var_1, var_2, ... so os identificadores de variveis e expresso uma expresso vlida.

Observe que na atribuio mltipla as operaes ocorrem da direita para a esquerda, isto , inicialmente o valor de expresso atribudo a var_2 e depois o valor de var_2 atribudo a var_1.

Atribuio mltipla: Deve-se tomar cuidado com as converses de tipo e limites de intervalo para atribuies de tipos diferentes.
Exemplo: int i, j, k; double max, min;

i = j = k = 1; max = min = 0.0;


max = i = 3.56;

Blocos de Comando: Blocos de comando so grupos de comandos que devem ser tratados como uma unidade lgica.
O incio de um bloco em C marcado por uma chave de abertura ({) e o trmino por uma chave de fechamento (}).

O bloco de comandos serve para agrupar comandos que devem ser executados juntos.
Por exemplo, usa-se bloco de comandos quando em comandos de teste deve-se escolher entre executar dois blocos de comandos.

Blocos de Comando: Um bloco de comandos pode ser utilizado em qualquer trecho de programa onde se pode usar um comando C.
Um bloco de comandos pode ter zero comandos C. Um bloco de comandos com 0 ou 1 comando pode dispensar as chaves. Exemplo de bloco de comandos { i = 0; j = j + 1; printf("%d %d\n", i, j); }

Estruturas de controle: A linguagem C permite uma ampla variedade de estruturas de controle de fluxo de processamento.

Duas estruturas das estruturas bsicas (deciso e repetio) so muito semelhantes as estruturas usadas nas Pseudolinguagem algortmicas: Estrutura de Deciso: Permite direcionar o fluxo lgico para dois blocos distintos de instrues conforme uma condio de controle.

Estruturas de controle:

Pseudo-linguagem se condio ento bloco 1 seno bloco 2 fim se

Linguagem C if(condio) { bloco 1; } else { bloco 2; };

Estruturas de controle:

Estrutura de Repetio: Permite executar repetidamente um bloco de instrues ate que uma condio de controle seja satisfeita. Pseudo-linguagem
faa bloco at condio

Linguagem C do { bloco; }while(condio);

Controle de Fluxo: Os comandos de controle de fluxo podem ser divididos em trs grupos: Instrues condicionais, estrutura de repetio e os desvios incondicionais. Instrues (desvios) Condicionais As instrues condicionais existentes no padro ANSI so: if, switch e o operador ternrio (?).

Instruo if Esta instruo obedece sintaxe: if (condio) instruo(es) para condio verdadeira ; else instruo(es) para condio falsa;
Pode-se utilizar uma ou mais instrues nas condies verdadeiras e falsas do if (mais de uma, colocar entre chaves).

Se condio verdadeira: executadas apenas as instrues localizadas aps a instruo if. Caso contrario somente as instrues aps o else sero executadas. O else opcional.

#include<stdio.h> void main() { int num1,num2,soma;


printf("Digite o primeiro valor inteiro a ser somado:"); scanf("%d",&num1); printf("Digite o segundo valor inteiro a ser somado:"); scanf("%d",&num2); soma=num1+num2; printf("Soma: %d ",soma); if((soma%2)==0) printf(" - numero par\n"); }

if((soma%2)==0) printf(" - numero par\n"); else printf(" - numero impar\n");

A linguagem C padro tambm permite o uso de ifs aninhados, obedecendo forma:


if(condio) Instruo; else if(condio) Instruo; else if(condio) Instruo; . . else Instruo;

#include<stdio.h> void main() { float nota; printf("Digite o valor da nota(numero):"); scanf("%f",&nota); if((nota>=8)&&(nota<=9)) printf("Nota correspondente a A!!!\n"); else if((nota>=6)&&(nota<=7)) printf("Nota correspondente a B!!!\n"); else if((nota>=4)&&(nota<=5)) printf("Nota correspondente a C!!!\n"); else if((nota>=2)&&(nota<=3)) printf("Nota correspondente a D!!!\n"); else if((nota>=0)&&(nota<=1)) printf("Nota correspondente a E!!!\n"); else printf("Nota invalida!!!\n");

Switch Sua sintaxe : switch(expresso) { case constante1: seqncia de comandos break; case constante2: seqncia de comandos break; . . default: seqncia de comandos }

Esta instruo compara a expresso com todas as constantes.

Caso seja verdadeira ela executa as seqncias de comandos daquela constante.


Caso todas as alternativas sejam falsas o comando default executado.

A instruo break demonstrada acima opcional, ela que para a execuo do switch case.
O comando switch compara apenas igualdades, enquanto que o if comparar qualquer expresso lgica ou relacional.

#include<stdio.h> void main() { int entrada; printf("Digite 1 para calcular a soma de dois numeros\n Digite 2 para calcular a media\n"); scanf("%d",&entrada); switch(entrada) { case 1: printf("Vc escolheu somar dois numeros"); break; case 2: printf("Vc escolheu calcular a media"); break; default: printf("Nenhuma das opcoes foi selecionada"); } }

Estrutura de repetio: As estruturas de repetio so utilizadas para que um conjunto de instrues seja executado at que ocorra uma certa condio (condio de parada). O lao for diferencia dos restantes (while e do-while) por ter condies pr-definidas, ou seja, o nmero de vezes a ser executada j conhecido.

Lao for (sintaxe usual) Sintaxe do lao: for(inicializao ; condio ; incremento) comando(s);

Normalmente na inicializao atribudo um valor inicial para varivel que controla o lao. A condio determina quando o lao deve ser encerrado. Incremento indica o quanto a varivel controladora incrementada ao final do bloco.

#include<stdio.h void main() { int n;

for(n=1; n<=10; n++) printf("n=%d\n",n); }

Mais um exemplo. O programa abaixo, imprime na tela somente os nmeros pares entre 1 e 100, apesar da variao de i ocorrer de 1 em 1: #include <stdio.h> int main() { int i;

for(i=1; i<=100; i++) if(!(i%2)) printf("%d ",i); /* o operador de resto dar falso (zero) para os pares*/
}

Lao While Sua forma geral : while (condio) Instruo; Este lao executa a instruo at que a condio se torne falsa (qualquer valor diferente de zero verdadeira a condio).

#include <stdio.h> /* clculo do mximo divisor comum de dois numeros*/

main() { int A, B, a, b; scanf("%d %d", &A, &B); a = A; b = B; while(a!=b) if(a > b) a -= b; else b -= a; printf("O mdc entre %d e %d : %d\n",A,B,a);
}

#include<stdio.h> void main() { int n1,n2,soma,resposta; resposta=1; while(resposta==1) { printf("Digite valor de n1(inteiro):\n"); scanf("%d",&n1); printf("Digite valor de n2(inteiro):\n"); scanf("%d",&n2); soma=n1+n2; printf("Soma:%d\n",soma); printf("Deseja continuar? (1 - sim / 2 - nao)\n"); scanf("%d",&resposta); while((resposta!=1) && (resposta!=2)) { printf("Digite 1 para sim ou 2 para nao !!\n"); scanf("%d",&resposta); }/*fim_while*/ }/*fim_while*/ }

Lao do-while A grande diferena entre o lao do-while e os vistos anteriormente que ele analisa a condio no final do lao.

Dessa forma todas as instrues localizadas dentro do dowhile ser executada pelo menos uma vez.
O lao termina quando a condio se torna falsa. Sintaxe:

do { Instruo; }while(condio);

#include<stdio.h> void main() { int n1,n2,soma,resposta; do { printf("Digite valor de n1(inteiro):\n"); scanf("%d",&n1); printf("Digite valor de n2(inteiro):\n"); scanf("%d",&n2); soma=n1+n2; printf("Soma:%d\n",soma); printf("Deseja continuar? (1 - sim / 2 - nao)\n"); scanf("%d",&resposta); if((resposta!=1)&& (resposta!=2)) printf("Programa finalizado, este numero nao existe no menu \n"); }while(resposta==1); }

Desvio incondicional : A linguagem C tem como desvio incondicional o comando goto.

Comando goto Esta instruo ou comando muito pouco utilizado, pois tornam os cdigos difceis de se compreender.
O exemplo abaixo faz o mesmo que o exemplo do lao for (mostrado anteriormente). O programa que utiliza o for muito mais fcil de se entender.

#include<stdio.h> void main() { int n; n=1; loop1: /*rtulo*/ printf("n=%d\n",n); n++; if(n<=10) goto loop1; /* se n <= 10 volta para o rtulo acima, executando as instrues outra vez at que a condio do if seja falsa*/ }

Comando break: O comando break pode ser tanto usado para terminar um teste case dentro de um comando switch quanto interromper a execuo de um lao. Quando este comando utilizado dentro de um comando for o lao imediatamente interrompido e o programa continua a execuo no comando seguinte ao comando for. Exemplo: No trecho de programa abaixo o comando for deve ler 100 nmeros inteiros positivos. No entanto, se for digitado um nmero negativo o comando for interrompido imediatamente sem que o nmero seja impresso.

Comando break:

for (i = 0; i < 100; i++) { scanf("%d", &num ); if (num < 0) break; printf("%d\n", num ); }

Comando continue: O comando continue parecido com o comando break. A diferena que o comando continue simplesmente interrompe a execuo da iterao corrente passando para a prxima iterao do lao, se houver uma.

No trecho de programa abaixo o lao l 100 nmeros inteiros, caso o nmero seja negativo, o nmero no ser impresso. for (i = 0; i < 100; i++) { scanf("%d", &num ); if (num < 0) continue ; printf ("%d\n", num ); }

LISTA DE EXERCCIOS:

1) Diga a ordem de clculo e o resultado das expresses abaixo: a) x = 5 * 4 / 6 + 7; b) x = 5 * 4.0 / 6 + 7; c) x = 5 * 4 % 6 + 7; d) x = ((4 / 2) + (3.0 * 5));

2) Escreva um programa que imprima a tabela verdade da funo ou exclusivo.


3) Escreva um programa que calcule o produto entre um valor x e 2n, onde n e x so inteiros. Utilize operadores binrios.

4) Escreva um programa que leia um ngulo em segundos e imprima quantos graus, minutos e segundos h neste ngulo. 5) Escreva um programa que leia um tempo em segundos e imprima quantas horas, minutos e segundos h neste tempo. 6) Escreva um programa que leia um comprimento em centmetros e imprima quantos metros, decmetros e centmetros h neste comprimento.

Unidade Didtica V
Funes

Definio Em C todas as aes ocorrem dentro de funes.


As funes so blocos de instrues que facilitam o entendimento do cdigo. Sua sintaxe :

Tipo_funo nome_da_funo (tipo var1, ...,tipo varN) { corpo da funo }

Tipo da funo: pode ser qualquer um dos tipos vistos. Representa o tipo do dado que retornado pela funo ao seu trmino. Caso a funo no retorne nenhum valor dizemos que ela do tipo void. Parmetros: ficam localizado entre parnteses aps o nome da funo. constitudo pelos nomes das variveis que se deseja passar para funo separados por virgulas e acompanhados de seus respectivos tipos. No caso da funo no conter parmetros a lista de parmetros ser vazia, mas mesmo assim ser necessrio utilizar os parnteses.

Corpo da funo: vem o cdigo em C, este cdigo privativo da funo, ou seja, nenhuma outra funo poder acess-la com nenhum comando, exceto por meio de uma chamada a funo.
Objetivo das funes: Permitir o reaproveitamento de cdigo; Evitar repetio de um trecho de cdigo; Permitir a alterao de um trecho de cdigo de uma forma mais rpida; Diminuir o tamanho dos blocos do programa, facilitando o entendimento; Facilitar a leitura do programa-fonte; Separar o programa em partes(blocos) que possam ser logicamente compreendidos de forma isolada.

Parmetros Os parmetros possibilitam definir quais dados do programa a funo utilizar.


Os parmetros de uma funo so definidos entre os parnteses do cabealho da funo, como se estivesse definindo as variveis de um programa.

importante notar que os tipos e o nmero de parmetros que aparecem na declarao da funo e na sua chamada devem estar na mesma ordem e ter tipos equivalentes. Se os tipos forem incompatveis, o compilador no gera um erro, mas podem ser gerados avisos na compilao alm de poderem aparecer resultados estranhos.

#include <stdio.h> void SOMA(float a, int b) // separar parmetros por vrgulas { float result; // a declarao de variveis igual ao main result = a+b; printf("A soma de %d com %6.3f %6.3f\n, b, a, result); } int main() { int a; float b; a = 10; b = 12.3; SOMA(b, a); // Chamada da funo SOMA(12.3, 10) return 0; } O programa imprimir a seguinte mensagem: A soma de 10 com 12.300 eh 22.300

H duas maneiras bsicas de terminar a execuo de uma funo:


1) Comando return: para retornar o resultado da funo. Quando o comando return expresso; for executado, o valor da expresso devolvido para a funo que chamou.

2) Quando no h valor para retornar: o comando return no precisa ser usado e a funo termina quando a chave que indica o trmino do corpo da funo atingido.

Exemplo: Supondo que seja necessrio imprimir a mensagem "Pressione a tecla c para continuar e caso esta tecla no seja pressionada o programa deve informar Tecla errada pressionada .

#include <stdio.h>

void EsperaTecla() // Definio da funo "EsperaTecla" { char tecla; printf("Pressione a tecla c para continuar \n"); do { tecla = getch(); if (tecla != 'c') // Se nao for "C" { printf("Tecla errada pressionada .... \n"); } } while(tecla != 'c'); printf("Agora sim .... \n");
}

int main() { EsperaTecla(); // Chamada da funo definida antes // ........... EsperaTecla(); // Chamada da funo definida antes // ........... EsperaTecla(); // Chamada da funo definida antes return 0; }

Localizao das Funes dentro do Cdigo Fonte Pode ser adotada a seguinte regra: toda funo deve ser declarada antes de ser usada.

Alguns programadores preferem que o cdigo fonte seja iniciado com a funo main. Para que isto possa ocorrer, a linguagem C permite que se declare uma funo, antes de defini-la.
Esta declarao feita atravs do prottipo da funo. O prottipo da funo nada mais do que o trecho de cdigo que especifica o nome e os parmetros da funo.

Atravs do prottipo o compilador pode verificar se existem erros nos tipos de dados entre os argumentos usados para chamar uma funo e a definio de seus parmetros. A sintaxe para definir o prottipo de uma funo dada por:

tipo Nome_Da_Funo(tipo par1, tipo par2,..., tipo parN);

#include <stdio.h> void SOMA(float a, int b); // Prottipo da funo SOMA

int main() { SOMA(16.7,15); // Chamada SOMA antes da definio } void SOMA(float a, int b) // Definio da funo SOMA { float result; // a declarao de variveis como no main result = a+b; printf("A soma de %d com %6.3f eh %6.3f\n, b, a, result); }

Escopo de Variveis O escopo de uma varivel corresponde ao bloco de cdigo onde esta varivel vlida. Assim: As variveis valem no bloco que so definidas e recebem o nome de variveis locais;
Os parmetros de uma funo valem tambm somente dentro da funo;

Uma varivel definida dentro de uma funo no acessvel em outras funes, MESMO QUE ESTAS VARIVEIS TENHAM NOMES IDNTICOS.

#include <stdio.h> #include <conio.h>


void FUNC1() { int B; B = -100; printf("Valor de B dentro da funo FUNC1: %d\n", B); } void FUNC2() { int B; B = -200; printf("Valor de B dentro da funo FUNC2: %d\n", B); }

int main() { int B; B = 10; printf("Valor de B: %d\n", B); B = 20; FUNC1(); printf("Valor de B: %d\n", B); B = 30; FUNC2(); printf("Valor de B: %d\n", B); return 0; }

SADA: Valor de B: 10 Valor de B dentro da funo FUNC1: -100 Valor de B: 20 Valor de B dentro da funo FUNC2: -200 Valor de B: 30

Exemplo (clculo de fatorial de um nmero qualquer):

O comando return usado no final da funo o responsvel por retornar um valor para a instruo que o chamou, neste caso para a varivel Fatorial. Que por sua vez imprime o resultado a tela. Qualquer expresso pode aparecer no comando, que tem a a seguinte forma geral: return expresso

A funo que chamou pode ignorar o valor retornado.

Parmetros Formais As variveis que aparecem na lista de parmetros da funo so chamadas de parmetros formais da funo. Eles so criados no incio da execuo da funo e destrudos no final.

Parmetros so valores que as funes recebem da funo que a chamou => parmetros permitem que uma funo passe valores para outra. As variveis que atuam como parmetros so iguais a todas as outras e podem ser modificadas, operadas, etc, sem nenhuma restrio.

Passagem de Parmetros Parmetros podem ser passados para funes de duas maneiras: passagem por valor ou passagem por referncia.

Passagem de Parmetros por Valor Na passagem por valor uma cpia do valor do argumento passado para a funo. Neste caso a funo que recebe este valor ao fazer modificaes no parmetro no estar alterando o valor original que somente existe na funo que chamou.

Passagem de Parmetros por Referncia Na passagem por referncia o que passado para a funo o endereo do parmetro e portanto a funo que recebe pode atravs do endereo modificar o valor do argumento na funo que chamou. Para a passagem de parmetros por referncia necessrio o uso de ponteiros.

Recurso Funes em C podem ser usadas recursivamente, isto uma funo pode chamar a si mesma. Um exemplo simples (tpico) de funo que pode ser usada com chamadas recursivas o clculo do fatorial de um nmero inteiro. O fatorial de um nmero pode ser defindo como o produto deste nmero pelo fatorial de seu predecessor, ou seja n! = n * (n-1)! A alternativa uma funo recursiva em que cada chamada da funo que calcula o fatorial chama a prpria funo fatorial.

#include <stdio.h> int fat (int num) { int fato;

if (num == 1) return (1); else fato = num * fat (num-1); return fato;
}

void main() {
int numero;

printf("\nEntre com um numero positivo."); scanf("%d", &numero); printf("O fatorial de %d vale %d.", fat(numero)); system(pause); }

numero,

Um ponto importante que toda funo recursiva deve prever cuidadosamente como o processo de recurso deve ser interrompido. No caso da funo fat o processo interrompido quando o valor do nmero vale 1. Quando uma funo chama a si mesmo recursivamente ela recebe um conjunto novo de variveis na pilha que usada para transferncia de valores entre funes. importante notar que recurso no trs obrigatoriamente economia de memria porque os valores sendo processados tem de ser mantidos na pilha. Nem ser mais rpido, e as vezes pode ser at mais lento porque temos o custo de chamada as funes. As principais vantagens da recurso so cdigos mais compactos e provalvemente mais fceis de serem lidos.

Argumentos - argc e argv A funo main como todas as funes podem ter parmetros. Como a funo main sempre a primeira a ser executada, os parmetros que ela recebe so fornecidos pela linha de comando. No caso da funo main so usados dois argumentos especiais argc e argv.

O primeiro argumento, argc, uma varivel inteira que indica quantos argumentos foram fornecidos para a funo.

Observar que argc vale sempre pelo menos 1, porque o nome do programa sempre o primeiro argumento fornecido ao programa. A partir do segundo argumento em diante que aparecem os outros argumentos. O outro parmetro um vetor de cadeias de caracteres. Todos os argumentos so fornecidos em forma de cadeias de caracteres e portanto, caso sejam fornecidos nmeros, estes devem ser convertidos para o formato requerido. Cada um dos argumentos do programa um elemento deste vetor.

A primeira linha da funo main pode ter a seguinte forma. int main (int argc, char *argv[]) Exemplo: #include <stdio.h> #include <stdlib.h> unsigned long int fat (unsigned long int num) { unsigned long int fato; if (num == 1) return (1); else fato = num * fat (num-1); return fato;

int main(int argc, char *argv[]) { unsigned long int numero, fatorial; unsigned int i; if (argc<2) { printf("Para rodar: %s num1 num2 ... .\n", argv[0]); exit(0); }

i = argc; for ( i=1; i<argc; i++) { numero = (unsigned long int) (atoi(argv[i])); fatorial = fat(numero); printf("O fatorial de %lu vale %lu.\n", numero, fatorial); } }

Exerccios: 1) Escreva um programa que calcule as seguintes operaes entre dois nmeros dados: Adio, Diferena, Multiplicao, Diviso e Mdia

2) Escreva um programa que crie uma tabela de temperaturas Celsius - Fahrenheit. O programa deve usar uma funo que converta de Celsius para Fahrenheit. A tabela deve iniciar na temperatura 0 graus Celsius e terminar na temperatura 100 graus Celsius. 3) Escreva um programa usando funes recursivas para calcular o fatorial de um numero dado.

4) Escreva um programa usando funes recursivas para criar a seqncia de Fibonacci. O programa deve ler um numero e exibir o valor dele na seqncia de Fibonacci. i.e Entre com um numero inteiro: 0 Fibonacci (0) = 0 Entre com um numero inteiro: 1 Fibonacci (1) = 1 Entre com um numero inteiro: 2 Fibonacci (2) = 1 Entre com um numero inteiro: 3 Fibonacci (3) = 2 Entre com um numero inteiro: 6 Fibonacci (6) = 8

Unidade Didtica VI
Vetores, Matrizes e Strings

Introduo Vetores so usados para tratamento de conjuntos de dados que possuem as mesmas caractersticas. A principal vantagem de se usar vetores que o conjunto recebe um nome comum para os elementos deste conjunto.
A diferenciao entre eles se d atravs de ndices. Com o mesmo nome, um vetor pode referenciar estruturas com mais de uma dimenso (matrizes - 2 dimenses).

Declarao de Vetores Unidimensionais A forma geral da declarao de vetores de uma dimenso :


tipo nome [tamanho]; onde tipo um tipo qualquer de dados; nome o nome pelo qual o vetor vai ser referenciado e tamanho o nmero de elementos que o vetor vai conter. IMPORTANTE: Em C o primeiro elemento tem ndice 0 e o ltimo elemento tem ndice (tamanho - 1).

Exemplos de declaraes de vetores so: int numeros [1000]; /* vetor de 1000 inteiros */ float notas [65]; /* conjunto de 65 numeros reais */ char nome [40]; /* conjunto de 40 caracteres */
O espao de memria, em bytes, ocupado por um vetor de tipo qualquer gual a: espao = tamanho * sizeof(tipo) OBSERVAO: Em C no h verificao de limites em vetores. O programador dever ter cuidado para que no seja ultrapassado o fim de um vetor e escrever em outras variveis, ou mesmo em trechos de cdigo.

Exemplo de vetores: #def ine DIM 5 #include <stdio.h> int main (void) { int vetor[DIM ]; unsigned int i, num ; printf ("Este programa gera um vetor de inteiros .\n"); printf ("Entre com o numero inicial do conjunto . "); scanf("%d", &num ); /* Geracao do conjunto */ for (i = 0 ; i < DIM ; i++) vetor[i] = num ++;

/* Impressao do conjunto */ for (i = 0; i < DIM ; i++) printf (" Elemento %d = %d\n", i, vetor[i]); return 0;
}

Exemplo: Produto escalar de dois vetores. #define DIM 5 #include <stdio.h> int main (void) { int vetor1 [DIM], vetor2 [DIM], i, prod =0; printf(" Entre c/ um vetor de %d elementos \n", DIM ); for (i = 0; i < DIM; i++) { printf (" Elemento %d ", i); scanf("%d", & vetor1[i]); // Operador endereo -> & } printf(Entre c/ outro vetor de %d elementos \n", DIM );

for (i = 0; i < DIM; i++) { printf (" Elemento %d ", i); scanf("%d", & vetor2 [i]); } for (i = 0; i < DIM; i++) prod += vetor1 [i] * vetor2 [i]; printf("O produto vale %d", prod ); return 0; }

Passos executados durante o algoritmo da bolha.

Exemplo: Ordenao pelo mtodo da bolha. #define DIM 5 #define FALSO 0 #define VERDADE 1 #include <stdio.h> int main (void) { int vetor[DIM], i; int trocou = FALSO , fim =DIM , temp ; printf(" Entre c/ um vetor de %d elementos \n", DIM );

for (i = 0; i < DIM; i++) { printf (" Elemento %d ", i); scanf("%d", & vetor[i]); } do { trocou = FALSO; for (i=0; i < fim -1; i++) if (vetor[i]> vetor[i+1]) { temp = vetor[i]; vetor[i] = vetor[i +1]; vetor[i+1] = temp ; trocou = VERDADE ; }

fim --; } while ( trocou ); for (i=0; i < DIM; i++) printf ("%d\n", vetor[i]); return 0; }

Cadeias de Caracteres Um cadeia de caracteres (string) um conjunto de caracteres terminado por um caractere nulo, que representado como \0.
Para especificar um vetor para armazenar um cadeia deve-se sempre reservar um espao para este caracter terminador. Por exemplo, para armazenar um cadeia de 40 caracteres deve-se reservar um vetor de 41 de caracteres.

Em C possvel haver constantes cadeia, que so definidas como uma lista de caracteres entre aspas. Por exemplo, "programando em C". No necessrio a colocao do caracter nulo ao final da cadeia.

Para facilitar a programao foram criadas algumas funes para manipular cadeias:
char *strcat(char *dest, const char *orig): Concatena cadeia orig ao final de dest. char *strncat (char *dest, const char *orig, size_t n): Concatena cadeia orig ao final de dest, usando no mximo n caracteres de orig. char *strcmp (const char *cad1, const char *cad2): Compara lexicograficamente as duas cadeias. Retorna zero se as cadeias so iguais, menor que 0 se cad1 < cad2, maior que 0 se cad1 > cad2.

char *strncmp (const char *cad1, const char *cad2, size_t n): Compara lexicograficamente at n caracteres das duas cadeias. Retorna zero se as cadeias so iguais, menor que 0 se cad1 < cad2, maior que 0 se cad1 > cad2.
size_t strlen(const char *cad): Calcula o comprimento da cadeia sem contar o caracater nulo. O comprimento da cadeia determinado pelo caractere nulo. No confundir o tamanho da cadeia com o tamanho do vetor que armazena a cadeia.

char *strcpy(char *dest, const char *orig): Copia cadeia orig para dest. A cadeia destino deve ter espao suficiente para armazenar orig. O valor de dest retornado.

Exemplo: Funes para cadeias de caracteres. #include < stdio.h> int main ( void ) { char c, nome [81] , sobrenome [41]; int i; printf(" Entre com um nome "); scanf(%s, nome); puts ( nome ); printf(" Entre com um sobrenome "); scanf(%s, sobrenome); puts ( sobrenome ); strcat(nome , " "); strcat(nome , sobrenome );

puts ( nome ); printf(" Qual caracter ? "); c = getchar (); for (i=0; i< strlen( nome ); i++) { if (c == nome [i]) { printf ("O caractere aparece na pos. %d\n", i+1); } } system(pause); return 0;
}

Declarao de Vetores Multidimensionais Em C existe a possibilidade de declararmos vetores de mais de uma dimenso. A forma geral da declarao a seguinte:
tipo nome [dim1][dim2][dim3]...[dimN];

onde dimI o tamanho da dimenso I. Deve-se tomar cuidado com armazenamento de matrizes multidimensionais, por que a memria necessria para guardar estes dados igual a: sizeof(tipo)*dim1*dim2*dim3*...*dimN

Por exemplo, a declarao int matriz[10][20]; define uma matriz quadrada de 10 linhas por 20 colunas.
O comando c = 2 * matriz[3][8]; armazena o dobro do elemento que est na quarta linha e nona coluna na varivel c. Lembrar que o nmero da primeira linha (coluna) igual a 0.

Exemplo: Leitura de uma matriz. #def ine DIML 3 #def ine DIMC 5 #include <stdio.h>
int main ( void ) { int i, j; int matriz [DIML ][ DIMC ];

for (i=0; i < DIML ; i++) for (j=0; j < DIMC ; j++) scanf("%d", & matriz[i][j]);

for (i=0; i < DIML ; i++) { for (j=0; j < DIMC ; j++) printf("%4d", matriz[i][j]); printf ("\n"); } return 0; } A matriz armazenada na memria linha a linha. A figura abaixo ilustra esta idia com uma matriz de nmeros inteiros de trs por trs armazenada (assumindo que cada nmero inteiro ocupa quatro bytes, o endereo aponta um byte e a matriz est armazenada a partir do endereo 1000).

Uma operao muito comum em matemtica a multiplicao de matrizes. Considere a matriz M1 com L1 linhas e C1 colunas e a matriz M2 com L2 linhas e C2 colunas. O nmero de colunas C1 de M1 deve ser igual ao nmero de linhas L2 de M2.
O elemento MRij da matriz resultado MR do produto destas matrizes definido pela equao abaixo.

Exemplo: Multiplicao de duas matrizes. #include < stdio.h> #define L1 3 #define L2 3 #define C1 3 #define C2 3
int main (void) { float m1[L1][C1], m2[L2][C2]; float mr[L1 ][ C2], m; int i, j, k;

for (i=0; i<L1; i++) { for (j=0; j<C1; j++) { printf ("%d, %d ", i,j); scanf("%f", &m1[i][j]); } } for (i=0; i<L2; i++) { for (j=0; j<C2; j++) { printf ("%d, %d ", i,j); scanf("%f", &m2[i][j]); } }

for (i=0; i<L1; i++) { for (j=0; j<C2; j++) { m = 0; for (k=0; k<C1; k++) { m += m1[i][k]* m2[k][j]; } mr[i][j] = m; } }

for (i=0; i<L1; i++ ) { for (j=0; j<C2; j++) { printf("%.3 f ", mr[i][j]); } printf ("\n"); } return 0; }

Vetores de Cadeias de Caracteres A declarao abaixo mostra uma matriz de cadeias de caracteres com 30 linhas de 80 caracteres. char nome_turma[30][80];

Exerccio: Leitura de um vetor de nomes. #define DIML 5 #define DIMC 41 #include <stdio.h>
int main ( void ) { int i; char nomes[DIML][DIMC]; for (i=0; i < DIML ; i++) { printf ("Entre com a linha %d ", i); scanf(%s, nomes[i]); }

for (i=0; i < DIML ; i++) { printf ("O nome %d e ", i); puts (nomes[i]); } return 0;
}

Inicializao de Vetores e Matrizes Em C possvel inicializar vetores da mesma forma que variveis, isto , no momento em que so declarados. A forma de fazer isto a seguinte:
tipo nome[dim] = {lista de valores}; onde lista de valores um conjunto de valores separados por vrgulas. Por exemplo (vetor inteiro de cinco posies):

int vetor[5] = { 10, 15, 20, 25, 30 }; Observe que nesta declarao necessrio que o tamanho do conjunto seja conhecido antecipadamente.

Exemplo: Tratamento de vetores. #define DIM 5 #include <stdio.h> int main () { int vetor[DIM] = {10, 15, 20, 25, 30}; int vetor1 [] = {10, 20, 30, 40, 50, 60, -1}; int vetor2 [] = {3, 6, 9, 12, 15, 18, 21, 24}; unsigned int i, tam ;
printf ("Este programa imprime vetores "); printf (" contendo numeros inteiros e\n"); printf ( inicializados durante a sua declaracao .\n");

/* Impressao dos conjuntos */ printf ("\ nVetor com tamanho pre - definido \n"); for (i=0; i < DIM ; i++) printf (" Elemento %d = %d\n", i, vetor[i]); printf ("\ nVetor terminando por -1\n"); for (i=0; vetor1[i]>0; i++) printf (" Elemento %d = %d\n", i, vetor1[i]); tam = sizeof ( vetor2 ) / sizeof ( int ); printf ("\ nDescobrindo o tamanho do Vetor\n"); for (i=0; i < tam ; i++) printf (" Elemento %d = %d\n", i, vetor2[i]); return 0;
}

possvel inicializar matrizes multidimensionais e neste caso necessrio especificar todas as dimenses menos a primeira, para que o compilador possa reservar memria de maneira adequada. Exemplo: f loat mat [][4] = { {1.0 , 2.0, 3.0, 4.0} , // linha 0 {8.0 , 9.0, 7.5, 6.0} , // linha 1 {0.0 , 0.1, 0.5, 0.4} }; // linha 2

Exemplo: Tratamento de vetores. #define DIM 5 #include < stdio.h> int main ( void ) { char disciplinas [][40] = { " disc 0: Computacao para Informatica ", " disc 1: Banco de Dados I", " disc 2: Banco de Dados II", " disc 3: Arquitetura de Computadores I" }; int i;

printf(" Qual a disciplina ? "); scanf("%d", &i); puts ( disciplinas [i]); return 0;
}

Exerccios: 1) Escreva um programa que leia uma linha de at 80 caracteres do teclado e imprima quantos caracteres foram lidos.

2) Escreva um programa que leia uma linha de caracteres do teclado e imprima quantas vezes um caracter, tambm fornecido pelo teclado, aparece nesta linha. O programa tambm deve imprimir em que posies o caracter foi encontrado.

3) Escreva um programa que leia uma linha do teclado e em seguida um par de caracteres. O programa deve procurar este par na linha e imprimir em que posies o par foi encontrado. Obs. No use funes da biblioteca de strings do C

4) Escreva um programa que leia uma linha do teclado e imprima todas as vogais encontradas no texto e o total de vezes que elas aparecem. Obs: Tamanho maximo da linha deve ser 40 caracteres.

5) O Imperador Romano Cesar usava um sistema simples para codificar as mensagens que enviava aos seus generais. Neste sistema cada letra era substituda por trs letras frente no alfabeto. A sua misso mais simples ainda, escrever um programa que converta cada letra, e somente as letras, de uma mensagem de at 80 caracteres para a letra imediatamente posterior. Note que a letra z deve ser convertida para a letra a, e a letra Z para A. 6) Escreva um programa que leia uma frase de 80 caracteres e a imprima retirando os espaos em branco.

7) Escreva um programa que leia uma linha de caracteres do teclado de tamanho 80. A linha somente contm letras. Divida a linha em blocos de 5 letras. Dentro de cada bloco o seu programa deve trocar a primeira letra pela letra seguinte no alfabeto, a segunda letra por duas letras adiante no alfabeto, a terceira por trs letras adiante e assim at a quinta. Os espaos em branco devem ser retirados da frase. Considere o seguinte exemplo. 1. Frase lida: EVA VIU A UVA 2. Retirada dos espaos em branco: EVAVIUAUVA 3. Diviso em blocos de 5 (blocos indicados por tipos diferentes): EVAVI UAUVA

4. Criptografia: FYDAN VCYAF Portanto, o que ser impresso pelo programa : FYDANVCYAF 8) Escreva um programa que leia uma matriz de 3x3 que contm somente caracteres 0 e X e procure linhas, ou diagonais, que contenham somente um dos dois caracteres. O caracter a ser procurado deve ser lido do teclado.

9) Escreva um programa que leia uma linha de caracteres do teclado e converta o primeiro caracter de cada palavra para maisculas. Assuma que as palavras so sempre separadas por um branco.

10) Escreva um programa que leia para um vetor um conjunto de nmeros inteiros. Assuma que o conjunto de nmeros lidos menor que o tamanho do vetor. O programa deve inserir no vetor, em uma posio especificada pelo usurio, um nmero lido do teclado. Assuma que a posio especificada pelo usurio corresponde ao ndice do vetor.

11) Faa um programa que inverta uma cadeia de caracteres. O programa deve ler a cadeia e armazen-la invertida em outra cadeia.

Unidade Didtica VII


Noes de Ponteiros e Tipos de Dados Definidos pelo Usurio

Ponteiros Ponteiros geralmente so usados em situaes onde necessrio conhecer a localizao da memria (o endereo) onde est armazenada a varivel e no o seu contedo .
Um ponteiro uma varivel que contm um endereo de uma posio de memria e no o contedo da posio.

Exemplo: A Figura a seguir mostra o mapa de um trecho de memria que contm duas variveis inteiras (num, res) ocupando 4 bytes cada uma e mais um ponteiro (pint), que tambm ocupa 4 bytes (endereos pulam de quatro em quatro bytes).

Aplicaes: Quando se deseja que uma funo retorne mais de um valor. Neste caso a funo recebe como argumentos no os valores dos parmetros mas sim ponteiros que apontem para seus endereos. Assim esta funo pode modificar diretamente os contedos destas variveis, que aps o fim da funo estaro disponveis para a funo que chamou. Com ponteiros, possvel reservar as posies de memria necessrias para armazenamento destas reas somente quando for necessrio e no quando as variveis so declaradas.

Na figura, o ponteiro pi aponta para a rea de memria que contm um vetor de 10 inteiros. No incio do programa definida uma varivel ponteiro e seu tipo. Durante a execuo do programa, reserva-se a rea necessria para guardar os dados aps descobrir o tamanho do vetor. O tamanho do vetor dado na sua declarao mantida at o final do programa.

Declarao de Ponteiros: Os ponteiros, como as variveis, precisam ser declarados.


Forma geral da declarao de um ponteiro a seguinte: tipo *nome; Onde tipo qualquer tipo vlido em C e nome o nome da varivel ponteiro.

Por exemplo:
int *res; /* ponteiro para inteiro */ float *div; /* ponteiro para ponto flutuante */

Como as variveis, os ponteiros tambm devem ser inicializados antes de serem usados.

Esta inicializao pode ser feita na declarao ou atravs de uma atribuio.

Aps a declarao o que temos um espao na memria reservado para armazenamento de endereos. O valor inicial da memria indefinido como acontece com variveis.

Um ponteiro pode ser inicializado com um endereo ou com o valor NULL. O valor NULL, que equivalente a 0, uma constante definida no arquivo <stdio.h> e significa que o ponteiro no aponta para lugar nenhum.

Operadores Especiais para Ponteiros Existem dois operadores especiais para ponteiros: * e &.

Os dois operadores so unrios, isto requerem somente um operando.


O operador & devolve o endereo de memria do seu operando.

Aps a execuo da instruo: pint = &num; /*o endereco de num e carregado em pint */
a varivel ponteiro pint termina com o valor 4. O fato importante que o ponteiro pint passou a apontar para a varivel num.

O operador * o complemento de &. O operador * devolve o valor da varivel localizada no endereo apontado pelo ponteiro. Por exemplo, considere que o comando res = *pint; foi executado logo aps pint = &num;

Isto significa que a varivel res recebe o valor apontado por pint, ou seja a varivel res recebe o valor 10.

Atribuio de Ponteiros Da mesma maneira que ocorre com uma varivel comum, o contedo de um ponteiro pode ser passado para outro ponteiro do mesmo tipo.
Por exemplo, uma varivel ponteiro declarada como apontador de dados inteiros deve sempre apontar para dados deste tipo. Observar que em C possvel atribuir qualquer endereo a uma varivel ponteiro. Deste modo possvel atribuir o endereo de uma varivel do tipo float a um ponteiro do tipo int. No entanto, o programa no ir funcionar da maneira correta.

No exemplo a seguir, o endereo do terceiro elemento do vetor v carregado em p1 e o endereo da varivel i carregado em p2. No final o endereo apontado por p1 carregado em p2.

Exemplo de atribuio de ponteiros. #include <stdio.h> int main (void) { int vetor [] = { 10, 20, 30, 40, 50 }; int *p1 , *p2, i = 100; p1 = & vetor [2]; printf("%d\n", *p1 ); p2 = &i; printf("%d\n", *p2 ); p2 = p1; printf("%d\n", *p2 ); return 0;
}

Os comandos printf imprimem os valores apontados pelos ponteiros respectivos, mostrando os seguintes valores:

30 100 30

Incrementando e Decrementando Ponteiros Exemplos de operaes com ponteiros. int main (void) { int vetor [] = { 10, 20, 30, 40, 50 }; int *p1; p1 = &vetor [2]; printf ("%d\n", *p1 ); p1 ++; printf ("%d\n", *p1 ); p1 = p1 + 1; printf ("%d\n", *p1 ); return 0; }
O primeiro printf imprime 30, que o elemento de ndice igual a 2 no vetor vetor. Aps o incremento do ponteiro o segundo printf imprime 40 e o mesmo acontece com o terceiro printf que imprime 50.

Sempre que um ponteiro incrementado (decrementado) ele passa a apontar para a posio do elemento seguinte (anterior).
O compilador interpreta o comando p1++ como: passe a apontar para o prximo nmero inteiro e, portanto, aumenta o endereo do nmero de bytes correto. A operao abaixo faz com que o ponteiro p passe a apontar para o terceiro elemento aps o atual. p = p + 3; Tambm possvel usar-se o seguinte comando *(p+1)=10; Este comando armazena o valor 10 na posio seguinte quela apontada por p.

Exemplo de subtrao de ponteiros. #include <stdio.h> int main (void) { float vetor [] = { 1.0, 2.0, 3.0, 4.0, 5.0 }; float *p1 , *p2; p1 = & vetor [2]; /* endereco do terceiro elemento */ p2 = vetor; /* endereco do primeiro elemento */ printf(" Diferenca entre ponteiros %d\n", p1 -p2 ); return 0; } // imprime valor o 2
No possvel multiplicar ou dividir ponteiros, e no se pode adicionar ou subtrair o tipo float ou o tipo double a ponteiros.

Comparao de Ponteiros possvel comparar ponteiros em uma expresso relacional. No entanto, s possvel comparar ponteiros de mesmo tipo.

Exemplo de comparao de ponteiros. #include < stdio.h> int main (void) { char *c, *v, a, b; scanf("%c %c", &a, &b); c = &a; v = &b; if (c == v) printf ("As variveis estao na mesma posicao ."); else printf("As variaveis nao estao na mesma posicao ."); return 0; }

Ponteiros e Vetores Ponteiros e Vetores esto fortemente relacionados na linguagem C.


O nome de um vetor um ponteiro que aponta para a primeira posio do vetor. Na declarao de vetor, o compilador automaticamente reserva um bloco de memria para que o vetor seja armazenado. Quando apenas um ponteiro declarado a nica coisa que o compilador faz alocar um ponteiro para apontar para a memria, sem que espao seja reservado.

Exemplo de alteraes invlidas sobre ponteiros. int list [5], i; // Ponteiro list nao pode ser modificado pelo endereco de i list = &i // O ponteiro list nao pode ser incrementado list ++;

Exemplo de notaes de vetores. #include < stdio.h> int main (void) { float v[] = {1.0 , 2.0, 3.0, 4.0, 5.0, 6.0, 7.0}; int i; for (i = 0; i < 7; i++) printf ("%.1f ", v[i]); printf("\n"); for (i = 0; i < 7; i++) printf ("%.1f ", *(v+i)); return 0; }

Exemplo de ponteiro varivel. #include <stdio.h> int main (void) { float v[] = {1.0 , 2.0, 3.0, 4.0, 5.0, 6.0, 7.0}; int i; float *p; for (i = 0; i < 7; i++) printf("%.1 f ", v[i]); printf ("\n"); for (i = 0; i < 7; i++) printf("%.1 f ", *(v+i)); printf ("\n"); for (i = 0, p = v; i < 7; i++, p++) printf("%.1 f ", *p); return 0; }

Ponteiros e Cadeias de Caracteres #include <stdio.h> int main (void) { char *s, *lista=" 1234567890 "; int tam =0; s = lista; while (*(s + tam ++) != \0 ); // aponta p/ cada caracter tam --; printf ("O tamanho do string \"%s\" e %d caracteres .\n", lista , tam ); return 0; }

Estruturas

Estruturas

Uma estrutura um conjunto de uma ou mais variveis, que podem ser de tipos diferentes, agrupadas sob um nico nome. O fato de variveis agrupadas em uma estrutura poderem ser referenciadas por um nico nome facilita a manipulao dos dados armazenados nestas estruturas.

Exemplo de estruturas: Uma estrutura que armazene as diversas informaes sobre os alunos de uma Universidade. Nesta estrutura estariam armazenadas, sob o mesmo nome, informaes do tipo: nome, registro, data de nascimento, data de ingresso, CPF, etc.

Uma estrutura pode incluir outras estruturas alm de variveis estruturas simples.
As estruturas facilitam manipular estes agrupamentos complexos de dados. Por exemplo, considere o problema de ordenar as informaes sobre os alunos da Universidade exemplo. A ordenao pode ser efetuada como se todos os dados que compem a estrutura fossem uma entidade nica.

Definies Bsicas Uma estrutura, ento, uma coleo de variveis, de tipos diversos ou no, agrupadas sob um nico nome. As variveis que compem a estrutura so os seus membros, elementos ou campos.
Normalmente os elementos da estrutura tem alguma relao semntica.

A palavra chave struct inicia a declarao de uma estrutura, em seguida aparece um identificador (p. ex. ALUNO), que subsequentemente pode ser usado como abreviao da definio da estrutura. A declarao continua com a lista de declaraes entre chaves e termina com um ;.
Exemplo de definio de uma estrutura: struct ALUNO { char nome [40]; int registro ; int ano_entrada ; char curso [20]; };

Um membro da estrutura e uma vriavel no membro da estrutura podem ter o mesmo nome, j que possvel distingui-las por contexto.
A declarao acima ainda no alocou espao de memria j que nenhuma varivel foi realmente definida. Esta declarao apenas um modelo de como estruturas do tipo ALUNO devem ser construdas.

Para definir estruturas deste tipo podemos usar a seguinte declarao.


struct ALUNO paulo, carlos, ana;

Nesta declarao trs estruturas do tipo ALUNO foram criadas. Esta declarao alocou espao para armazenar os dados dos trs alunos.

A declarao acima idntica, na forma, a declarao de variveis de um tipo pr-definido, como por exemplo:

int a, b, c;

possvel declarar ao mesmo tempo o modelo da estrutura e as variveis do programa. Por exemplo,

struct ALUNO { char nome [40]; int registro ; int ano_entrada ; char curso [20]; } paulo , carlos , ana;

Para referenciar um elemento da estrutura usa-se o nome da varivel do tipo da estrutura seguida de um ponto e do nome do elemento.
Por exemplo:

paulo.ano_entrada = 1999; //armazena o ano em que aluno paulo entrou na universidade.


Para ler o nome do curso que paulo cursa pode-se usar o comando: gets(paulo.curso);

Estruturas podem conter outras estruturas como membros. Por exemplo, vamos definir uma estrutura para armazenar uma data com a seguinte definio: struct DATA { int dia , mes , ano; }; struct aluno { char nome [40]; int registro ; int ano_entrada ; char curso [20]; struct DATA data_nascimento ; };

Para se referir ao ms de nascimento de uma varivel paulo do tipo estrutura aluno usamos a declarao:
paulo.data_nascimento.mes

Note que o operador ponto (.) associa da esquerda para a direita. Uma forma mais conveniente de definio de estruturas possvel com o uso do comando typedef. Este comando permite dar a um tipo de dados um novo nome. A inteno aumentar a legibilidade do programa.

Por exemplo, possvel usar o seguinte cdigo typedef int cores; typedef int laranja ; typedef int manga; ... laranja lima ; manga espada; cores AMARELO ; ... espada ++; Ao mesmo tempo que typedef tem a vantagem de tornar mais claro a finalidade de cada varivel ele pode trazer problemas na medida em que esconde o real tipo da varivel.

comum o uso de typedef em conjunto com struct. Considere a definio de uma estrutura para guardar tempos gastos em tarefas. Esta estrutura deve guardar horas, minutos e segundos. Usando esta combinao, a definio usualmente feita da seguinte maneira: struct t_TEMPO { int hora , minuto , segundo ; }; typedef struct t_TEMPO TEMPO; ... TEMPO t1;

Uma forma ainda mais abreviada, junta as duas definie, ficando a definio da estrutura da seguinte maneira: typedef struct _TEMPO { int hora , minuto , segundo ; } TEMPO; ... TEMPO t1;

possvel dispensar o nome da estrutura (_TEMPO) e a definio fica ainda mais simples, com a seguinte forma:
typedef struct { int hora , minuto , segundo ; } TEMPO; ... TEMPO t1;