• Nenhum resultado encontrado

2 Manipulando dados, vari ´aveis e express ˜

N/A
N/A
Protected

Academic year: 2019

Share "2 Manipulando dados, vari ´aveis e express ˜"

Copied!
346
0
0

Texto

(1)

LINGUAGEM C:

DESCOMPLICADA

(2)

SUM ´ARIO

1 Introduc¸ ˜ao 9

1.1 A linguagem C . . . 9

1.1.1 Influ ˆencia da linguagem C . . . 9

1.2 Utilizando o Code::Blocks para programar em C . . . 11

1.2.1 Criando um novo projeto no Code::Blocks . . . 11

1.2.2 Utilizando o debugger do Code::Blocks . . . 15

1.3 Esqueleto de um programa em linguagem C . . . 19

1.3.1 Indentac¸ ˜ao do c ´odigo . . . 21

1.3.2 Coment ´arios . . . 22

1.4 Bibliotecas e func¸ ˜oes ´uteis da linguagem C . . . 23

1.4.1 O comando #include . . . 23

1.4.2 Func¸ ˜oes de entrada e sa´ıda: stdio.h . . . 24

1.4.3 Func¸ ˜oes de utilidade padr ˜ao: stdlib.h . . . 26

1.4.4 Func¸ ˜oes matem ´aticas: math.h . . . 28

1.4.5 Testes de tipos de caracteres: ctype.h . . . 29

1.4.6 Operac¸ ˜oes em String: string.h . . . 29

1.4.7 Func¸ ˜oes de data e hora: time.h . . . 30

2 Manipulando dados, vari ´aveis e express ˜oes em C 32 2.1 Vari ´aveis . . . 32

2.1.1 Nomeando uma vari ´avel . . . 33

2.1.2 Definindo o tipo de uma vari ´avel . . . 35

2.2 Lendo e escrevendo dados . . . 39

(3)

2.2.2 Putchar . . . 42

2.2.3 Scanf . . . 43

2.2.4 Getchar . . . 46

2.3 Escopo: tempo de vida da vari ´avel . . . 47

2.4 Constantes . . . 52

2.4.1 Comando #define . . . 53

2.4.2 Comando const . . . 53

2.4.3 seq ¨u ˆencias de escape . . . 54

2.5 Operadores . . . 55

2.5.1 Operador de atribuic¸ ˜ao: “=” . . . 55

2.5.2 Operadores aritm ´eticos . . . 58

2.5.3 Operadores relacionais . . . 60

2.5.4 Operadores l ´ogicos . . . 62

2.5.5 Operadores bit-a-bit . . . 63

2.5.6 Operadores de atribuic¸ ˜ao simplificada . . . 66

2.5.7 Operadores de Pr ´e e P ´os-Incremento . . . 67

2.5.8 Modeladores de Tipos (casts) . . . 69

2.5.9 Operador v´ırgula “,” . . . 70

2.5.10 Preced ˆencia de operadores . . . 71

3 Comandos de Controle Condicional 73 3.1 Definindo uma condic¸ ˜ao . . . 73

3.2 Comando if . . . 75

3.2.1 Uso das chaves{} . . . 78

3.3 Comando else . . . 79

(4)

3.5 Operador ? . . . 86

3.6 Comando switch . . . 88

3.6.1 Uso do comando break no switch . . . 91

3.6.2 Uso das chaves{}no case . . . 94

4 Comandos de Repetic¸ ˜ao 96 4.1 Repetic¸ ˜ao por condic¸ ˜ao . . . 96

4.1.1 Lac¸o infinito . . . 97

4.2 Comando while . . . 98

4.3 Comando for . . . 101

4.3.1 Omitindo uma clausula do comando for . . . 104

4.3.2 Usando o operador de v´ırgula (,) no comando for . . . 107

4.4 Comando do-while . . . 109

4.5 Aninhamento de repetic¸ ˜oes . . . 112

4.6 Comando break . . . 113

4.7 Comando continue . . . 115

4.8 Goto e label . . . 116

5 Vetores e matrizes - Arrays 119 5.1 Exemplo de uso . . . 119

5.2 Array com uma dimens ˜ao - vetor . . . 120

5.3 Array com duas dimens ˜oes - matriz . . . 124

5.4 Arrays multidimensionais . . . 125

5.5 Inicializac¸ ˜ao de arrays . . . 127

5.5.1 Inicializac¸ ˜ao sem tamanho . . . 129

(5)

6 Arrays de caracteres - Strings 133

6.1 Definic¸ ˜ao e declarac¸ ˜ao de uma string . . . 133

6.1.1 Inicializando uma string . . . 134

6.1.2 Acessando um elemento da string . . . 134

6.2 Trabalhando com strings . . . 135

6.2.1 Lendo uma string do teclado . . . 136

6.2.2 Escrevendo uma string na tela . . . 139

6.3 Func¸ ˜oes para manipulac¸ ˜ao de strings . . . 140

6.3.1 Tamanho de uma string . . . 140

6.3.2 Copiando uma string . . . 141

6.3.3 Concatenando strings . . . 142

6.3.4 Comparando duas strings . . . 142

7 Tipos definidos pelo programador 144 7.1 Estruturas: struct . . . 144

7.1.1 Inicializac¸ ˜ao de estruturas . . . 149

7.1.2 Array de estruturas . . . 150

7.1.3 Atribuic¸ ˜ao entre estruturas . . . 152

7.1.4 Estruturas aninhadas . . . 153

7.2 Uni ˜oes: union . . . 155

7.3 Enumarac¸ ˜oes: enum . . . 158

7.4 Comando typedef . . . 163

8 Func¸ ˜oes 167 8.1 Definic¸ ˜ao e estrutura b ´asica . . . 167

8.1.1 Declarando uma func¸ ˜ao . . . 168

(6)

8.1.3 Corpo da func¸ ˜ao . . . 173

8.1.4 Retorno da func¸ ˜ao . . . 176

8.2 Tipos de passagem de par ˆametros . . . 181

8.2.1 Passagem por valor . . . 182

8.2.2 Passagem por refer ˆencia . . . 183

8.2.3 Passagem de arrays como par ˆametros . . . 186

8.2.4 Passagem de estruturas como par ˆametros . . . 190

8.2.5 Operador Seta . . . 193

8.3 Recurs ˜ao . . . 194

9 Ponteiros 200 9.1 Declarac¸ ˜ao . . . 201

9.2 Manipulando ponteiros . . . 202

9.2.1 Inicializac¸ ˜ao e atribuic¸ ˜ao . . . 202

9.2.2 Aritm ´etica com ponteiros . . . 208

9.2.3 Operac¸ ˜oes relacionais com ponteiros . . . 211

9.3 Ponteiros gen ´ericos . . . 213

9.4 Ponteiros e arrays . . . 215

9.4.1 Ponteiros e arrays multidimensionais . . . 219

9.4.2 Array de ponteiros . . . 220

9.5 Ponteiro para ponteiro . . . 221

10 Alocac¸ ˜ao Din ˆamica 225 10.1 Func¸ ˜oes para alocac¸ ˜ao de mem ´oria . . . 227

10.1.1 sizeof() . . . 227

10.1.2 malloc() . . . 228

(7)

10.1.4 realloc() . . . 233

10.1.5 free() . . . 236

10.2 Alocac¸ ˜ao de arrays multidimensionais . . . 238

10.2.1 Soluc¸ ˜ao 1: usando array unidimensional . . . 238

10.2.2 Soluc¸ ˜ao 2: usando ponteiro para ponteiro . . . 240

10.2.3 Soluc¸ ˜ao 3: ponteiro para ponteiro para array . . . 244

11 Arquivos 248 11.1 Tipos de Arquivos . . . 248

11.2 Sobre escrita e leitura em arquivos . . . 250

11.3 Ponteiro para arquivo . . . 251

11.4 Abrindo e fechando um arquivo . . . 251

11.4.1 Abrindo um arquivo . . . 251

11.4.2 Fechando um arquivo . . . 256

11.5 Escrita e leitura em arquivos . . . 257

11.5.1 Escrita e leitura de caractere . . . 257

11.5.2 Fim do arquivo . . . 261

11.5.3 Arquivos pr ´e-definidos . . . 262

11.5.4 Forc¸ando a escrita dos dados do “buffer” . . . 263

11.5.5 Sabendo a posic¸ ˜ao atual dentro do arquivo . . . 264

11.5.6 Escrita e leitura de strings . . . 265

11.5.7 Escrita e leitura de blocos de bytes . . . 269

11.5.8 Escrita e leitura de dados formatados . . . 277

11.6 Movendo-se dentro do arquivo . . . 282

11.7 Excluindo um arquivo . . . 284

(8)

12 Avanc¸ado 287

12.1 Diretivas de compilac¸ ˜ao . . . 287

12.1.1 O comando #include . . . 287

12.1.2 Definindo macros: #define e #undef . . . 287

12.1.3 Diretivas de Inclus ˜ao Condicional . . . 294

12.1.4 Controle de linha: #line . . . 297

12.1.5 Diretiva de erro: #error . . . 298

12.1.6 Diretiva #pragma . . . 298

12.1.7 Diretivas pr ´e-definidas . . . 299

12.2 Trabalhando com Ponteiros . . . 299

12.2.1 Array de Ponteiros e Ponteiro para array . . . 299

12.2.2 Ponteiro para func¸ ˜ao . . . 300

12.3 Argumentos na linha de comando . . . 308

12.4 Recursos avanc¸ados da func¸ ˜ao printf() . . . 311

12.4.1 Os tipos de sa´ıda . . . 312

12.4.2 As “flags” para os tipos de sa´ıda . . . 317

12.4.3 O campo “largura” dos tipos de sa´ıda . . . 320

12.4.4 O campo “precis ˜ao” dos tipos de sa´ıda . . . 320

12.4.5 O campo “comprimento” dos tipos de sa´ıda . . . 323

