CARVALHO, Daniel Balparda de - Apostila de Linguagem C.zip

Apostila Programação - Linguagem C

APOSTILA DE LINGUAGEM C

1997 Daniel Balparda de Carvalho

Engenharia El trica - UFMG

Nenhuma parte deste material pode ser reproduzida ou transmitida de qualquer modo ou por qualquer meio, sem pr via autoriza o do autor e sem lhe ser dado o devido cr dito.

1

Sum rio

1 - INTRODU O . 5 2 - Primeiros Passos. 6 O C "Case Sensitive". 6 Introdu o s Fun es. 8 Introdu o B sica s Entradas e Sa das . 11 Introdu o a Alguns Comandos de Controle de Fluxo . 15 Palavras Reservadas do C . 18 3 - VARI VEIS, CONSTANTES, OPERADORES E EXPRESS ES . 19 Nomes de Vari veis . 19 Dicas quanto aos nomes de vari veis. . 19 Os Tipos do C . 19 Declara o e Inicializa o de Vari veis. 20 Operadores Aritm ticos e de Atribui o. 24 Operadores Relacionais e L gicos . 26 - Operadores L gicos Bit a Bit. 28 Express es. 28 - Express es que Podem ser Abreviadas. 29 - Tabela de Preced ncias do C . 30 Modeladores (Casts) . 31 4 - ESTRUTURAS DE CONTROLE DE FLUXO . 32 O Comando if. 32 - O Operador ?. 35 O Comando switch. 36 O Comando for. 38 O Comando while . 40 O Comando do-while . 41 O Comando break . 42 O Comando goto . 44 5 - MATRIZES E STRINGS . 46 Vetores . 46 Strings . 47 Matrizes. 50 6 PONTEIROS . 54 Declarando e Utilizando Ponteiros. 54 Ponteiros e Vetores . 57 Inicializando Ponteiros. 61 Ponteiros para Ponteiros. 62 Cuidados a Serem Tomados ao se Usar Ponteiros . 63 7 FUN ES. 64 A Fun o. 64 O Comando return. 64 Prot tipos de Fun es . 66 O Tipo void . 67 Arquivos-Cabe alhos . 68 Escopo de Vari veis. 69 Passagem de par metros por valor e passagem por refer ncia. 72 Vetores como Argumentos de Fun es. 74 Os Argumentos argc e argv. 74 Recursividade. 75 Outras Quest es . 76 8 - DIRETIVAS DE COMPILA O. 77 As Diretivas de Compila o. 77 A Diretiva include. 77 As Diretivas define e undef. 77 As Diretivas ifdef e endif . 80 A Diretiva ifndef . 80 A Diretiva if . 80 A Diretiva else . 81 2

A Diretiva elif . 81 9 - Entradas e Sa das Padronizadas. 82 Introdu o . 82 Lendo e Escrevendo Caracteres . 82 Lendo e Escrevendo Strings. 83 Entrada e Sa da Formatada. 84 Abrindo e Fechando um Arquivo. 88 Lendo e Escrevendo Caracteres em Arquivos. 90 Outros Comandos de Acesso a Arquivos . 92 Fluxos Padr o. 97 10 - Tipos de Dados Avan ados. 99 Modificadores de Acesso . 99 Convers o de Tipos. 102 Modificadores de Fun es . 102 Ponteiros para Fun es . 103 Aloca o Din mica . 105 Aloca o Din mica de Vetores e Matrizes . 109 11 - Tipos de Dados Definidos Pelo Usu rio. 112 Estruturas - Primeira parte . 112 Estruturas - Segunda parte . 114 Declara o Union. 117 Enumera es . 119 O Comando sizeof. 119 - O Comando typedef . 120 Uma aplica o de structs: as listas simplesmente encadeadas . 121

3

4

1 - INTRODU O

Vamos, neste curso, aprender os conceitos b sicos da linguagem de programa o C a qual tem se tornado cada dia mais popular, devido sua versatilidade e ao seu poder. Uma das grandes vantagens do C que ele possui tanto caracter sticas de "alto n vel" quanto de "baixo n vel". Apesar de ser bom, n o pr -requisito do curso um conhecimento anterior de linguagens de programa o. importante uma familiaridade com computadores. O que importante que voc tenha vontade de aprender, dedica o ao curso e, caso esteja em uma das turmas do curso, acompanhe atentamente as discuss es que ocorrem na lista de discuss es do curso. O C nasceu na d cada de 70. Seu inventor, Dennis Ritchie, implementou-o pela primeira vez usando um DEC PDP-11 rodando o sistema operacional UNIX. O C derivado de uma outra linguagem: o B, criado por Ken Thompson. O B, por sua vez, veio da linguagem BCPL, inventada por Martin Richards. O C uma linguagem de programa o gen rica que utilizada para a cria o de programas diversos como processadores de texto, planilhas eletr nicas, sistemas operacionais, programas de comunica o, programas para a automa o industrial, gerenciadores de bancos de dados, programas de projeto assistido por computador, programas para a solu o de problemas da Engenharia, F sica, Qu mica e outras Ci ncias, etc . bem prov vel que o Navegador que voc est usando para ler este texto tenha sido escrito em C ou C+. Estudaremos a estrutura do ANSI C, o C padronizado pela ANSI. Veremos ainda algumas fun es comuns em compiladores para alguns sistemas operacionais. Quando n o houver equivalentes para as fun es em outros sistemas, apresentaremos formas alternativas de uso dos comandos. Sugerimos que o aluno realmente use o m ximo poss vel dos exemplos, problemas e exerc cios aqui apresentados, gerando os programas execut veis com o seu compilador. Quando utilizamos o compilador aprendemos a lidar com mensagens de aviso, mensagens de erro, bugs, etc. Apenas ler os exemplos n o basta. O conhecimento de uma linguagem de programa o transcende o conhecimento de estruturas e fun es. O C exige, al m do dom nio da linguagem em si, uma familiaridade com o compilador e experi ncia em achar "bugs" nos programas. importante ent o que o leitor digite, compile e execute os exemplos apresentados.

