1. Introdução a Linguagem C 1.1 História Entre 1969 e 1973, Dennis Ritchie inventou a linguagem C e foi o primeiro a implementá-la usando um computador DEC PDP-11, que utilizava o sistema operacional Unix. Essa linguagem é resultante de um processo evolutivo de linguagens. O marco inicial foi uma linguagem chamada BCPL, desenvolvida por Martin Richards, que teve forte influência em uma linguagem denominada B, inventada por Ken Thompson. Na década de 1970, B levou ao desenvolvimento de C. Em 1973, a linguagem C tinha se tornado suficientemente poderosa para que grande parte do núcleo do Unix, originalmente escrito na linguagem de programação PDP-11/20 Assembly, fosse reescrito em C. Durante alguns anos, o padrão da linguagem C foi aquele fornecido com a versão 5 do sistema operacional Unix. Em 1978, Ritchie e Kernighan publicaram a primeira edição do livro The C Programming Language. Esse livro conhecido pelos programadores de C como "K&R", serviu durante muitos anos como uma especificação informal da linguagem. Devido a popularização dos microcomputadores, várias implementações de C foram criadas, gerando, assim, muitas discrepâncias. Para resolver tal situação, o " American National Standards Institute" - ANSI estabeleceu, em 1983, um comitê para definir um padrão que guiasse todas as implementações da linguagem C. Esta versão da linguagem é referenciada como C ANSI. Em 1990, o padrão C ANSI, após sofrer modificações menores, foi adotado pela Organização Internacional de Padrões (ISO) como ISO/IEC 9899:1990. Um dos objetivos do processo de padronização C ANSI foi o de produzir um sobreconjunto do C K&R, incorporando muitas das características não oficiais subsequentemente introduzidas. Entretanto, muitos programas tinham sido escritos e que não compilavam em certas plataformas, ou com um certo compilador, devido ao uso de bibliotecas de funções não padrão e ao fato de alguns compiladores não aderirem ao C ANSI. A linguagem C++ é uma extensão da linguagem C. As instruções que fazem parte desta última representam um subconjunto da primeira. Os incrementos encontrados na linguagem C++ foram feitos para dar suporte à programação orientada a objetos. A sintaxe desta linguagem é basicamente a mesma da linguagem C. 1
1.2 Conceitos básicos O objetivo desta seção é instruir o leitor na compreensão das principais estruturas, comandos e funções da linguagem C. Um programa em C tem a seguinte estrutura: //Inclusão das bibliotecas //Declaração de variáveis globais - opcional //Declaração de funções - opcional int main() //estrutura principal do programa dentro das suas chaves são chamadas todas as funções e variáveis utilizada no programa. //declaração de variáveis //código Outros conceitos interessantes - indica início de um bloco de nível indica fim de um bloco de nível // - comentar uma linha /* - início do comentário de múltiplas linhas */ - final do comentário de múltiplas linhas ; - necessário no final de toda linha que represente: instrução, atribuição e declaração. Bibliotecas mais utilizadas stdio.h contem os comandos básicos de entrada e saída do programa stdlib.h contem os comandos básicos da linguagem C conio.h geralmente é utilizada em programas básicos para utilizar a função getch(); utilizado para colocar o programa em modo de espera da próxima ação do usuário, muito útil para visualizar os resultados de um programa. math.h contem os comandos matemáticos mais avançados, por exemplo, cálculo de potências, pow(número, potência). Para inserir uma biblioteca no código C, basta inserir a seguinte linha: #include <nomebiblioteca.h> Por exemplo: #include <stdio.h> #include <conio.h> Declaração dos principais tipos de variáveis int para variáveis numéricas (números inteiros). Ex.: int a,b,c; float para variáveis numéricas (números flutuantes, ou seja, com casas decimais). Ex.: float a,b,c; double para variáveis numéricas (números flutuantes, ou seja, com casas decimais), com uma precisão maior que o float. Ex.: double a,b,c; char para variáveis do tipo caractere. Ex.: char nome; 2
Tipos de variáveis Tipo Faixa de valores Tamanho(aproximado) char -128 a 127 8 bits unsigned char 0 a 255 8 bits int -32.768 a 32767 16 bits unsigned int 0 a 65.535 16 bits short int -32.768 a 32767 16 bits long -2.147.483.648 a 2.147.483.647 32 bits unsigned long 0 a 4.294.967.295 32 bits float 3.4 x 10-38 a 3.4 x 10 38 32 bits double 1.7 x 10-308 a 1.7 x 10 308 64 bits long double 3.4 x 10-4932 a 1.1 x 10 4932 80 bits Comandos de entrada O comando de entrada é utilizado para receber dados digitados pelo usuário. Os dados recebidos são armazenados em variáveis. Os comandos de entrada mais utilizados na linguagem C são gets e scanf. Exemplo gets(a); scanf( %t, &a); Nota: este comando busca o endereço da variável por isto é necessário inserir o símbolo &. Obs.: para os comandos de entrada e saída são utilizadas as variáveis %t, sendo que "t" pode ser: inteiro: %d ou %i float: %f ou limitando o número de casas decimais %.2f double: %d char: %c ou %s para uma cadeia de caracteres Comandos de saída O comando de saída é utilizado para mostrar dados na tela ou na impressora. Os comando de saída mais utilizado é o printf. Exemplo printf( Texto para o usuário %t, a); Comandos utilizados na saída. \t - insere uma tabulação \n - insere uma quebra de linha Operadores e funções predefinidas em C Lógico Operador Exemplo Comentário && x>5 && x<10 E x>5 x<10 Ou!!(x>5 x<10) Não (negação) 3
Aritméticos Operador Exemplo Comentário = x = y O conteúdo da variável y é atribuído à variável x. (Poder ser atribuído a uma variável o conteúdo de outra variável, uma constate, ou ainda o resultado de uma função. + - x+y x-y Soma o conteúdo de x e y Subtrai o conteúdo de x e y. * x*y Multiplica o conteúdo de x pelo conteúdo de y / x/y Obtém o quociente da divisão de x por y. % x%y Obtém o resto da divisão de x por y. (só pode ser utilizado com parâmetros do tipo inteiro. += x+=y Equivale a x=x+y -= x-=y Equivale a x=x-y *= x*=y Equivale a x=x*y /= x/=y Equivale a x=x/y %= x%=y Equivale a x=x%y ++ x++ Equivale a x=x+1 ++ y=++x Equivale a x=x+1 e depois y=x ++ y=x++ Equivale a y=x e depois x=x+1 -- x-- Equivale a x=x-1 -- y=--x Equivale a x=x-1 e depois y=x -- y=x-- Equivale a y=x e depois x=x-1 Funções matemáticas Função Exemplo Comentário abs abs(x) Obtém o valor absoluto de x. ceil ceil(x) Arredonda um número real para cima. Por exemplo, ceil(3.2) é 4. cos cos(x) Calcula o cosseno de x (x de estar representado em radiano). exp exp(x) Obtém o logaritmo natural e elevado à potência X. floor floor(x) Arredonda um número real para baixo. Por exemplo, floor(3.2) é 3. log log(x) Obtém o logaritmo natural de x. log10 log10(x) Obtém o logaritmo de base 10 de x. M_PI M_PI Retorna o valor de π modf z=modf(x,&y) Decompões o número armazenado em x em duas partes: y recebe a parte fracionária e z, a parte inteira do número. pow pow(x,y) Calcula a potência de x elevado y. sin sin(x) Calcula o seno de x (x de estar representado em radiano). sqrt sqrt(x) Calcula a raiz quadrada de x. tan tan(x) Calcula a tangente de x (x de estar representado em radiano). 4
Relacionais Operador Exemplo Comentário == x==y O conteúdo de x é igual ao conteúdo de y.!= x!=y O conteúdo de x é diferente ao conteúdo de y. <= x<=y O conteúdo de x é menor ou igual ao conteúdo de y. >= x>=y O conteúdo de x é maior ou igual ao conteúdo de y. < x<y O conteúdo de x é menor que o conteúdo de y. > x>y O conteúdo de x é maior que o conteúdo de y. Estrutura condicional (seleção ou decisão) As estruturas condicionais são utilizadas quando existe a necessidade de verificar condições para a realização de uma instrução ou de uma sequência de instruções. Essas estruturas podem ser simples ou composta para transformar o exemplo abaixo em uma estrutura condicional simples remova a instrução else. if (nota<5) printf( Aluno Reprovado ); else printf( Aluno Aprovado ); Estruturas de repetição Uma estrutura de repetição é utilizada quando um trecho do algoritmo ou até mesmo o algoritmo inteiro precisa ser repetido. O número de repetições pode ser fixo ou estar atrelado a uma condição. Assim, existem estruturas para tais situações, descritas a seguir. for(i=0;i<=100;i=i+1) printf( Mostre o numero %d, i); do if (n>m) m=n; while(n!=0); while(n!=0) if (n>m) 5
m=n; 1.1 Trabalhando com vetores e matrizes Vetor também é conhecido como variável composta homogênea unidimensional. Isto quer dizer que se trata de um conjunto de variáveis de mesmo tipo, que possuem o mesmo identificador (nome) e são alocadas sequencialmente na memória. Como as variáveis têm o mesmo nome, o que as distingue é um índice que referencia sua localização. Matriz é uma variável composta homogênea multidimensional. Ela é formada por uma sequência de variáveis, todas do mesmo tipo, com o mesmo identificador (mesmo nome), e alocadas sequencialmente na memória. Uma vez que as variáveis têm o mesmo nome, o que as distingue são índices que referenciam sua localização dentro da estrutura. Uma variável do tipo matriz precisa de um índice para cada uma de suas dimensões. A utilização de vetores ou matrizes na linguagem C pode seguir estes passos: Declaração Neste exemplo é declarado um vetor com 10 posições: int vetorexemplo[9]; Obs.: Os vetores na linguagem C começam a contar do zero. Para declarar uma matriz de bidimensional com 4 linhas e 4 colunas: int matrizexemplo[3][3]; Atualizando valores de vetores/matrizes por atribuição vetorexemplo[0]=10; // atribui o valor 10 para a posição 0 do vetor vetorexemplo[1]=2; // atribui o valor 2 para a posição 1 do vetor Valores do vetorexemplo: 10,2,0,0,0,0,0,0,0,0. matrizexemplo[0][0]=1; // atribui o valor 1 para a linha 0 e coluna 0 da matriz matrizexemplo[1][1]=1; // atribui o valor 1 para a linha 1 e coluna 1 da matriz matrizexemplo[2][2]=1; // atribui o valor 1 para a linha 2 e coluna 2 da matriz matrizexemplo[3][3]=1; // atribui o valor 1 para a linha 3 e coluna 3 da matriz Valores da matrizexemplo: 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 Atualizando valores de vetores/matrizes utilizando o scanf scanf( %d,vetorexemplo[0]); //guarda valor digitado na posição 0 do vetor scanf( %d,matrizexemplo[0][0]); //guarda valor digitado na linha 0 e coluna 0 da matriz. 6
Obs.: Para mostrar os valores de vetores/matrizes na tela pode ser utilizado o comando printf. Por exemplo: Mostrando valores de vetores/matrizes utilizando printf printf( O valor do vetor na posição %d eh %d, i, vetorexemplo[i]); printf( O valor da matriz na linha %d e coluna %d eh %d, i, j, matrizexemplo[i][j]); Comandos para trabalhar com textos em C Na linguagem C para trabalhar com textos (strings) é necessário trabalhar com vetores de caracteres, como no exemplo a seguir: Declaração char letra; //permite armazenar um caractere char nome[20]; //permite armazenar um texto com até 20 caracteres char listanome[10][20]; //permite armazenar um vetor de 10 textos com até 20 caracteres cada. Atribuição letra = a strcpy(nome, Apostila C ); strcpy(listanome[0], Primeiro Nome ); Comando de entrada scanf( %c, &letra); scanf( %s, &nome); scanf( %s, &listanome[0]); Comando de saída printf( A letra digitada eh %c, letra); printf( O nome inserido eh %s, nome); printf( O nome na posição zero da lista eh %s, listanome[0]); Comandos para manipular textos Para utilizar os comandos abaixo deve ser inserido a biblioteca string.h. Com o seguinte comando: #include <string.h> strcmp(texto1,texto2); //compara texto1 e texto 2, caso eles sejam iguais retorna o valor zero. strcat(texto1,texto2); //concatena o texto1 com o texto 2 strcpy(texto1,texto2);//copia texto2 para texto1. strlen(texto);//retorna o número de caracteres da variável texto *x=strtok(texto, token ); //cria uma lista de palavras separadas pelo token. Conversão de texto em número (necessita da biblioteca stdlib.h) x=atoi(texto); //converte texto em inteiro x=atof(texto); //converte texto em float x=atol(texto); //converte texto em long 7
Bibliografia Ascencio, Ana Fernanda Gomes; de Campos, Edilene Aparecida Veneruchi. Fundamentos da programação de computadores: Algoritmos, Pascal, C/C++, e Java, 2 ed., Pearson, 2007 Barros, A.M.S. ANSI C para quem tem pressa. 2003. Disponível em: http://www.dei.isep.ipp.pt/~abarros/docs/ansi_c.pdf Acessado em: 06/08/2012. Huss, E. The C Library Reference Guide, 1997. Disponível em: http://www.acm.uiuc.edu/webmonkeys/book/c_guide/ Acessado em: 06/08/2012. Puga, S.; Rissetti, G. Lógica de programação e estruturas de dados com aplicações em Java, 2 ed, Pearson, 2009. cplusplus.com Disponível em: http://www.cplusplus.com/reference/ Acessado em: 10/02/2014 8