12.4.6 Usando mais de uma linha na func¸ ˜ao printf() . . . 323

12.5 Recursos avanc¸ados da func¸ ˜ao scanf() . . . 324

12.5.1 Os tipos de entrada . . . 325

12.5.2 O campo asterisco “*” . . . 329

12.5.3 O campo “largura” dos tipos de entrada . . . 329

12.5.4 Os “modificadores” dos tipos de entrada . . . 330

(9)

12.5.6 Lendo apenas caracteres pr ´e-determinados . . . 332

12.6 Classes de Armazenamento de Vari ´aveis . . . 333

12.6.1 A Classe auto . . . 334

12.6.2 A Classe extern . . . 334

12.6.3 A Classe static . . . 335

12.6.4 A Classe register . . . 337

12.7 Trabalhando com campos de bits . . . 338

12.8 O Modificador de tipo “volatile” . . . 340

(10)

1 INTRODUC¸ ˜AO

1.1 A LINGUAGEM C

A linguagem C ´e uma das mais bem sucedidas linguagens de alto n´ıvel j ´a criadas e considerada uma das linguagens de programac¸ ˜ao mais utiliza-das de todos os tempos. Define-se como linguagem de alto n´ıvel aquela que possui um n´ıvel de abstrac¸ ˜ao relativamente elevado, que est ´a mais pr ´oximo da linguagem humana do que do c ´odigo de m ´aquina. Ela foi cri-ada em 1972 nos laborat ´orios Bell por Dennis Ritchie, sendo reviscri-ada e pa-dronizada pela ANSI (Instituto Nacional Americano de Padr ˜oes, do ingl ˆes American National Standards Institute) em 1989.

Trata-se de uma linguagem estruturalmente simples e de grande portabi-lidade. Poucas s ˜ao as arquiteturas de computadores para que um compi-lador C n ˜ao exista. Al ´em disso, o compicompi-lador da linguagem gera c ´odigos mais enxutos e velozes do que muitas outras linguagens.