5

2 - Primeiros Passos

O C "Case Sensitive" Vamos come ar o nosso curso ressaltando um ponto de suma import ncia: o C "Case Sensitive", isto , mai sculas e min sculas fazem diferen a. Se declarar uma vari vel com o nome soma ela ser diferente de Soma, SOMA, SoMa ou sOmA. Da mesma maneira, os comandos do C if e for, por exemplo, s podem ser escritos em min sculas pois sen o o compilador n o ir interpret -los como sendo comandos, mas sim como vari veis. Dois Primeiros Programas Vejamos um primeiro programa em C: include stdio.h /* Um Primeiro Programa */ int main () { printf ("Ola! Eu estou vivo! n"); return(0); } Compilando e executando este programa voc ver que ele coloca a mensagem Ola! Eu estou vivo! na tela. Vamos analisar o programa por partes. A linha include stdio.h diz ao compilador que ele deve incluir o arquivocabe alho stdio.h. Neste arquivo existem declara es de fun es teis para entrada e sa da de dados (std = standard, padr o em ingl s; io = Input/Output, entrada e sa da = stdio = Entrada e sa da padronizadas). Toda vez que voc quiser usar uma destas fun es deve-se incluir este comando. O C possui diversos Arquivos-cabe alho. Quando fazemos um programa, uma boa id ia usar coment rios que ajudem a elucidar o funcionamento do mesmo. No caso acima temos um coment rio: /* Um Primeiro Programa */. O compilador C desconsidera qualquer coisa que esteja come ando com /* e terminando com */. Um coment rio pode, inclusive, ter mais de uma linha. A linha int main() indica que estamos definindo uma fun o de nome main. Todos os programas em C t m que ter uma fun o main, pois esta fun o que ser chamada quando o programa for executado. O conte do da fun o delimitado por chaves { }. O c digo que estiver dentro das chaves ser executado seq encialmente quando a fun o for chamada. A palavra int indica que esta fun o retorna um inteiro. O que significa este retorno ser visto posteriormente, quando estudarmos um pouco mais detalhadamente as fun es do C. A ltima linha do programa, return(0); , indica o n mero inteiro que est sendo retornado pela fun o, no caso o n mero 0.

6

A nica coisa que o programa realmente faz chamar a fun o printf(), passando a string (uma string uma seq ncia de caracteres, como veremos brevemente) "Ola! Eu estou vivo! n" como argumento. por causa do uso da fun o printf() pelo programa que devemos incluir o arquivo- cabe alho stdio.h . A fun o printf() neste caso ir apenas colocar a string na tela do computador. O n uma constante chamada de constante barra invertida. No caso, o n a constante barra invertida de "new line" e ele interpretado como um comando de mudan a de linha, isto , ap s imprimir Ola! Eu estou vivo! o cursor passar para a pr xima linha. importante observar tamb m que os comandos do C terminam com ; . Podemos agora tentar um programa mais complicado: include stdio.h int main () { int Dias; /* Declaracao de Variaveis */ float Anos; printf ("Entre com o n mero de dias: "); /* Entrada de Dados */ scanf ("%d",&Dias); Anos=Dias/365.25; /* Conversao Dias- Anos */ printf (" n n%d dias equivalem a %f anos. n",Dias,Anos); return(0); } Vamos entender como o programa acima funciona. S o declaradas duas vari veis chamadas Dias e Anos. A primeira um int (inteiro) e a segunda um float (ponto flutuante). As vari veis declaradas como ponto flutuante existem para armazenar n meros que possuem casas decimais, como 5,1497. feita ent o uma chamada fun o printf(), que coloca uma mensagem na tela. Queremos agora ler um dado que ser fornecido pelo usu rio e coloc -lo na vari vel inteira Dias. Para tanto usamos a fun o scanf(). A string "%d" diz fun o que iremos ler um inteiro. O segundo par metro passado fun o diz que o dado lido dever ser armazenado na vari vel Dias. importante ressaltar a necessidade de se colocar um & antes do nome da vari vel a ser lida quando se usa a fun o scanf(). O motivo disto s ficar claro mais tarde. Observe que, no C, quando temos mais de um par metro para uma fun o, eles ser o separados por v rgula. Temos ent o uma express o matem tica simples que atribui a Anos o valor de Dias dividido por 365.25 (365.25 uma constante ponto flutuante 365,25). Como Anos uma vari vel float o compilador far uma convers o autom tica entre os tipos das vari veis (veremos isto com detalhes mais tarde). A segunda chamada fun o printf() tem tr s argumentos. A string " n n%d dias equivalem a %f anos. n" diz fun o para pular duas linhas, colocar um inteiro na tela, colocar a mensagem " dias equivalem a ", colocar um valor float na tela, colocar a mensagem " anos." e pular outra linha. Os outros par metros s o as vari veis, Dias e Anos, das quais devem ser lidos os valores do inteiro e do float, respectivamente.