A linguagem C ´e uma linguagem procedural, ou seja, ela permite que um problema complexo seja facilmente decomposto em m ´odulos, onde cada m ´odulo representa um problema mais simples. Al ´em disso, ela fornece acesso de baixo n´ıvel `a mem ´oria, o que permite o acesso e a programac¸ ˜ao direta do microprocessador. Ela tamb ´em permite a implementac¸ ˜ao de gramas utilizando instruc¸ ˜oes em Assembly, o que permite programar pro-blemas onde a depend ˆencia do tempo ´e critica.

Por fim, a linguagem C foi criada para incentivar a programac¸ ˜ao multi-plataforma, ou seja, programas escritos em C podem ser compilado para uma grande variedade de plataformas e sistemas operacionais com ape-nas pequeape-nas alterac¸ ˜oes no seu c ´odigo fonte.

1.1.1 INFLU ˆENCIA DA LINGUAGEM C

(11)
(12)

1.2 UTILIZANDO O CODE::BLOCKS PARA PROGRAMAR EM C

Existem diversos ambientes de desenvolvimento integrado ou IDE’s (do ingl ˆes, Integrated Development Environment) que podem ser utilizados para a programac¸ ˜ao em linguagem C. Um deles ´e oCode::Blocks, uma IDE de c ´odigo aberto e multiplataforma que suporta m ´utiplos compiladores. O

Code::Blockspode ser baixado diretamente de seu site

www.codeblocks.org

ou pelo link

prdownload.berlios.de/codeblocks/codeblocks-10.05mingw-setup.exe

esse ´ultimo inclui tanto a IDE doCode::Blockscomo o compilador GCC e o debugger GDB da MinGW.

1.2.1 CRIANDO UM NOVO PROJETO NO CODE::BLOCKS

Para criar um novo projeto de um programa no software Code::Blocks, basta seguir os passos abaixo:

1. Primeiramente, inicie o software Code::Blocks (que j ´a deve estar instalado no seu computador). A tela abaixo dever ´a aparecer;

(13)

3. Uma lista de modelos (templates) de projetos ir ´a aparecer. Escolha

“Console aplication”;

(14)

5. Escolha a opc¸ ˜ao“C”e clique em“Next”;

(15)

7. Na tela a seguir, algumas configurac¸ ˜oes do compilador podem ser modificados. No entanto, isso n ˜ao ser ´a necess ´ario. Basta clicar em

“Finish”;

(16)

9. Por fim, podemos utilizar as seguintes opc¸ ˜oes do menu“Build”para compilar e executar nosso programa:

Compile current file (Ctrl+Shift+F9): essa opc¸ ˜ao ir ´a ransfor-mar seu arquivo de c ´odigo fonte em instruc¸ ˜oes de m ´aquina e gerar um arquivo do tipo objeto;

Build (Ctrl+F9): ser ˜ao compilados todos os arquivos do seu projeto e fazer o processo de linkagem com tudo que ´e ne-cess ´ario para gerar o execut ´avel do seu programa;

Build and run (F9): al ´em de gerar o execut ´avel, essa opc¸ ˜ao tamb ´em executa o programa gerado.

1.2.2 UTILIZANDO O DEBUGGER DO CODE::BLOCKS

Com o passar do tempo, nosso conhecimento sobre programac¸ ˜ao cresce, assim como a complexidade de nossos programas. Surge ent ˜ao a ne-cessidade de examinar o nosso programa a procura de erros ou defeitos no c ´odigo fonte. para realizar essa tarefa, contamos com a ajuda de um

depuradoroudebugger.

Odebuggernada mais ´e do que um programa de computador usado para testar e depurar (limpar, purificar) outros programas. Dentre as principais funcionalidades de um debugger est ˜ao:

• a possibilidade de executar um programapasso-a-passo;

(17)

Para utilizar o debugger doCode::Blocks, imagine o seguinte c ´odigo abaixo:

Exemplo: c ´odigo para o debugger

1 # include <s t d i o . h> 2 # include <s t d l i b . h> 3 i n t f a t o r i a l (i n t n ){ 4 i n t i , f = 1 ;

5 f o r ( i = 1 ; i <= n ; i ++) 6 f = f ∗ i ;

7 r e t u r n f ; 8 }

9 i n t main ( ){ 10 i n t x , y ;

11 p r i n t f ( ‘ ‘ D i g i t e um v a l o r i n t e i r o : ’ ’ ) ; 12 s c a n f ( ‘ ‘ % d ’ ’ ,& x ) ;

13 i f ( x > 0 ){

14 p r i n t f ( ‘ ‘ X eh p o s i t i v o\n ’ ’ ) ; 15 y = f a t o r i a l ( x ) ;

16 p r i n t f ( ‘ ‘ F a t o r i a l de X eh %d\n ’ ’ , y ) ; 17 }else{

18 i f ( x < 0 )

19 p r i n t f ( ‘ ‘ X eh n e g a t i v o\n ’ ’ ) ;

20 else

21 p r i n t f ( ‘ ‘ X eh Zero\n ’ ’ ) ;

22 }

23 p r i n t f ( ‘ ‘ Fim do programa !\n ’ ’ ) ; 24 system ( pause ) ;

25 r e t u r n 0 ; 26 }

Todas as funcionalidades do debugger podem ser encontradas no menu

Debug. Um progama pode ser facilmente depurado seguindo os passos abaixo:

1. Primeiramente, vamos colocar dois pontos de parada oubreakpoints

(18)

2. Iniciamos o debugger com a opc¸ ˜aoStart (F8). Isso far ´a com que o programa seja executado normalmente at ´e encontrar umbreakpoint. No nosso exemplo, o usu ´ario dever ´a digitar, no console, o valor lido pelo comandoscanf()e depois retornar para a tela doCode::Blocks

onde o programa se encontra pausado. Note que existe um tri ˆangulo amarelo dentro do primeiro breakpoint. Esse tri ˆangulo indica em que parte do programa a pausa est ´a;

3. Dentro da opc¸ ˜ao Debugging windows, podemos habilitar a opc¸ ˜ao

(19)

pas-sado para func¸ ˜oes. Outra maneira de acessar a janelaWatches ´e mudar a perspectiva do software para a opc¸ ˜aoDebugging, no menu

View,Perspectives;

4. A partir de um determinado ponto de pausa do programa, podemos nos mover para a pr ´oxima linha do programa com a opc¸ ˜aoNext line (F7). Essa opc¸ ˜ao faz com que o programa seja executado passo-a-passo, sempre avanc¸ando para a linha seguinte do escopo onde nos encontramos;

(20)

6. Uma vez dentro de uma func¸ ˜ao, podemos percorr ˆe-la passo-a-passo com a opc¸ ˜ao Next line (F7). Terminada a func¸ ˜ao, o debugger vai para a linha seguinte ao ponto do c ´odigo que chamou a func¸ ˜ao (linha 16). Caso queiramos ignorar o resto da func¸ ˜ao e voltar para onde estavamos no c ´odigo que chamou a func¸ ˜ao, basta clicar na opc¸ ˜ao

Step out (Shift+Ctrl+F7);

7. Para avanc¸ar todo o c ´odigo e ir direto para o pr ´oximo breakpoint, podemos usar a opc¸ ˜aoContinue (Ctrl+F7);

8. Por fim, para parar o debugger, basta clicar na opc¸ ˜ao Stop debug-ger.

1.3 ESQUELETO DE UM PROGRAMA EM LINGUAGEM C

Todo programa escrito em linguagem C que vier a ser desenvolvido deve possuir o seguinte esqueleto:

Primeiro programa em linguagem C

1 # include <s t d i o . h> 2 # include <s t d l i b . h> 3 i n t main ( ){

4 p r i n t f ( ‘ ‘ H e l l o World \n ’ ’ ) ; 5 system ( ‘ ‘ pause ’ ’ ) ;

(21)

A primeira vista este parece ser um programa f ´util, j ´a que sua ´unica fina-lidade ´e mostrar na tela uma mensagem dizendoHello World, fazer uma pausa, e terminar o programa. Por ´em, ele permite aprender alguns dos conceitos b ´asicos da lingaugem C, como mostra a figura abaixo:

Abaixo, ´e apresentada uma descric¸ ˜ao mais detalhada do esqueleto do pro-grama:

• Temos, no in´ıcio do programa, a regi ˜ao onde s ˜ao feitas as declarac¸ ˜oes globais do programa, ou seja, aquelas que s ˜ao v ´alidas para todo o programa. No exemplo, o comando#include<nome da biblioteca>

´e utilizado para declarar as bibliotecas que ser ˜ao utilizadas pelo pro-grama. Uma biblioteca ´e um conjunto de func¸ ˜oes (pedac¸os de c ´odigo) j ´a implementados e que podem ser utilizados pelo programador. No exemplo anterior, duas bibliotecas foram adicionadas ao programa:

stdio.h (que cont ´em as func¸ ˜oes de leitura do teclado e escrita em tela) estdlib.h;

• Todo o programa em linguagem C deve conter a func¸ ˜aomain(). Esta func¸ ˜ao ´e respons ´avel pelo in´ıcio da execuc¸ ˜ao do programa, e ´e den-tro dela que iremos colocar os comandos que queremos que o pro-grama execute.

• As chaves definem o in´ıcio “{” e o fim “}” de um bloco de coman-dos / instruc¸ ˜oes. No exemplo, as chaves definem o in´ıcio e o fim do programa;

(22)

necessi-dade do comando return 0, apenas para informar que o programa chegou ao seu final e que est ´a tudo OK;

• A func¸ ˜aoprintf()est ´a definida na bibliotecastdio.h. Ela serve para imprimir uma mensagem de texto na tela do computador (ou melhor, em uma janela MSDOS ou shell no Linux). O texto a ser escrito deve estar entre “aspas duplas”, e dentro dele podemos tamb ´em colocar caracteres especiais, como o “\n”, que indica que ´e para mudar de linha antes de continuar a escrever na tela;

• O comandosystem(“pause”)serve para interromper a execuc¸ ˜ao do programa (fazer uma pausa) para que voc ˆe possa analisar a tela de sa´ıda, ap ´os o t ´ermino da execuc¸ ˜ao do programa. Ela est ´a definida dentro da bibliotecastdlib.h;

• A declarac¸ ˜ao de um comandoquase sempretermina com um ponto e v´ırgula “;”. Nas pr ´oximas sec¸ ˜oes, n ´os veremos quais os comandos que n ˜ao terminam com um ponto e v´ırgula “;”;

• Os par ˆenteses definem o in´ıcio “(” e o fim “)” da lista de argumentos de uma func¸ ˜ao. Um argumento ´e a informac¸ ˜ao que ser ´a passada para a func¸ ˜ao agir. No exemplo, podemos ver que os comandos

main,printfesystem, s ˜ao func¸ ˜oes;

1.3.1 INDENTAC¸ ˜AO DO C ´ODIGO

Outra coisa importante que devemos ter em mente quando escrevemos um programa ´e aindentac¸ ˜ao do c ´odigo. Trata-se de uma convens ˜ao de escrita de c ´odigos fonte que visa modificar a est ´etica do programa para auxiliar a sua leitura e interpretac¸ ˜ao.

A indentac¸ ˜ao torna a leitura do c ´odigo fonte muito mais f ´acil e facilita a sua modificac¸ ˜ao.

A indentac¸ ˜ao ´e o espac¸amento (ou tabulac¸ ˜ao) colocado antes de comec¸ar a escrever o c ´odigo na linha. Ele tem como objetico indicar a hierarquia do elementos. No nosso exemplo, os comandosprintf,system ereturn

possuem a mesma hierarquia (portanto o mesmo espac¸amento) e est ˜ao todos contidos dentro do comandomain()(da´ı o porqu ˆe do espac¸amento).

(23)

A indentac¸ ˜ao ´e importante pois o nosso exemplo anterior poderia ser es-crito em apenas tr ˆes linhas, sem afetar o seu desempenho, mas com um alto grau de dificuldade de leitura para o programador:

Programa sem indentac¸ ˜ao

1 # include <s t d i o . h> 2 # include <s t d l i b . h>

3 i n t main ( ){p r i n t f ( ‘ ‘ H e l l o World \n ’ ’ ) ; system ( ‘ ‘ pause ’ ’ ) ;r e t u r n 0 ;}

1.3.2 COMENT ´ARIOS

Um coment ´ario, como seu pr ´oprio nome diz, ´e um trecho de texto inclu´ıdo dentro do programa para descrever alguma coisa, por exemplo, o que aquele pedac¸o do programa faz. Os coment ´arios n ˜ao modificam o fun-cionamento do programa pois s ˜ao ignorados pelo compilador e servem, portanto, apenas para ajudar o programador a organizar o seu c ´odigo.

Um coment ´ario pode ser adicionado em qualquer parte do c ´odigo. Para tanto, a linguagem C permite fazer coment ´arios de duas maneiras diferen-tes: por linha ou por bloco.

• Se o programador quiser comentar uma ´unica linha do c ´odigo, basta adicionar // na frente da linha. Tudo o que vier na linha depois do // ser ´a considerado como coment ´ario e ser ´a ignorado pelo compilador.

• Se o programador quiser comentar mais de uma linha do c ´odigo, isto ´e, um bloco de linhas, basta adicionar/*no comec¸o da primeira linha de coment ´ario e*/no final da ´ultima linha de coment ´ario. Tudo o que vier depois do s´ımbolo de /*e antes do */ ser ´a considerado como coment ´ario e ser ´a ignorado pelo compilador.

(24)

Exemplo: coment ´arios no programa

1 # include <s t d i o . h> 2 # include <s t d l i b . h> 3 i n t main ( ){

4 /∗ 5 Escreve 6 na 7 t e l a 8 ∗/

9 p r i n t f ( ‘ ‘ H e l l o World \n ’ ’ ) ; 10 / / f a z uma pausa no programa 11 system ( ‘ ‘ pause ’ ’ ) ;

12 r e t u r n 0 ; 13 }

Outro aspecto importante do uso dos coment ´arios ´e que eles permitem fa-zer a documentac¸ ˜ao interna de um programa, ou seja, permitem descrever o que cada bloco de comandos daquele programa faz. A documentac¸ ˜ao ´e uma tarefa extremamente importante no desenvolvimento e manutenc¸ ˜ao de um programa, mas muitas vezes ignoradas.

Os coment ´arios dentro de um c ´odigo permitem que um programador en-tenda muito mais rapidamente um c ´odigo que nunca tenha visto ou que ele relembre o que faz um trecho de c ´odigo a muito tempo implementado por ele. Al ´em disso, saber o que um determinado trecho de c ´odigo realmente faze aumenta as possibilidades de reutiliz ´a-lo em outras aplicac¸ ˜oes.

1.4 BIBLIOTECAS E FUNC¸ ˜OES ´UTEIS DA LINGUAGEM C

1.4.1 O COMANDO #INCLUDE

O comando #include ´e utilizado para declarar as bibliotecas que ser ˜ao utilizadas pelo programa.

Uma biblioteca ´e um arquivo contendo um conjunto de func¸ ˜oes (pedac¸os de c ´odigo) j ´a implementados e que po-dem ser utilizados pelo programador em seu programa.

(25)

O comando#includepermite duas sintaxes:

#include<nome da biblioteca>: o pr ´e-processador procurar ´a pela biblioteca nos caminhos de procura pr ´e-especificados do compilador. Usa-se essa sintaxe quando estamos incluindo uma biblioteca que ´e pr ´opria do sistema, como as biblotecasstdio.hestdlib.h;

#includenome da biblioteca”: o pr ´e-processador procurar ´a pela biblioteca no mesmo diret ´orio onde se encontra o nosso programa. Podemos ainda optar por informar o nome do arquivo com o caminho completo, ou seja, em qual diret ´orio ele se encontra e como chegar at ´e l ´a.

De modo geral, os arquivos de bibliotecas na linguagem C s ˜ao terminados com a extens ˜ao.h.

Abaixo temos dois exemplos do uso do comando#include:

#include<stdio.h>

#include“D:\Programas\soma.h”

Na primeira linha, o comando#include´e utilizado para adicionar uma bibli-oteca do sistema: stdio.h(que cont ´em as func¸ ˜oes de leitura do teclado e escrita em tela). J ´a na segunda linha, o comando ´e utilizado para adicionar uma biblioteca de nomesoma.h, localizada no diret ´orio “D:\Programas\”.

1.4.2 FUNC¸ ˜OES DE ENTRADA E SA´IDA: STDIO.H

Operac¸ ˜oes em arquivos

remove: apaga o arquivo

rename: renomeia o arquivo

Acesso a arquivos

fclose: fecha o arquivo

(26)

fopen: abre o arquivo

setbuf: controla o fluxo de armazenamento em buffer

Entrada/sa´ıda formatadas

fprintf: grava uma sa´ıda formatada em arquivo

fscanf: l ˆe dados formatados a partir de arquivo

printf: imprime dados formatados na sa´ıda padr ˜ao (monitor)

scanf: l ˆe dados formatados da entrada padr ˜ao (teclado)

sprintf: grava dados formatados em uma string

sscanf: l ˆe dados formatados a partir de uma string

Entrada/sa´ıda de caracteres

fgetc: l ˆe um caractere do arquivo

fgets: l ˆe uma string do arquivo

fputc: escreve um caractere em arquivo

fputs: escreve uma string em arquivo

getc: l ˆe um caractere do arquivo

getchar: l ˆe um caractere da entrada padr ˜ao (teclado)

gets: l ˆe uma string da entrada padr ˜ao (teclado)

putc: escreve um caractere na sa´ıda padr ˜ao (monitor)

putchar: escreve um caractere na sa´ıda padr ˜ao (monitor)

puts: escreve uma string na sa´ıda padr ˜ao (monitor)

ungetc: retorna um caractere lido para o arquivo dele

Entrada/sa´ıda direta

fread: l ˆe um bloco de dados do arquivo

(27)

Posicionamento no arquivo

fgetpos: retorna a posic¸ ˜ao atual no arquivo

fseek: reposiciona o indicador de posic¸ ˜ao do arquivo

fsetpos: configura o indicador de posic¸ ˜ao do arquivo

ftell: retorna a posic¸ ˜ao atual no arquivo

rewind: reposiciona o indicador de posic¸ ˜ao do arquivo para o in´ıcio do arquivo

Tratamento de erros

clearerr: limpa os indicadores de erro

feof: indicador de fim-de-arquivo

ferror: indicador de checagem de erro

perror: impress ˜ao de mensagem de erro

Tipos e macros

FILE: tipo que cont ´em as informac¸ ˜oes para controlar um arquivo

EOF: constante que indica o fim-de-arquivo

NULL: ponteiro nulo

1.4.3 FUNC¸ ˜OES DE UTILIDADE PADR ˜AO: STDLIB.H

Convers ˜ao de strings

atof: converte string para double

atoi: converte string para inteiro

atol: converte string para inteiro longo

strtod: converte string para double e devolve um ponteiro para o pr ´oximo double contido na string

(28)

strtoul: converte string para inteiro longo sem sinal e devolve um ponteiro para o pr ´oximo inteiro longo sem sinal contido na string

Gerac¸ ˜ao de seq ¨u ˆencias pseudo-aleat ´orias

rand: gera n ´umero aleat ´orio

srand: inicializa o gerador de n ´umeros aleat ´orios

Gerenciamento de mem ´oria din ˆamica

malloc: aloca espac¸o para um array na mem ´oria

calloc: aloca espac¸o para um array na mem ´oria e inicializa com ze-ros

free: libera o espac¸o alocado na mem ´oria

realloc: modifica o tamanho do espac¸o alocado na mem ´oria

Ambiente do programa

abort: abortar o processo atual

atexit: define uma func¸ ˜ao a ser executada no t ´ermino normal do programa

exit: finaliza o programa

getenv: retorna uma vari ´avel de ambiente

system: executa um comando do sistema

Pesquisa e ordenac¸ ˜ao

bsearch: pesquisa bin ´aria em um array

qsort: ordena os elementos do array

Aritm ´etica de inteiro

abs: valor absoluto

div: divis ˜ao inteira

labs: valor absoluto de um inteiro longo

(29)

1.4.4 FUNC¸ ˜OES MATEM ´ATICAS: MATH.H

Func¸ ˜oes trigonom ´etricas

cos: calcula o cosseno de um ˆangulo em radianos

sin: calcula o seno de um ˆangulo em radianos

tan: calcula a tangente de um ˆangulo em radianos

acos: calcula o arco cosseno

asin: calcula o arco seno

atan: calcula o arco tangente

atan2: calcula o arco tangente com dois par ˆametros

Func¸ ˜oes hiperb ´olicas

cosh: calcula o cosseno hiperb ´olico de um ˆangulo em radianos

sinh: calcula o seno hiperb ´olico de um ˆangulo em radianos

tanh: calcula a tangente hiperb ´olica de um ˆangulo em radianos

Func¸ ˜oes exponenciais e logar´ıtmicas

exp: func¸ ˜ao exponencial

log: logaritmo natural

log10: logaritmo comum (base 10)

modf: quebra um n ´umero em partes fracion ´arias e inteira

Func¸ ˜oes de pot ˆencia

pow: retorna a base elevada ao expoente

sqrt: raiz quadrada de um n ´umero

Func¸ ˜oes de arredondamento, valor absoluto e outras

(30)

fabs: calcula o valor absoluto de um n ´umero

floor: arredonda para baixo um n ´umero

fmod: calcula o resto da divis ˜ao

1.4.5 TESTES DE TIPOS DE CARACTERES: CTYPE.H

isalnum: verifica se o caractere ´e alfanum ´erico

isalpha: verifica se o caractere ´e alfab ´etico

iscntrl: verifica se o caractere ´e um caractere de controle

isdigit: verifica se o caractere ´e um d´ıgito decimal

islower: verifica se o caractere ´e letra min ´uscula

isprint: verifica se caractere ´e imprim´ıvel

ispunct: verifica se ´e um caractere de pontuac¸ ˜ao

isspace: verifica se caractere ´e um espac¸o em branco

isupper: verifica se o caractere ´e letra mai ´uscula

isxdigit: verifica se o caractere ´e d´ıgito hexadecimal

tolower: converte letra mai ´uscula para min ´uscula

toupper: converte letra min ´uscula para mai ´uscula

1.4.6 OPERAC¸ ˜OES EM STRING: STRING.H

C ´opia

memcpy: c ´opia de bloco de mem ´oria

memmove: move bloco de mem ´oria

strcpy: c ´opia de string

strncpy: c ´opia de caracteres da string

(31)

strcat: concatenac¸ ˜ao de strings

strncat: adiciona “n” caracteres de uma string no final de outra string

Comparac¸ ˜ao

memcmp: compara dois blocos de mem ´oria

strcmp: compara duas strings

strncmp: compara os “n” caracteres de duas strings

Busca

memchr: localiza caractere em bloco de mem ´oria

strchr: localiza primeira ocorr ˆencia de caractere em uma string

strcspn: retorna o n ´umero de caracteres lidos de uma string antes da primeira ocorr ˆencia de uma segunda string

strpbrk: retorna um ponteiro para a primeira ocorr ˆencia na string de qualquer um dos caracteres de uma segunda string

strrchr: retorna um ponteiro para a ´ultima ocorr ˆencia do caratere na string

strspn: retorna o comprimento da string que consiste s ´o de caracte-res que fazem parte de uma outra string

strtok: divide uma string em sub-strings com base em um caractere

Outras

memset: preenche bloco de mem ´oria com valor especificado

strerror: retorna o ponteiro para uma string de mensagem de erro

strlen: comprimento da string

1.4.7 FUNC¸ ˜OES DE DATA E HORA: TIME.H

(32)

clock: retorna o n ´umero de pulsos de clock decorrido desde que o programa foi lanc¸ado

difftime: retorna a diferenc¸a entre dois tempos

mktime: converte uma estrutura tm para o tipo time t

time: retorna o tempo atual do calend ´ario como um time t

Convers ˜ao

asctime: converte uma estrutura tm para string

ctime: converte um valor time t para string

gmtime: converte um valor time t para estrutura tm como tempo UTC

localtime: converte um valor time t para estrutura tm como hora local

strftime: formata tempo para string

Tipos e macros

clock t: tipo capaz de representar as contagens clock e suportar operac¸ ˜oes aritm ´eticas

size t: tipo inteiro sem sinal

time t: tipo capaz de representar os tempos e suportar operac¸ ˜oes aritm ´eticas

struct tm: estrutura contendo uma data e hora dividida em seus com-ponentes

(33)

2 MANIPULANDO DADOS, VARI ´AVEIS E EXPRESS ˜OES EM C

2.1 VARI ´AVEIS

Na matem ´atica, uma vari ´avel ´e uma entidade capaz de representar um valor ou express ˜ao. Ela pode representar um n ´umero ou um conjunto de n ´umeros, como na equac¸ ˜ao

x2

+ 2x+ 1 = 0

ou na func¸ ˜ao

f(x) =x2

Na computac¸ ˜ao, uma vari ´avel ´e uma posic¸ ˜ao de mem ´oria onde poderemos guardar um determinado dado ou valor e modific ´a-lo ao longo da execuc¸ ˜ao do programa. Em linguagem C, a declarac¸ ˜ao de uma vari ´avel pelo progra-mador segue a seguinte forma geral:

tipo da variavelnome da variavel;

Otipo da variavel determina o conjunto de valores e de operac¸ ˜oes que uma vari ´avel aceita, ou seja, que ela pode executar. J ´a onome da variavel

´e como o programador identifica essa vari ´avel dentro do programa. Ao nome que da vari ´avel o computador associa o enderec¸o do espac¸o que ele reservou na mem ´oria para guardar essa vari ´avel.

Depois declarac¸ ˜ao de uma vari ´avel ´e necess ´ario colocar um ponto e v´ırgula (;).

Isso ´e necess ´ario uma vez que o ponto e v´ırgula ´e utilizado para separar as instruc¸ ˜oes que comp ˜oem um programa de computador.

DECLARANDO VARI ´AVEIS

Uma vari ´avel do tipo inteiro pode ser declarada como apresentado a se-guir:

(34)

Al ´em disso, mais de uma vari ´avel pode ser declarada para um mesmo tipo. Para tanto, basta separar cada nome de vari ´avel por umav´ırgula(,):

intx,y,z;

Uma vari ´avel deve ser declarada antes de ser usada no programa.

Lembre-se, apenas quando declaramos uma vari ´avel ´e que o computador reserva um espac¸o de mem ´oria para guardarmos nossos dados.

Antes de usar o conte ´udo de uma vari ´avel, tenha certeza de que o mesmo foi atribu´ıdo antes.

1 # include <s t d i o . h> 2 # include <s t d l i b . h> 3 i n t main ( ){

4 i n t x ;

5 p r i n t f ( ‘ ‘ x = %d\n ’ ’ , x ) ; 6 x = 5 ;

7 p r i n t f ( ‘ ‘ x = %d\n ’ ’ , x ) ; 8 system ( ‘ ‘ pause ’ ’ ) ; 9 r e t u r n 0 ;

10 }

Sa´ıda x = qualquer valor x = 5

Quando falamos de mem ´oria do computador n ˜ao existe o conceito de posic¸ ˜ao de mem ´oria “vazia”. A posic¸ ˜ao pode apenas n ˜ao estar sendo utili-zada. Cada posic¸ ˜ao de mem ´oria do computador est ´a preenchida com um conjunto de 0’s e 1’s. Portanto, ao criarmos uma vari ´avel, ela automatica-mente estar ´a preenchida com um valor chamado de “lixo”.

2.1.1 NOMEANDO UMA VARI ´AVEL

(35)

ele reservou na mem ´oria para guardar essa vari ´avel. De modo geral, inte-ressa ao programador saber o nome das vari ´aveis. Por ´em, existem algu-mas regras para a escolha dos nomes das vari ´aveis na linguagem C.

• O nome de uma vari ´avel ´e um conjunto de caracteres que podem ser letras, n ´umeros ou underscores"_";

• O nome de uma vari ´avel deve sempre iniciar com uma letra ou o underscore"_".

Na linguagem C, letras mai ´usculas e min ´usculas s ˜ao con-sideradas diferentes.

A linguagem C ´ecase-sensitive, ou seja, uma palavra escrita utilizando

caracteres mai ´usculos ´e diferente da mesma palavra escrita com carac-teres min ´usculos. Sendo assim, as palavrasSoma,somaeSOMAs ˜ao consideradas diferentes para a linguagem C e representamTR ˆESvari ´aveis distintas.

Palavras chaves n ˜ao podem ser usadas como nomes de vari ´aveis.

As palavras chaves s ˜ao um conjunto de 38 palavras reservadas dentro da linguagem C. S ˜ao elas que formam a sintaxe da linguagem de programac¸ ˜ao C. Essas palavras j ´a possuem func¸ ˜oes espec´ıficas dentro da linguagem de programac¸ ˜ao e, por esse motivo, elas n ˜ao podem ser utilizadas para outro fim como, por exemplo, nomes de vari ´aveis. Abaixo, tem-se uma lista com as 38 palavras reservadas da linguagem C.

lista de palavras chaves da linguagem C

auto double int struct break else long switch case enum if typeof continue float return while union const for short unsigned char extern signed

void default do sizeof volatile goto register static

(36)

Exemplo: nomeando vari ´aveis

comp! .var int .var 1cont -x Va-123

cont Cont Va 123 teste int1 cont1 x&

2.1.2 DEFININDO O TIPO DE UMA VARI ´AVEL

Vimos anteriormente que o tipo de uma vari ´avel determina o conjunto de valores e de operac¸ ˜oes que uma vari ´avel aceita, ou seja, que ela pode executar. A linguagem C possui um total de cinco tipos de dados b ´asicos. S ˜ao eles:

Tipo Bits Intervalo de valores

char 8 -128 A 127

int 32 -2.147.483.648 A 2.147.483.647

float 32 1,175494E-038 A 3,402823E+038

double 64 2,225074E-308 A 1,797693E+308

void 8 sem valor

O TIPO CHAR

Comecemos pelo tipochar. Esse tipo de dados permite armazenar em um ´unico byte (8 bits) um n ´umero inteiro muito pequeno ou o c ´odigo de um caractere do conjunto de caracteres da tabelaASCII:

charc = ‘a’;

charn = 10;

Caracteres sempre ficam entre ‘aspas simples’!

Lembre-se: uma ´unica letra pode ser o nome de uma vari ´avel. As ‘aspas simples’ permitem que o compilador saiba que estamos inicializando nossa vari ´avel com uma letra e n ˜ao com o conte ´udo de outra vari ´avel.

(37)

O segundo tipo de dado ´e o tipo inteiro: int. Esse tipo de dados permite armazenar um n ´umero inteiro (sem parte fracion ´aria). Seu tamanho de-pende do processador em que o programa est ´a rodando, e ´e tipicamente 16 ou 32 bits:

intn = 1459;

Cuidado com a forma com que voc ˆe inicializa as vari ´aveis dos tiposchareint.

Na linguagem C, os tipos char e int podem ser especificados nas ba-ses decimal(padr ˜ao), octalou hexadecimal. A base decimal ´e a base padr ˜ao. Por ´em, se o valor inteiro for precedido por:

• “0”, ele ser ´a interpretado como octal. Nesse caso, o valor deve ser definido utilizando os digitos de 0, 1, 2, 3, 4, 5, 6 e 7. Ex:intx = 044; Nesse caso, 044 equivale a 36 (4∗81

+ 4∗80

);

• “0x” ou “0X”, ele ser ´a interpretado como hexadecimal. Nesse caso, o valor deve ser definido utilizando os digitos de 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9, e as letras A (10), B (11), C (12), D (13), E (14) e F (15). Ex: int

y = 0x44; Nesse caso, 0x44 equivale a 68 (4∗161

+ 4∗160

);

OS TIPOS FLOAT E DOUBLE

O terceiro e quarto tipos de dados s ˜ao os tipos reais:floatedouble. Esses tipos de dados permitem armazenar um valor real (com parte fracion ´aria), tamb ´em conhecido como ponto flutuante. A diferenc¸a entre eles ´e de precis ˜ao:

• tipofloat: precis ˜ao simples;

• tipo double: dupla precis ˜ao. S ˜ao ´uteis quando queremos trabalhar com intervalos de n ´umeros reais realmente grandes.

Em n ´umeros reais, a parte decimal usa ponto e n ˜ao v´ırgula!

(38)

floatf = 5.25;

doubled = 15.673;

Pode-se escrever n ´umeros dos tiposfloatedoubleusando notac¸ ˜ao cient´ıfica.

Anotac¸ ˜ao cient´ıfica ´e uma forma de escrever n ´umeros extremamente

gran-des ou extremamente pequenos. Nesse caso, o valor real ´e seguido por uma letra “e” ou “E” e um n ´umero inteiro (positivo ou negativo) que indica o expoente da base 10 (representado pela letra “e” ou “E” que multiplica o n ´umero):

doublex = 5.0e10;

equivale a

doublex = 50000000000;

O TIPO VOID

Por fim, temos o tipo void. Esse tipo de dados permite declarar uma func¸ ˜ao que n ˜ao retorna valor ou um ponteiro gen ´erico, como ser ´a visto nas pr ´oximas sec¸ ˜oes.

A linguagem C n ˜ao permite que se declare uma vari ´avel do tipo void. Esse tipo de dados s ´o deve ser usado para declarar func¸ ˜oes que n ˜ao retornam valor ou ponteiros gen ´erico.

OS MODIFICADORES DE TIPOS

Al ´em desses cinco tipos b ´asicos, a linguagem C possui quatro modifica-dores de tipos. Eles s ˜ao aplicados precedendo os tipos b ´asicos (com a excec¸ ˜ao do tipo void), e eles permitem alterar o significado do tipo, de modo a adequ ´a-lo `as necessidades do nosso programa. S ˜ao eles:

signed: determina que a vari ´avel declarada dos tipos char ou int

ter ´a valores positivos ou negativos. Esse ´e o padr ˜ao da linguagem. Exemplo:

signed charx;

(39)

unsigned: determina que a vari ´avel declarada dos tipos char ou

int s ´o ter ´a valores positivos. Nesse caso, a vari ´avel perde o seu o bit de sinal, o que aumenta a sua capacidade de armazenamento. Exemplo:

unsigned charx;

unsigned inty;

short: determina que a vari ´avel do tipo int ter ´a 16 bits (inteiro pe-queno), independente do processador. Exemplo:

short inti;

long: determina que a vari ´avel do tipointter ´a 32 bits (inteiro grande), independente do processador. Tamb ´em determina que o tipodouble

possua maior precis ˜ao. Exemplo:

long intn;

long doubled;

A linguagem C permite que se utilize mais de um modifica-dor de tipo sobre um mesmo tipo.

Desse modo, podemos declarar um inteiro grande (long) e sem sinal (unsigned), o que aumenta em muito o seu intervalo de valores pos´ıveis:

unsigned long intm;

(40)

Tipo Bits Intervalo de valores

char 8 -128 A 127

unsigned char 8 0 A 255 signed char 8 -128 A 127

int 32 -2.147.483.648 A 2.147.483.647 unsigned int 32 0 A 4.294.967.295