7

AUTO AVALIA O 1 - Veja como voc est . O que faz o seguinte programa? include stdio.h int main() { int x; scanf("%d",&x); printf("%d",x); return(0); } 2 - Compile e execute os programas desta p gina Introdu o s Fun es Uma fun o um bloco de c digo de programa que pode ser usado diversas vezes em sua execu o. O uso de fun es permite que o programa fique mais leg vel, mais bem estruturado. Um programa em C consiste, no fundo, de v rias fun es colocadas juntas. Abaixo o tipo mais simples de fun o: include stdio.h int mensagem () /* Funcao simples: so imprime Ola! */ { printf ("Ola! "); return(0); } int main () { mensagem(); printf ("Eu estou vivo! n"); return(0); } Este programa ter o mesmo resultado que o primeiro exemplo da se o anterior. O que ele faz definir uma fun o mensagem() que coloca uma string na tela e retorna 0. Esta fun o chamada a partir de main() , que, como j vimos, tamb m uma fun o. A diferen a fundamental entre main e as demais fun es do problema que main uma fun o especial, cujo diferencial o fato de ser a primeira fun o a ser executada em um programa. - Argumentos Argumentos s o as entradas que a fun o recebe. atrav s dos argumentos que passamos par metros para a fun o. J vimos fun es com argumentos. As fun es printf() e scanf() s o fun es que recebem argumentos. Vamos ver um outro exemplo simples de fun o com argumentos:

8

include stdio.h int square (int x) /* Calcula o quadrado de x */ { printf ("O quadrado e %d",(x*x)); return(0); } int main () { int num; printf ("Entre com um numero: "); scanf ("%d",&num); printf (" n n"); square(num); return(0); } Na defini o de square() dizemos que a fun o receber um argumento inteiro x. Quando fazemos a chamada fun o, o inteiro num passado como argumento. H alguns pontos a observar. Em primeiro lugar temos de satisfazer aos requisitos da fun o quanto ao tipo e quantidade de argumentos quando a chamamos. Apesar de existirem algumas convers es de tipo, que o C faz automaticamente, importante ficar atento. Em segundo lugar, n o importante o nome da vari vel que se passa como argumento, ou seja, a vari vel num, ao ser passada como argumento para square() copiada para a vari vel x. Dentro de square() trabalha-se apenas com x. Se mudarmos o valor de x dentro de square() o valor de num na fun o main() permanece inalterado. Vamos dar um exemplo de fun o de mais de uma vari vel. Repare que, neste caso, os argumentos s o separados por v rgula e que deve-se explicitar o tipo de cada um dos argumentos, um a um. Note, tamb m, que os argumentos passados para a fun o n o necessitam ser todos vari veis porque mesmo sendo constantes ser o copiados para a vari vel de entrada da fun o. include stdio.h int mult (float a, float b,float c) numeros */ { printf ("%f",a*b*c); return(0); } int main () { float x,y; x=23.5; y=12.9; mult (x,y,3.87); return(0); } /* Multiplica 3

9

- Retornando valores Muitas vezes necess rio fazer com que uma fun o retorne um valor. As fun es que vimos at aqui estavam retornando o n mero 0. Podemos especificar um tipo de retorno indicando-o antes do nome da fun o. Mas para dizer ao C o que vamos retornar precisamos da palavra reservada return. Sabendo disto fica f cil fazer uma fun o para multiplicar dois inteiros e que retorna o resultado da multiplica o. Veja: include stdio.h int prod (int x,int y) { return (x*y); } int main () { int saida; saida=prod (12,7); printf ("A saida e: %d n",saida); return(0); } Veja que, como prod retorna o valor de 12 multiplicado por 7, este valor pode ser usado em uma express o qualquer. No programa fizemos a atribui o deste resultado vari vel saida, que posteriormente foi impressa usando o printf. Uma observa o adicional: se n o especificarmos o tipo de retorno de uma fun o, o compilador C automaticamente supor que este tipo inteiro. Por m, n o uma boa pr tica n o se especificar o valor de retorno e, neste curso, este valor ser sempre especificado. Com rela o fun o main, o retorno sempre ser inteiro. Normalmente faremos a fun o main retornar um zero quando ela executada sem qualquer tipo de erro. Mais um exemplo de fun o, que agora recebe dois floats e tamb m retorna um float: include stdio.h float prod (float x,float y) { return (x*y); } int main () { float saida; saida=prod (45.2,0.0067); printf ("A saida e: %f n",saida); return(0); }

10

- Forma geral Apresentamos aqui a forma geral de uma fun o: tipo de retorno nome da fun o (lista de argumentos) { c digo da fun o } AUTO AVALIA O Veja como voc est . Escreva uma fun o que some dois inteiros e retorne o valor da soma.

Introdu o B sica s Entradas e Sa das

- Caracteres Os caracteres s o um tipo de dado: o char. O C trata os caracteres ('a', 'b', 'x', etc .) como sendo vari veis de um byte (8 bits). Um bit a menor unidade de armazenamento de informa es em um computador. Os inteiros (ints) t m um n mero maior de bytes. Dependendo da implementa o do compilador, eles podem ter 2 bytes (16 bits) ou 4 bytes (32 bits). Isto ser melhor explicado nas pr ximas aulas. Na linguagem C, tamb m podemos usar um char para armazenar valores num ricos inteiros, al m de us -lo para armazenar caracteres de texto. Para indicar um caractere de texto usamos ap strofes. Veja um exemplo de programa que usa caracteres: include stdio.h int main () { char Ch; Ch='D'; printf ("%c",Ch); return(0); } No programa acima, %c indica que printf() deve colocar um caractere na tela. Como vimos anteriormente, um char tamb m usado para armazenar um n mero inteiro. Este n mero conhecido como o c digo ASCII correspondente ao caractere. Veja o programa abaixo: include stdio.h int main () { char Ch; Ch='D'; printf ("%d",Ch); return(0); }

/* Imprime o caracter como inteiro */

Este programa vai imprimir o n mero 68 na tela, que o c digo ASCII correspondente ao caractere 'D' (d mai sculo).

11

Muitas vezes queremos ler um caractere fornecido pelo usu rio. Para isto as fun es mais usadas, quando se est trabalhando em ambiente DOS ou Windows, s o getch() e getche(). Ambas retornam o caractere pressionado. getche() imprime o caractere na tela antes de retorn -lo e getch() apenas retorna o caractere pressionado sem imprim -lo na tela. Ambas as fun es podem ser encontradas no arquivo de cabe alho conio.h. Geralmente estas fun es n o est o dispon veis em ambiente Unix (compiladores cc e gcc), pois n o fazem parte do padr o ANSI. Podem ser substitu das pela fun o scanf(), por m sem as mesmas funcionalidades. Eis um exemplo que usa a fun o getch(), e seu correspondente em ambiente Unix: include stdio.h include conio.h /* Este programa usa conio.h . Se voc n o tiver a conio, ele n o funcionar no Unix */ int main () { char Ch; Ch=getch(); printf ("Voce pressionou a tecla %c",Ch); return(0); } Equivalente ANSI-C para o ambiente Unix do programa acima, sem usar getch(): include stdio.h int main () { char Ch; scanf("%c", &Ch); printf ("Voce pressionou a tecla %c",Ch); return(0); } A principal diferen a da vers o que utiliza getch() para a vers o que n o utiliza getch() que no primeiro caso o usu rio simplesmente aperta a tecla e o sistema l diretamente a tecla pressionada. No segundo caso, necess rio apertar tamb m a tecla ENTER . Lembre-se que, se voc quiser manter a portabilidade de seus programas, n o deve utilizar as fun es getch e getche, pois estas n o fazem parte do padr o ANSI C ! - Strings No C uma string um vetor de caracteres terminado com um caractere nulo. O caracter nulo um caractere com valor inteiro igual a zero (c digo ASCII igual a 0). O terminador nulo tamb m pode ser escrito usando a conven o de barra invertida do C como sendo ' 0'. Embora o assunto vetores seja discutido posteriormente, veremos aqui os fundamentos necess rios para que possamos utilizar as strings. Para declarar uma string, podemos usar o seguinte formato geral: char nome da string[tamanho]; Isto declara um vetor de caracteres (uma string) com n mero de posi es igual a tamanho. Note que, como temos que reservar um caractere para ser o terminador nulo,

12

temos que declarar o comprimento da string como sendo, no m nimo, um caractere maior que a maior string que pretendemos armazenar. Vamos supor que declaremos uma string de 7 posi es e coloquemos a palavra Jo o nela. Teremos: J o a o 0 . . No caso acima, as duas c lulas n o usadas t m valores indeterminados. Isto acontece porque o C n o inicializa vari veis, cabendo ao programador esta tarefa. Portanto as nicas c lulas que s o inicializadas s o as que cont m os caracteres 'J', 'o', 'a', 'o' e ' 0' . Se quisermos ler uma string fornecida pelo usu rio podemos usar a fun o gets(). Um exemplo do uso desta fun o apresentado abaixo. A fun o gets() coloca o terminador nulo na string, quando voc aperta a tecla "Enter". include stdio.h int main () { char string[100]; printf ("Digite uma string: "); gets (string); printf (" n nVoce digitou %s",string); return(0); } Neste programa, o tamanho m ximo da string que voc pode entrar uma string de 99 caracteres. Se voc entrar com uma string de comprimento maior, o programa ir aceitar, mas os resultados podem ser desastrosos. Veremos porque posteriormente. Como as strings s o vetores de caracteres, para se acessar um determinado caracter de uma string, basta "indexarmos", ou seja, usarmos um ndice para acessarmos o caracter desejado dentro da string. Suponha uma string chamada str. Podemos acessar a segunda letra de str da seguinte forma: str[1] = 'a'; Por qu se est acessando a segunda letra e n o a primeira? Na linguagem C, o ndice come a em zero. Assim, a primeira letra da string sempre estar na posi o 0. A segunda letra sempre estar na posi o 1 e assim sucessivamente. Segue um exemplo que imprimir a segunda letra da string "Joao", apresentada acima. Em seguida, ele mudar esta letra e apresentar a string no final. include stdio.h int main() { char str[10] = "Joao"; printf(" n nString: %s", str); printf(" nSegunda letra: %c", str[1]); str[1] = 'U'; printf(" nAgora a segunda letra eh: %c", str[1]); printf(" n nString resultante: %s", str); return(0); }