signed int 32 -32.768 A 32.767 short int 16 -32.768 A 32.767 unsigned short int 16 0 A 65.535

signed short int 16 -32.768 A 32.767

long int 32 -2.147.483.648 A 2.147.483.647 unsigned long int 32 0 A 4.294.967.295

signed long int 32 -2.147.483.648 A 2.147.483.647 float 32 1,175494E-038 A 3,402823E+038 double 64 2,225074E-308 A 1,797693E+308 long double 96 3,4E-4932 A 3,4E+4932

2.2 LENDO E ESCREVENDO DADOS

2.2.1 PRINTF

A func¸ ˜aoprintf() ´e uma das func¸ ˜oes de sa´ıda/escrita de dados da lingua-gem C. Seu nome vem da express ˜ao em ingl ˆes print formatted, ou seja, escrita formatada. Basicamente, a func¸ ˜aoprintf()escreve na sa´ıda de vi-deo (tela) um conjunto de valores, caracteres e/ou sequ ˆencia de caracteres de acordo com o formato especificado. A forma geral da func¸ ˜aoprintf() ´e:

printf(“tipos de sa´ıda”, lista de vari ´aveis)

A func¸ ˜aoprintf()recebe 2 par ˆametros de entrada

“tipos de sa´ıda”: conjunto de caracteres que especifica o formato dos dados a serem escritos e/ou o texto a ser escrito;

lista de vari ´aveis: conjunto de nomes de vari ´aveis, separados por v´ırgula, que ser ˜ao escritos.

ESCREVENDO UMA MENSAGEM DE TEXTO

(41)

verdade. A func¸ ˜ao printf() pode ser usada quando queremos escrever apenas um texto simples na tela:

ESCREVENDO VALORES FORMATADOS

Quando queremos escrever dados formatados na tela usamos a forma ge-ral da func¸ ˜ao, a qual possui ostipos de sa´ıda. Eles especificam o formato de sa´ıda dos dados que ser ˜ao escritos pela func¸ ˜aoprintf(). Cada tipo de sa´ıda ´e precedido por um sinal de % e um tipo de sa´ıda deve ser especi-ficado para cada vari ´avel a ser escrita. Assim, se quissessemos escrever uma ´unica express ˜ao com o camandoprintf(), fariamos