13

Nesta string, o terminador nulo est na posi o 4. Das posi es 0 a 4, sabemos que temos caracteres v lidos, e portanto podemos escrev -los. Note a forma como inicializamos a string str com os caracteres 'J' 'o' 'a' 'o' e ' 0' simplesmente declarando char str[10] = "Joao". Veremos, posteriormente que "Joao" (uma cadeia de caracteres entre aspas) o que chamamos de string constante, isto , uma cadeia de caracteres que est pr -carregada com valores que n o podem ser modificados. J a string str uma string vari vel, pois podemos modificar o que nela est armazenado, como de fato fizemos. No programa acima, %s indica que printf() deve colocar uma string na tela. Vamos agora fazer uma abordagem inicial s duas fun es que j temos usado para fazer a entrada e sa da. - printf A fun o printf() tem a seguinte forma geral: printf (string de controle,lista de argumentos); Teremos, na string de controle, uma descri o de tudo que a fun o vai colocar na tela. A string de controle mostra n o apenas os caracteres que devem ser colocados na tela, mas tamb m quais as vari veis e suas respectivas posi es. Isto feito usando-se os c digos de controle, que usam a nota o %. Na string de controle indicamos quais, de qual tipo e em que posi o est o as vari veis a serem apresentadas. muito importante que, para cada c digo de controle, tenhamos um argumento na lista de argumentos. Apresentamos agora alguns dos c digos %: C digo %d %f %c %s % Significado Inteiro Float Caractere String Coloca na tela um %

Vamos ver alguns exemplos de printf() e o que eles exibem: printf ("Teste % %") - "Teste % %" printf ("%f",40.345) - "40.345" printf ("Um caractere %c e um inteiro %d",'D',120) - "Um caractere D e um inteiro 120" printf ("%s e um exemplo","Este") - "Este e um exemplo" printf ("%s%d%","Juros de ",10) - "Juros de 10%" Maiores detalhes sobre a fun o printf() (incluindo outros c digos de controle) ser o vistos posteriormente, mas podem ser consultados de antem o pelos interessados.

14

- scanf O formato geral da fun o scanf() : scanf (string-de-controle,lista-de-argumentos); Usando a fun o scanf() podemos pedir dados ao usu rio. Um exemplo de uso, pode ser visto acima. Mais uma vez, devemos ficar atentos a fim de colocar o mesmo n mero de argumentos que o de c digos de controle na string de controle. Outra coisa importante lembrarmos de colocar o & antes das vari veis da lista de argumentos. imposs vel justificar isto agora, mas veremos depois a raz o para este procedimento. Maiores detalhes sobre a fun o scanf() ser o vistos posteriormente, mas podem ser consultados de antem o pelos interessados.

AUTO AVALIA O Veja como voc est : a) Escreva um programa que leia um caracter digitado pelo usu rio, imprima o caracter digitado e o c digo ASCII correspondente a este caracter. b) Escreva um programa que leia duas strings e as coloque na tela. Imprima tamb m a segunda letra de cada string. Introdu o a Alguns Comandos de Controle de Fluxo Os comandos de controle de fluxo s o aqueles que permitem ao programador alterar a sequ ncia de execu o do programa. Vamos dar uma breve introdu o a dois comandos de controle de fluxo. Outros comandos ser o estudados posteriormente. - if O comando if representa uma tomada de decis o do tipo "SE isto ENT O aquilo". A sua forma geral : if (condi o) declara o; A condi o do comando if uma express o que ser avaliada. Se o resultado for zero a declara o n o ser executada. Se o resultado for qualquer coisa diferente de zero a declara o ser executada. A declara o pode ser um bloco de c digo ou apenas um comando. interessante notar que, no caso da declara o ser um bloco de c digo, n o necess rio (e nem permitido) o uso do ; no final do bloco. Isto uma regra geral para blocos de c digo. Abaixo apresentamos um exemplo:

15