Se fossem duas as express ˜oes a serem escritas, fariamos

e assim por diante. Note que os formatos e as express ˜oes a serem escri-tas com aquele formato devem ser especificados na mesma ordem, como mostram as setas.

O comando printf() n ˜ao exige o s´ımbolo & na frente do nome de cada var ´avel.

Diferente do comandoscanf(), o comandoprintf()n ˜ao exige o s´ımbolo & na frente do nome de uma vari ´avel que ser ´a escrita na tela. Se usado, ele possui outro significado (como ser ´a visto mais adiante) e n ˜ao exibe o conte ´udo da vari ´avel.

(42)

Alguns “tipos de sa´ıda”

%c escrita de um caractere %d ou %i escrita de n ´umeros inteiros

%u escrita de n ´umeros inteiros sem sinal %f escrita de n ´umero reais

%s escrita de v ´arios caracteres

%p escrita de um enderec¸o de mem ´oria %e ou %E escrita em notac¸ ˜ao cientif´ıca

Abaixo, tem-se alguns exemplos de escrita de dados utilizando o comando

printf(). Nesse momento n ˜ao se preocupe com o ‘\n’ que aparece dentro do comandoprintf(), pois ele serve apenas para ir para uma nova linha ao final do comando:

Exemplo: escrita de dados na linguagem C

1 # include <s t d i o . h> 2 # include <s t d l i b . h> 3 i n t main ( ){

4 i n t x = 1 0 ;

5 / / E s c r i t a de um v a l o r i n t e i r o 6 p r i n t f ( ‘ ‘ % d\n ’ ’ , x ) ;

7 f l o a t y = 5 . 0 ;

8 / / E s c r i t a de um v a l o r i n t e i r o e o u t r o r e a l 9 p r i n t f ( ‘ ‘ % d%f\n ’ ’ , x , y ) ;

10 / / Adicionando espac¸o e n t r e os v a l o r e s 11 p r i n t f ( ‘ ‘ % d %f\n ’ ’ , x , y ) ;

12 system ( ‘ ‘ pause ’ ’ ) ; 13 r e t u r n 0 ;

14 }

Sa´ıda 10

105.000000 10 5.000000

No exemplo acima, os comandos

printf(“%d%f\n”,x,y); e

printf(“%d %f\n”,x,y);

(43)

Junto ao tipo de sa´ıda, pode-se adicionar texto e n ˜ao ape-nas espac¸os.

1 # include <s t d i o . h> 2 # include <s t d l i b . h> 3 i n t main ( ){

4 i n t x = 1 0 ;

5 p r i n t f ( ‘ ‘ T o t a l = %d\n ’ ’ , x ) ; 6 p r i n t f ( ‘ ‘ % d c a i x a s\n ’ ’ , x ) ;

7 p r i n t f ( ‘ ‘ T o t a l de %d c a i x a s\n ’ ’ , x ) ; 8 system ( ‘ ‘ pause ’ ’ ) ;

9 r e t u r n 0 ; 10 }

Sa´ıda Total = 10 10 caixas

Total de 10 caixas

Isso permite que o comandoprintf()seja usado para escrever n ˜ao apenas dados, mas sentenc¸as que fac¸am sentido para o usu ´ario do programa.

2.2.2 PUTCHAR

A func¸ ˜aoputchar()(put character) permite escrever um ´unico caractere na tela. Sua forma geral ´e:

intputchar(intcaractere)

A func¸ ˜ao putchar() recebe como par ˆametro de entrada um ´unico valor inteiro. Esse valor ser ´a convertido para caractere e mostrado na tela. A func¸ ˜ao retorna

• Se N ˆAO ocorrer um erro: o pr ´oprio caractere que foi escrito;

(44)

Exemplo: putchar()

1 # include <s t d i o . h> 2 # include <s t d l i b . h> 3 i n t main ( ){

4 char c = ’ a ’ ; 5 i n t x = 6 5 ; 6 p u t c h a r ( c ) ; 7 p u t c h a r ( ’\n ’ ) ; 8 p u t c h a r ( x ) ; 9 p u t c h a r ( ’\n ’ ) ; 10 system ( ‘ ‘ pause ’ ’ ) ; 11 r e t u r n 0 ;

12 }

Sa´ıda a A

Perceba, no exemplo acima, que a convers ˜ao na linguagem C ´e direta no momento da impress ˜ao, ou seja, o valor 65 ´e convertido para o caractere ASCII correspondente, no caso, o caractere “A”. Al ´em disso, o comando putchar() tamb ´em aceita o uso de seq ¨u ˆencias de escape como o caractere ‘\n’ (nova linha).

2.2.3 SCANF

A func¸ ˜aoscanf()´e uma das func¸ ˜oes de entrada/leitura de dados da lingua-gem C. Seu nome vem da express ˜ao em ingl ˆesscan formatted, ou seja, leitura formatada. Basicamente, a func¸ ˜ao scanf() l ˆe do teclado um con-junto de valores, caracteres e/ou sequ ˆencia de caracteres de acordo com o formato especificado. A forma geral da func¸ ˜aoscanf() ´e:

scanf(“tipos de entrada”, lista de vari ´aveis)

A func¸ ˜aoscanf()recebe 2 par ˆametros de entrada

“tipos de entrada”: conjunto de caracteres que especifica o formato dos dados a serem lidos;

(45)

Ostipo de entradaespecificam o formato de entrada dos dados que ser ˜ao lidos pela func¸ ˜aoscanf(). Cada tipo de entrada ´e precedido por um sinal de % e um tipo de entrada deve ser especificado para cada vari ´avel a ser lida. Assim, se quissessemos ler uma ´unica vari ´avel com o camando scanf(), fariamos

Se fossem duas as vari ´aveis a serem lidas, fariamos

e assim por diante. Note que os formatos e as vari ´aveis que armazenar ˜ao o dado com aquele formato devem ser especificados na mesma ordem, como mostram as setas.

Na linguagem C, ´e necess ´ario colocar o s´ımbolo de & antes do nome de cada vari ´avel a ser lida pelo comandoscanf().

Trata-se de uma exig ˆencia da linguagem C. Todas as vari ´aveis que rece-ber ˜ao valores do teclado por meio dascanf()dever ˜ao ser passadas pelos seus enderec¸os. Isso se faz colocando o operador de enderec¸o “&” antes do nome da vari ´avel.

A func¸ ˜ao scanf() pode ser usada para ler virtualmente qualquer tipo de dado. No entando, ela ´e usada com mais freq ¨uencia para a leitura de n ´umeros inteiros e/ou de ponto flutuante (n ´umeros reais). A tabela abaixo mostra alguns dos tipos de entrada suportados pela linguagem:

Alguns “tipos de entrada”

%c leitura de um caractere %d ou %i leitura de n ´umeros inteiros

%f leitura de n ´umero reais %s leitura de v ´arios caracteres

Abaixo, tem-se alguns exemplos de leitura de dados utilizando o comando

(46)

Exemplo: leitura de dados na linguagem C

1 # include <s t d i o . h> 2 # include <s t d l i b . h> 3 i n t main ( ){

4 i n t x , z ; 5 f l o a t y ;

6 / / L e i t u r a de um v a l o r i n t e i r o 7 s c a n f ( ‘ ‘ % d ’ ’ ,& x ) ;

8 / / L e i t u r a de um v a l o r r e a l 9 s c a n f ( ‘ ‘ % f ’ ’ ,& y ) ;

10 / / L e i t u r a de um v a l o r i n t e i r o e o u t r o r e a l 11 s c a n f ( ‘ ‘ % d%f ’ ’ ,& x ,& y ) ;

12 / / L e i t u r a de d o i s v a l o r e s i n t e i r o s 13 s c a n f ( ‘ ‘ % d%d ’ ’ ,& x ,& z ) ;

14 / / L e i t u r a de d o i s v a l o r e s i n t e i r o s com espac¸o 15 s c a n f ( ‘ ‘ % d %d ’ ’ ,& x ,& z ) ;

16 system ( ‘ ‘ pause ’ ’ ) ; 17 r e t u r n 0 ;

18 }

No exemplo acima, os comandos

scanf(“%d%d”,&x,&z);

e

scanf(“%d %d”,&x,&z);

s ˜ao equivalentes. Isso ocorre por que o comandoscanf()ignora os espac¸os em branco entre os tipos de entrada. Al ´em disso, quando o comando

scanf() ´e usado para ler dois ou mais valores, podemos optar por duas formas de digitar os dados no teclado:

• Digitar um valor e, em seguida, pressionar a teclaENTERpara cada valor digitado;

(47)

O comandoscanf()ignora apenas os espac¸os em branco entre os tipos de entrada. Qualquer outro caractere in-serido entre os tipos de dados dever ´a ser digitado pelo usu ´ario, mas ser ´a descartado pelo programa.

1 # include <s t d i o . h> 2 # include <s t d l i b . h> 3 i n t main ( ){

4 i n t dia , mes , ano ;

5 / / L e i t u r a de t r ˆe s v a l o r e s i n t e i r o s 6 / / com b a r r a s e n t r e e l e s

7 s c a n f ( ‘ ‘ % d/%d/%d ’ ’ ,& dia ,&mes,& ano ) ; 8 system ( ‘ ‘ pause ’ ’ ) ;

9 r e t u r n 0 ; 10 }

Isso permite que o comando scanf()seja usado para receber dados for-matados como, por exemplo, uma data: dia/m ˆes/ano. No exemplo acima, o comandoscanf() ´e usado para a entrada de tr ˆes valores inteiros sepa-rados por uma barra “/” cada. Quando o usu ´ario for digitar os tr ˆes valores, ele ser ´a obrigado a digitar os tr ˆes valores separados por barra (as barras ser ˜ao descartadas e n ˜ao interferem nos dados). Do contr ´ario, o comando