include stdio.h int main () { int num; printf ("Digite um numero: "); scanf ("%d",&num); if (num 10) printf (" n nO numero e maior que 10"); if (num=10) { printf (" n nVoce acertou! n"); printf ("O numero e igual a 10."); } if (num 10) printf (" n nO numero e menor que 10"); return (0); } No programa acima a express o num 10 avaliada e retorna um valor diferente de zero, se verdadeira, e zero, se falsa. No exemplo, se num for maior que 10, ser impressa a frase: "O n mero e maior que 10". Repare que, se o n mero for igual a 10, estamos executando dois comandos. Para que isto fosse poss vel, tivemos que agrupalos em um bloco que se inicia logo ap s a compara o e termina ap s o segundo printf. Repare tamb m que quando queremos testar igualdades usamos o operador = e n o =. Isto porque o operador = representa apenas uma atribui o. Pode parecer estranho primeira vista, mas se escrev ssemos if (num=10) . /* Isto esta errado */

o compilador iria atribuir o valor 10 vari vel num e a express o num=10 iria retornar 10, fazendo com que o nosso valor de num fosse modificado e fazendo com que a declara o fosse executada sempre. Este problema gera erros frequentes entre iniciantes e, portanto, muita aten o deve ser tomada. Os operadores de compara o s o: = (igual), != (diferente de), (maior que), (menor que), = (maior ou igual), = (menor ou igual). - for O loop (la o) for usado para repetir um comando, ou bloco de comandos, diversas vezes, de maneira que se possa ter um bom controle sobre o loop. Sua forma geral : for (inicializa o;condi o;incremento) declara o; A declara o no comando for tamb m pode ser um bloco ({ } ) e neste caso o ; omitido. O melhor modo de se entender o loop for ver de que maneira ele funciona "por dentro". O loop for equivalente a se fazer o seguinte: inicializa o; if (condi o) { declara o; incremento; "Volte para o comando if" }

16

Podemos ver que o for executa a inicializa o incondicionalmente e testa a condi o. Se a condi o for falsa ele n o faz mais nada. Se a condi o for verdadeira ele executa a declara o, o incremento e volta a testar a condi o. Ele fica repetindo estas opera es at que a condi o seja falsa. Abaixo vemos um programa que coloca os primeiros 100 n meros na tela: include stdio.h int main () { int count; for (count=1;count =100;count=count+1) printf ("%d ",count); return(0); } Outro exemplo interessante mostrado a seguir: o programa l uma string e conta quantos dos caracteres desta string s o iguais letra 'c' include stdio.h int main () { char string[100]; /* String, ate' 99 caracteres */ int i, cont; printf(" n nDigite uma frase: "); gets(string); /* Le a string */ printf(" n nFrase digitada: n%s", string); cont = 0; for (i=0; string[i] != ' 0'; i=i+1) { if ( string[i] = 'c' ) /* Se for a letra 'c' */ cont = cont +1; /*Incrementa o contador de caracteres */ } printf(" nNumero de caracteres c = %d", cont); return(0); } Note o teste que est sendo feito no for: o caractere armazenado em string[i] comparado com ' 0' (caractere final da string). Caso o caractere seja diferente de ' 0', a condi o verdadeira e o bloco do for executado. Dentro do bloco existe um if que testa se o caractere igual a 'c'. Caso seja, o contador de caracteres c incrementado.

Mais um exemplo, agora envolvendo caracteres: /* Este programa imprime o alfabeto: letras mai sculas */ include stdio.h int main() { char letra; for(letra = 'A' ; letra = 'Z' ; letra =letra+1) printf("%c ", letra); }

17

Este programa funciona porque as letras mai sculas de A a Z possuem c digo inteiro sequencial. AUTO AVALIA O Veja como voc est . a) Explique porque est errado fazer if (num=10) . O que ir acontecer? b) Escreva um programa que coloque os n meros de 1 a 100 na tela na ordem inversa (come ando em 100 e terminando em 1). c) Escreva um programa que leia uma string, conte quantos caracteres desta string s o iguais a 'a' e substitua os que forem iguais a 'a' por 'b'. O programa deve imprimir o n mero de caracteres modificados e a string modificada. Coment rios Como j foi dito, o uso de coment rios torna o c digo do programa mais f cil de se entender. Os coment rios do C devem come ar com /* e terminar com */. O C padr o n o permite coment rios aninhados (um dentro do outro), mas alguns compiladores os aceitam. AUTO AVALIA O Veja como voc est : Escreva coment rios para os programas dos exerc cios j realizados.

Palavras Reservadas do C

Todas as linguagens de programa o t m palavras reservadas. As palavras reservadas n o podem ser usadas a n o ser nos seus prop sitos originais, isto , n o podemos declarar fun es ou vari veis com os mesmos nomes. Como o C "case sensitive" podemos declarar uma vari vel For, apesar de haver uma palavra reservada for, mas isto n o uma coisa recomend vel de se fazer pois pode gerar confus o. Apresentamos a seguir as palavras reservadas do ANSI C. Veremos o significado destas palavras chave medida em que o curso for progredindo: 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

18

3 - VARI VEIS, CONSTANTES, OPERADORES E EXPRESS ES

Nomes de Vari veis As vari veis no C podem ter qualquer nome se duas condi es forem satisfeitas: o nome deve come ar com uma letra ou sublinhado ( ) e os caracteres subsequentes devem ser letras, n meros ou sublinhado ( ). H apenas mais duas restri es: o nome de uma vari vel n o pode ser igual a uma palavra reservada, nem igual ao nome de uma fun o declarada pelo programador, ou pelas bibliotecas do C. Vari veis de at 32 caracteres s o aceitas. Mais uma coisa: bom sempre lembrar que o C "case sensitive" e portanto deve-se prestar aten o s mai sculas e min sculas. Dicas quanto aos nomes de vari veis.

uma pr tica tradicional do C, usar letras min sculas para nomes de vari veis e mai sculas para nomes de constantes. Isto facilita na hora da leitura do c digo; Quando se escreve c digo usando nomes de vari veis em portugu s, evita-se poss veis conflitos com nomes de rotinas encontrados nas diversas bibliotecas, que s o em sua maioria absoluta, palavras em ingl s.

Os Tipos do C O C tem 5 tipos b sicos: char, int, float, void, double. Destes n o vimos ainda os dois ltimos: O double o ponto flutuante duplo e pode ser visto como um ponto flutuante com muito mais precis o. O void o tipo vazio, ou um "tipo sem tipo". A aplica o deste "tipo" ser vista posteriormente. Para cada um dos tipos de vari veis existem os modificadores de tipo. Os modificadores de tipo do C s o quatro: signed, unsigned, long e short. Ao float n o se pode aplicar nenhum e ao double pode-se aplicar apenas o long. Os quatro modificadores podem ser aplicados a inteiros. A inten o que short e long devam prover tamanhos diferentes de inteiros onde isto for pr tico. Inteiros menores (short) ou maiores (long). int normalmente ter o tamanho natural para uma determinada m quina. Assim, numa m quina de 16 bits, int provavelmente ter 16 bits. Numa m quina de 32, int dever ter 32 bits. Na verdade, cada compilador livre para escolher tamanhos adequados para o seu pr prio hardware, com a nica restri o de que shorts ints e ints devem ocupar pelo menos 16 bits, longs ints pelo menos 32 bits, e short int n o pode ser maior que int, que n o pode ser maior que long int. O modificador unsigned serve para especificar vari veis sem sinal. Um unsigned int ser um inteiro que assumir apenas valores positivos. A seguir est o listados os tipos de dados permitidos e seu valores m ximos e m nimos em um compilador t pico para um hardware de 16 bits. Tamb m nesta tabela est especificado o formato que deve ser utilizado para ler os tipos de dados com a fun o scanf():

19

Tipo

char unsigned char signed char int unsigned int signed int short int unsigned short int signed short int long int signed long int unsigned long int float double long double

Formato Num de bits para leitura com scanf

8 8 8 16 16 16 16 16 16 32 32 32 32 64 80 %c %c %c %i %u %i %hi %hu %hi %li %li %lu %f %lf %Lf

Intervalo Inicio

-128 0 -128 -32.768 0 -32.768 -32.768 0 -32.768 -2.147.483.648 -2.147.483.648 0 3,4E-38 1,7E-308 3,4E-4932

Fim

127 255 127 32.767 65.535 32.767 32.767 65.535 32.767 2.147.483.647 2.147.483.647 4.294.967.295 3.4E+38 1,7E+308 3,4E+4932

O tipo long double o tipo de ponto flutuante com maior precis o. importante observar que os intervalos de ponto flutuante, na tabela acima, est o indicados em faixa de expoente, mas os n meros podem assumir valores tanto positivos quanto negativos.

Declara o e Inicializa o de Vari veis As vari veis no C devem ser declaradas antes de serem usadas. A forma geral da declara o de vari veis : tipo da vari vel lista de vari veis; As vari veis da lista de vari veis ter o todas o mesmo tipo e dever o ser separadas por v rgula. Como o tipo default do C o int, quando vamos declarar vari veis int com algum dos modificadores de tipo, basta colocar o nome do modificador de tipo. Assim um long basta para declarar um long int. Por exemplo, as declara es char ch, letra; long count; float pi; declaram duas vari veis do tipo char (ch e letra), uma variavel long int (count) e um float pi. H tr s lugares nos quais podemos declarar vari veis. O primeiro fora de todas as fun es do programa. Estas vari veis s o chamadas vari veis globais e podem ser usadas a partir de qualquer lugar no programa. Pode-se dizer que, como elas est o fora de todas as fun es, todas as fun es as v em. O segundo lugar no qual se pode

20

declarar vari veis no in cio de um bloco de c digo. Estas vari veis s o chamadas locais e s t m validade dentro do bloco no qual s o declaradas, isto , s a fun o qual ela pertence sabe da exist ncia desta vari vel, dentro do bloco no qual foram declaradas. O terceiro lugar onde se pode declarar vari veis na lista de par metros de uma fun o. Mais uma vez, apesar de estas vari veis receberem valores externos, estas vari veis s o conhecidas apenas pela fun o onde s o declaradas. Veja o programa abaixo: include stdio.h int contador; int func1(int j) { /* aqui viria o c digo da funcao . */ } int main() { char condicao; int i; for (i=0; i 100; i=i+1) { /* Bloco do for */ float f2; /* etc . . */ func1(i); } /* etc . */ return(0); } A vari vel contador uma vari vel global, e acess vel de qualquer parte do programa. As vari veis condi o e i, s existem dentro de main(), isto s o vari veis locais de main. A vari vel float f2 um exemplo de uma vari vel de bloco, isto , ela somente conhecida dentro do bloco do for, pertencente fun o main. A vari vel inteira j um exemplo de declara o na lista de par metros de uma fun o (a fun o func1).