scanf()n ˜ao ir ´a ler corretamente os dados digitados.

2.2.4 GETCHAR

A func¸ ˜aogetchar() (get character) permite ler um ´unico caractere do te-clado. Sua forma geral ´e:

intputchar(void)

A func¸ ˜aogetchar()n ˜ao recebe par ˆametros de entrada. A func¸ ˜ao retorna

• Se N ˆAO ocorrer um erro: o c ´odigo ASCII do caractere lido;

(48)

Exemplo: getchar()

1 # include <s t d i o . h> 2 # include <s t d l i b . h> 3 i n t main ( ){

4 char c ;

5 c = g e t c h a r ( ) ;

6 p r i n t f ( ‘ ‘ C a r a c t e r e : %c\n ’ ’ , c ) ; 7 p r i n t f ( ‘ ‘ Codigo ASCII : %d\n ’ ’ , c ) ; 8 system ( ‘ ‘ pause ’ ’ ) ;

9 r e t u r n 0 ; 10 }

Perceba, no exemplo acima, que a convers ˜ao na linguagem C ´e direta no momento da leitura, ou seja, embora a func¸ ˜ao retorne um valor do tipo

int, pode-se atribuir para uma vari ´avel do tipo char devido a convers ˜ao autom ´atica da linguagem C.

2.3 ESCOPO: TEMPO DE VIDA DA VARI ´AVEL

Quando declararamos uma vari ´avel, vimos que ´e preciso sempre definir o seu tipo(conjunto de valores e de operac¸ ˜oes que uma vari ´avel aceita) e

nome(como o programador identifica essa vari ´avel dentro do programa). Por ´em, al ´em disso, ´e preciso definir o seuescopo.

O escopo ´e o conjunto de regras que determinam o uso e a validade das vari ´aveis ao longo do programa.

Em outras palavras, escopo de uma vari ´avel define onde e quando a vari ´avel pode ser usada. Esse escopo est ´a intimamente ligado com o local de declarac¸ ˜ao dessa vari ´avel e por esse motivo ele pode ser: global ou

local.

ESCOPO GLOBAL

Uma vari ´avel global ´e declarada fora de todas as func¸ ˜oes do programa, ou seja, na ´area de declarac¸ ˜oes globais do programa (acima da cl ´ausula

(49)

Vari ´aveis globais podem ser acessadas e alteradas em qualquer parte do programa.

1 # include <s t d i o . h> 2 # include <s t d l i b . h>

3 i n t x = 5 ;/ / v a r i ´a v e l g l o b a l 4 void i n c r ( ){

5 x ++;/ / acesso a v a r i ´a v e l g l o b a l 6 }

7 i n t main ( ){

8 p r i n t f ( ‘ ‘ x = %d\n ’ ’ , x ) ;/ / acesso a v a r i ´a v e l g l o b a l

9 i n c r ( ) ;

10 p r i n t f ( ‘ ‘ x = %d\n ’ ’ , x ) ;/ / acesso a v a r i ´a v e l g l o b a l

11 system ( ‘ ‘ pause ’ ’ ) ; 12 r e t u r n 0 ;

13 }

Sa´ıda x = 5 x = 6

Na figura abaixo, ´e poss´ıvel ter uma boa representac¸ ˜ao de onde comec¸a e termina cada escopo do c ´odigo anterior:

(50)

De modo geral, evita-se o uso de vari ´aveis globais em um programa.

As vari ´aveis globais devem ser evitadas porque qualquer parte do pro-grama pode alter ´a-la. Isso torna mais dif´ıcil a manutenc¸ ˜ao do propro-grama, pois fica dif´ıcil saber onde ele ´e inicializada, para que serve, etc. Al ´em disso, vari ´aveis globais ocupam mem ´oria durante todo o tempo de execuc¸ ˜ao do programa e n ˜ao apenas quando elas s ˜ao necess ´arias.

ESCOPO LOCAL

J ´a uma vari ´avel local ´e declarada dentro de um bloco de comandos de-limitado pelo operador de chaves {}(escopo local). Essas vari ´aveis s ˜ao vis´ıveis apenas no interior do bloco de comandos onde ela foi declarada, ou seja,dentro do seu escopo.

Um bloco comec¸a quando abrimos uma chave{e termina quando fechamos a chave}.

1 # include <s t d i o . h> 2 # include <s t d l i b . h> 3 void func1 ( ){

4 i n t x ;/ / v a r i ´a v e l l o c a l 5 }

6 void func2 ( ){

7 i n t x ;/ / v a r i ´a v e l l o c a l 8 }

9 i n t main ( ){ 10 i n t x ;

11 s c a n f ( ‘ ‘ % d ’ ’ ,& x ) ; 12 i f( x == 5 ){ 13 i n t y =1 ;

14 p r i n t f ( ‘ ‘ % d\n ’ ’ , y ) ; 15 }

16 system ( ‘ ‘ pause ’ ’ ) ; 17 r e t u r n 0 ;}

(51)

Note, no exemplo acima, que a vari ´avelx ´e declaradatr ˆes vezes. Cada declarac¸ ˜ao dela est ´a em um bloco de comandos distinto (ou seja, delimi-tado por um operador de chaves{}). Desse modo, apesar de possuiremos o mesmo nome, elas possuem escopos diferentes e, consequentemente, tempos de vida diferentes:uma n ˜ao existe enquanto a outra existe. J ´a a vari ´avely s ´o existe dentro do bloco de comandos pertencente a instruc¸ ˜ao

(52)

Quando um bloco possui uma vari ´avel local com o mesmo nome de uma vari ´avel global, esse bloco dar ´a prefer ˆencia `a vari ´avel local. O mesmo vale para duas vari ´aveis locais em blocos diferentes: a declarac¸ ˜ao mais pr ´oxima tem maior preced ˆencia e oculta as demais vari ´aveis com o mesmo nome.

1 # include <s t d i o . h> 2 # include <s t d l i b . h> 3 i n t x = 5 ;

4 i n t main ( ){

5 p r i n t f ( ‘ ‘ x = %d\n ’ ’ , x ) ; 6 i n t x = 4 ;

7 p r i n t f ( ‘ ‘ x = %d\n ’ ’ , x ) ; 8 {

9 i n t x = 3 ;

10 p r i n t f ( ‘ ‘ x = %d\n ’ ’ , x ) ; 11 }

12 p r i n t f ( ‘ ‘ x = %d\n ’ ’ , x ) ; 13 system ( ‘ ‘ pause ’ ’ ) ; 14 r e t u r n 0 ;

15 }

Sa´ıda x = 5 x = 4 x = 3 x = 4

(53)

Note, no exemplo acima, que a vari ´avelx ´e declaradatr ˆes vezes. Cada declarac¸ ˜ao dela est ´a em um escopo distinto: uma ´e global e duas s ˜ao locais. Na primeira chamada do comandoprintf()(linha 5), a vari ´avel glo-balx ´e acessada. Isso ocorre porque, apesar de estarmos em um escopo local, a segunda vari ´avelx ainda n ˜ao foi criada e portanto n ˜ao existe. J ´a na segunda chamada do comandoprintf()(linha 7), a segunda vari ´avel x j ´a foi criada, ocultando a vari ´avel global de mesmo nome. Por isso, esse comandoprintf()imprime na tela de sa´ıda o valorx = 4. O mesmo acon-tece com a terceira chamada do comando printf() (linha 10): esse co-mando est ´a dentro de um novo bloco de coco-mandos, ou seja, delimitado por um operador de chaves{}. A declarac¸ ˜ao da terceira vari ´avelx oculta a declarac¸ ˜ao da segunda vari ´avelx. Por isso, esse comando printf() im-prime na tela de sa´ıda o valorx = 3. No fim desse bloco de comandos, a terceira vari ´avel x ´e destru´ıda, o que torna novamente vis´ıvel a segunda vari ´avel x, a qual ´e impressa na tela pela quarta chamada do comando

printf()(linha 12).

Como o escopo ´e um assunto delicado e que pode gerar muita confus ˜ao, evita-se o uso de vari ´aveis com o mesmo nome.

2.4 CONSTANTES

(54)

determi-nado dado ou valor na mem ´oria do computador, mas com a certeza de que ele n ˜ao se altera durante a execuc¸ ˜ao do programa: ser ´a sempre o mesmo, portantoconstante.

Para constantes ´e obrigat ´oria a atribuic¸ ˜ao do valor no mo-mento da declarac¸ ˜ao.

Isso ocorre por que ap ´os a declarac¸ ˜ao de uma constante, seu valor n ˜ao po-der ´a mais ser alterado: ser ´aconstante. Na linguagem C existem duas ma-neiras para criar constantes: usando os comandos#defineeconst. Al ´em disso, a pr ´opria linguagem C j ´a possui algumas constantes pr ´e-definidas, como assequ ˆencias de escape.

2.4.1 COMANDO #DEFINE

Uma das maneiras de declarar uma constante ´e usando o comando #de-fine, que segue a seguinte forma geral:

#definenome da constante valor da constante

O comando#define ´e uma diretiva de compilac¸ ˜ao que informa ao compila-dor que ele deve procurar por todas as ocorr ˆencias da palavra definida por

nome da constante e substituir por valor da constante quando o pro-grama for compilado. Por exemplo, uma constante que represente o valor deπ pode ser declarada como apresentado a seguir:

#define PI 3.1415

2.4.2 COMANDO CONST

Uma outra maneira de declarar uma constante ´e usando o comandoconst, que segue a seguinte forma geral:

const tipo da constantenome da constante = valor da constante;

(55)

ao programa que a vari ´avel declarada n ˜ao poder ´a ter seu valor alterado. E, sendo uma vari ´avel, esta constante est ´a sujeita as mesmas regras que regem o uso das vari ´aveis. Por exemplo, uma constante que represente o valor deπ pode ser declarada como apresentado a seguir:

const floatPI = 3.1415;

2.4.3 SEQ ¨U ˆENCIAS DE ESCAPE

A linguagem C possui algumas constantes pr ´e-definidas, como assequ ˆencias de escapeou c ´odigos de barra invertida. Essas constantes As sequ ˆencias de escape permitem o envio de caracteres de controle n ˜ao gr ´aficos para dispositivos de sa´ıda.

A tabela abaixo apresenta uma relac¸ ˜ao das sequ ˆencias de escape mais utilizadas em programac¸ ˜ao e seu significado:

C ´odigo Comando

\a bip

\b retorcesso (backspace)

\n nova linha (new line)

\v tabulac¸ ˜ao vertical

\t tabulac¸ ˜ao horizontal

\r retorno de carro (carriage return)

\’ ap ´ostrofe

\” aspa

\\ barra invertida (backslash)

\f alimentac¸ ˜ao de folha (form feed)

(56)

Exemplo: sequ ˆencias de escape

1 # include <s t d i o . h> 2 # include <s t d l i b . h> 3 i n t main ( ){

4 p r i n t f ( ‘ ‘ H e l l o World\n ’ ’ ) ; 5 p r i n t f ( ‘ ‘ H e l l o\nWorld\n ’ ’ ) ; 6 p r i n t f ( ‘ ‘ H e l l o \\ World\n ’ ’ ) ; 7 p r i n t f ( ‘ ‘\” H e l l o World\”\n ’ ’ ) ; 8 system ( ‘ ‘ pause ’ ’ ) ;

9 r e t u r n 0 ; 10 }

Sa´ıda Hello World Hello World Hello\World “Hello World”

2.5 OPERADORES

2.5.1 OPERADOR DE ATRIBUIC¸ ˜AO: “=”

Uma das operac¸ ˜oes mais utilizadas em programac¸ ˜ao ´e a operac¸ ˜ao de atribuic¸ ˜ao “=”. Ela ´e respons ´avel por armazenar um determinado valor em uma vari ´avel. Em linguagem C, o uso do operador de atribuic¸ ˜ao “=” segue a seguinte forma geral

nome da vari ´avel =express ˜ao;

Por express ˜ao, entende-se qualquer combinac¸ ˜ao de valores, vari ´aveis,

(57)

Exemplo: operador de atribuic¸ ˜ao “=”

1 # include <s t d i o . h> 2 # include <s t d l i b . h> 3 # include <math . h> 4 const i n t z = 9 ; 5 i n t main ( ){ 6 f l o a t x ;

7 / / d e c l a r a y e a t r i b u i um v a l o r 8 f l o a t y = 3 ;

9 / / a t r i b u i um v a l o r a x 10 x = 5 ;

11 p r i n t f ( ‘ ‘ x = %f\n ’ ’ , x ) ; 12 / / a t r i b u i uma c o n s t a n t e a x 13 x = z ;

14 p r i n t f ( ‘ ‘ x = %f\n ’ ’ , x ) ; 15 / / a t r i b u i o r e s u l t a d o de uma 16 / / express ˜ao matem ´atica a x 17 x = y + 5 ;

18 p r i n t f ( ‘ ‘ x = %f\n ’ ’ , x ) ;

19 / / a t r i b u i o r e s u l t a d o de uma func¸ ˜ao a x 20 x = s q r t ( 9 ) ;

21 p r i n t f ( ‘ ‘ x = %f\n ’ ’ , x ) ; 22 system ( ‘ ‘ pause ’ ’ ) ; 23 r e t u r n 0 ;

24 }

Sa´ıda x = 5.000000 x = 9.000000 x = 8.000000 x = 3.000000

(58)

O operador de atribuic¸ ˜ao “=” armazena o valor ou resultado de uma express ˜ao contida a suadireitana vari ´avel espe-cificada a suaesquerda.

1 # include <s t d i o . h> 2 # include <s t d l i b . h> 3 # include <math . h> 4 const i n t z = 9 ; 5 i n t main ( ){ 6 f l o a t x ; 7 f l o a t y = 3 ; 8 / / C o r r e t o 9 x = y + 5 ; 10 / / ERRADO 11 y + 5 = x ; 12 / / C o r r e t o 13 x = 5 ; 14 / / ERRADO 15 5 = x ;

16 system ( ‘ ‘ pause ’ ’ ) ; 17 r e t u r n 0 ;

18 }

´

E importante ter sempre em mente que o operador de atribuic¸ ˜ao “=” cal-cula a express ˜ao `a direita do operador “=” e atribui esse valor `a vari ´avel `a esquerda do operador, nunca o contr ´ario.

A linguagem C suporta m ´ultiplas atribuic¸ ˜oes.

1 # include <s t d i o . h> 2 # include <s t d l i b . h> 3 i n t main ( ){

4 f l o a t x , y , z ; 5 x = y = z = 5 ;

6 p r i n t f ( ‘ ‘ x = %f\n ’ ’ , x ) ; 7 p r i n t f ( ‘ ‘ y = %f\n ’ ’ , y ) ; 8 p r i n t f ( ‘ ‘ z = %f\n ’ ’ , z ) ; 9 system ( ‘ ‘ pause ’ ’ ) ; 10 r e t u r n 0 ;

11 }

(59)

No exemplo acma, o valor 5 ´e copiado para a vari ´avelz. Lembre-se, o valor dadireita ´e sempre armazenado na vari ´avel especificada a suaesquerda. Em seguida, o valor dez ´e copiado para a vari ´avel y e, na sequ ˆencia, o valor dey ´e copiado parax.

A linguagem C tamb ´em permite a atribuic¸ ˜ao entre tipos b ´ascos diferen-tes. O compiladorconverteautomaticamente o valor do lado direto para o tipo do lado esquerdo do comando de atribuic¸ ˜ao “=”. Durante a etapa de convers ˜ao de tipos, pode haver perda de informac¸ ˜ao.

Na convers ˜ao de tipos, durante a atribuic¸ ˜ao, pode haver perda de informac¸ ˜ao.

1 # include <s t d i o . h> 2 # include <s t d l i b . h> 3 i n t main ( ){

4 i n t x = 6 5 ; 5 char ch ;

6 f l o a t f = 2 5 . 1 ;

7 / / ch recebe 8 b i t s menos s i g n i f i c a t i v o s de x 8 / / c o n v e r t e para a t a b e l a ASCII

9 ch = x ;

10 p r i n t f ( ‘ ‘ ch = %c\n ’ ’ , ch ) ;

11 / / x recebe p a r t e apenas a p a r t e i n t e i r a de f 12 x = f ;

13 p r i n t f ( ‘ ‘ x = %d\n ’ ’ , x ) ;

14 / / f recebe v a l o r 8 b i t s c o n v e r t i d o para r e a l 15 f = ch ;

16 p r i n t f ( ‘ ‘ f = %f\n ’ ’ , f ) ; 17 / / f recebe o v a l o r de x 18 f = x ;

19 p r i n t f ( ‘ ‘ f = %f\n ’ ’ , f ) ; 20 system ( ‘ ‘ pause ’ ’ ) ; 21 r e t u r n 0 ;

22 }

Sa´ıda ch = A x = 25

f = 65.000000 f = 25.000000

2.5.2 OPERADORES ARITM ´ETICOS

Os operadores aritm ´eticos s ˜ao aqueles que operam sobre n ´umeros (valores,

(60)

como resultado valores num ´ericos. A linguagem C possui um total de cinco operadores aritm ´eticos, como mostra a tabela abaixo:

Operador Significado Exemplo

+ adic¸ ˜ao de dois valores z = x + y - subtrac¸ ˜ao de dois valores z = x - y * multiplicac¸ ˜ao de dois valores z = x * y / quociente de dois valores z = x / y % resto de uma divis ˜ao z = x % y

Note que os operadores aritm ´eticos s ˜ao sempre usados em conjunto com o operador de atribuic¸ ˜ao. Afinal de contas, algu ´em precisa receber o resul-tado da express ˜ao aritm ´etica.

O operador de subtrac¸ ˜ao tamb ´em pode ser utilizado para inverter o sinal de um n ´umero.

De modo geral, os operadores aritm ´eticos s ˜ao operadores bin ´arios, ou seja, atuam sobre dois valores. Mas os operadores de adic¸ ˜ao e subtrac¸ ˜ao tamb ´em podem ser aplicados sobre um ´unico valor. Nesse caso, eles s ˜ao chamados de operadores un ´arios. Por exemplo, na express ˜ao:

x = -y;

Referências

Documentos relacionados

Para os Clubes com mais de uma equipa num determinado escalão, a divisão dos jogadores por equipa deve constar na Ficha Técnica de Encontro, devendo ser

Em decorrência dos referidos acordos de colaboração, foram tomados 19(dezenove) termos de colaboração de MÔNICA MOURA, 10(dez) de JOÃO SANTANA e 04(quatro) termos

Um estudo comparou os efeitos da Melatonina (5 mg) com os do benzodiazepínico temazepam (10 mg) sobre a desempenho cognitiva. Enquanto o temazepam causou uma indução ao

ATLETA ENTIDADE TOTAL FABIO ORLANDO DA SILVA ASL 6.. TABELA

19 435 PROFESSOR II - INGLÊS 23 3 PROFESSOR II - ESPORTES 34 185 ASSISTENTE II - ADMINISTRATIVO 42 1.244 ASSISTENTE II - CENOTÉCNICO 43 1 ASSISTENTE II - ILUMINACAO 44 1. ASSISTENTE

1.8 O candidato que estiver convocado para mais de um dos cargos, ao optar por realizar sua matrícula no curso de formação profissional em um deles, conforme dispõe o item anterior,

e serviços da empresa; definir um modelo de avaliação global da qualidade, que envolve os objetivos gerais da organização e a contribuição de cada setor, ou área do

Consiste em entrevistar pai, mãe ou responsável para extrair o máximo de informações possíveis sobre o sujeito, realizando uma posterior Análise e levantamento do