As regras que regem onde uma vari vel v lida chamam-se regras de escopo da vari vel. H mais dois detalhes que devem ser ressaltados. Duas vari veis globais n o podem ter o mesmo nome. O mesmo vale para duas vari veis locais de uma mesma fun o. J duas vari veis locais, de fun es diferentes, podem ter o mesmo nome sem perigo algum de conflito. Podemos inicializar vari veis no momento de sua declara o. Para fazer isto podemos usar a forma geral tipo da vari vel nome da vari vel = constante;

21

Isto importante pois quando o C cria uma vari vel ele n o a inicializa. Isto significa que at que um primeiro valor seja atribu do nova vari vel ela tem um valor indefinido e que n o pode ser utilizado para nada. Nunca presuma que uma vari vel declarada vale zero ou qualquer outro valor. Exemplos de inicializa o s o dados abaixo : char ch='D'; int count=0; float pi=3.141; Ressalte-se novamente que, em C, uma vari vel tem que ser declarada no in cio de um bloco de c digo. Assim, o programa a seguir n o v lido em C (embora seja v lido em C+). int main() { int i; int j; j = 10; int k = 20; /* Esta declaracao de vari vel n o v lida, pois n o est sendo feita no in cio do bloco */ return(0); } AUTO AVALIA O Veja como voc est : Escreva um programa que declare uma vari vel inteira global e atribua o valor 10 a ela. Declare outras 5 vari veis inteiras locais ao programa principal e atribua os valores 20, 30, ., 60 a elas. Declare 6 vari veis caracteres e atribua a elas as letras c, o, e, l, h, a . Finalmente, o programa dever imprimir, usando todas as vari veis declaradas: As vari veis inteiras contem os n meros: 10,20,30,40,50,60 O animal contido nas vari veis caracteres e' a coelha

Constantes Constantes s o valores que s o mantidos fixos pelo compilador. J usamos constantes neste curso. S o consideradas constantes, por exemplo, os n meros e caracteres como 45.65 ou 'n', etc. - Constantes dos tipos b sicos Abaixo vemos as constantes relativas aos tipos b sicos do C:

22

Tipo de Dado char int long int short int unsigned int float double

Exemplos de Constantes 'b' ' n' ' 0' 2 32000 -130 100000 -467 100 -30 50000 35678 0.0 23.7 -12.3e-10 12546354334.0 -0.0000034236556

- Constantes hexadecimais e octais Muitas vezes precisamos inserir constantes hexadecimais (base dezesseis) ou octais (base oito) no nosso programa. O C permite que se fa a isto. As constantes hexadecimais come am com 0x. As constantes octais come am em 0. Alguns exemplos: Constante 0xEF 0x12A4 03212 034215432 Tipo Constante Hexadecimal (8 bits) Constante Hexadecimal (16 bits) Constante Octal (12 bits) Constante Octal (24 bits)

Nunca escreva portanto 013 achando que o C vai compilar isto como se fosse 13. Na linguagem C 013 diferente de 13! - Constantes strings J mostramos como o C trata strings. Vamos agora alertar para o fato de que uma string "Joao" na realidade uma constante string. Isto implica, por exemplo, no fato de que 't' diferente de "t", pois 't' um char enquanto que "t" uma constante string com dois chars onde o primeiro 't' e o segundo ' 0'. - Constantes de barra invertida O C utiliza, para nos facilitar a tarefa de programar, v rios c digos chamados c digos de barra invertida. Estes s o caracteres que podem ser usados como qualquer outro. Uma lista com alguns dos c digos de barra invertida dada a seguir:

23

C digo b f n t " ' 0 v a N xN

Significado Retrocesso ("back") Alimenta o de formul rio ("form feed") Nova linha ("new line") Tabula o horizontal ("tab") Aspas Ap strofo Nulo (0 em decimal) Barra invertida Tabula o vertical Sinal sonoro ("beep") Constante octal (N o valor da constante) Constante hexadecimal (N o valor da constante)

Operadores Aritm ticos e de Atribui o Os operadores aritm ticos s o usados para desenvolver opera es matem ticas. A seguir apresentamos a lista dos operadores aritm ticos do C: Operador + * / % + -A o Soma (inteira e ponto flutuante) Subtra o ou Troca de sinal (inteira e ponto flutuante) Multiplica o (inteira e ponto flutuante) Divis o (inteira e ponto flutuante) Resto de divis o (de inteiros) Incremento (inteiro e ponto flutuante) Decremento (inteiro e ponto flutuante)

O C possui operadores un rios e bin rios. Os un rios agem sobre uma vari vel apenas, modificando ou n o o seu valor, e retornam o valor final da vari vel. Os bin rios usam duas vari veis e retornam

Comentários


Compartilhe

1667 visitas | 285 downloads

Avaliações

Silmar
19/03/2007

Conteúdo relacionado