Baixe o app para aproveitar ainda mais
Prévia do material em texto
Programando em C ANITA LOPES FUNDAMENTOS DA LINGUAGEM C 1 A linguagem C 1.1 Introdução A linguagem C é uma linguagem de nível intermediário que utiliza recursos da linguagem de máquina de forma simples. É uma linguagem estruturada, com flexibilidade/portabilidade entre sistemas operacionais e tem sido usado para criação de vários tipos de programas tais como processadores de texto, sistemas operacionais, planilhas, outras linguagens de programação, etc. A linguagem C é "Case Sensitive", isto é, maiúsculas e minúsculas fazem diferença. 1.2 Estrutura de um programa em C Um programa em C é constituído de: um cabeçalho que contem definições de pré-processamento tais como os arquivos de cabeçalho, as definições de constantes simbólicas, declaração de variáveis globais, declaração de rotinas, etc. um bloco da função principal e outros blocos de de funções. comentários. [ <definições de pré-processamento> ] [ <declaração de variáveis globais> ] <tipo de retorno da função> main( <parâmetros>) > { Bloco de comandos } <tipo de retorno da função> <nome_da_função1 >( <parâmetros>) > { Bloco de comandos da função1 } ... <tipo de retorno da função> <nome_da_funçãon >( <parâmetros>) > { Bloco de comandos da função2 } Exemplo de um programa em C #include <stdio.h> void main(void) { printf("\nPRIMEIRO PROGRAMA EM C"); } Explicando: #include <stdio.h> instrui o compilador a usar a biblioteca padrão de entrada e saída void main(void) a palavra void diz ao compilador que a função não retorna nenhum valor; main é o nome da função principal; a palavra void entre parênteses indica que a função não tem parâmetros { inicia a função printf imprime na tela a msg após alimentar linha } finaliza a função 1.2.1 Conjunto de caracteres Um programa fonte em C é um texto não formatado escrito em um editor de textos usando um o conjunto padrão de caracteres ASCII. Caracteres válidos: As letras minúsculas e maiúsculas não acentuadas Os algarismos de 0 - 9 + - * / \ = | & ! ? # % ( ) { } [ ] _ ‘ “ . , : < > Observação: Qualquer outro caracter é valido para as strings. 1.2.2 Comentários Os comentários em C podem aparecer em qualquer lugar do programa e têm como objetivo fazer um esclarecimento sobre uma linha ou trecho do programa. Os comentários terão um /* antes e um */ depois. Exemplo: /* programar em C eh facil */ 1.2.3 Diretivas de Compilação Na linguagem C, alguns comandos são processados durante a compilação. Estes comandos são chamados de diretivas de compilação e são eles que informam quais bibliotecas e constantes simbólicas deverão ser anexadas quando for gerado o programa executável. A diretiva #include diz ao compilador para incluir na compilação do programa outros arquivos. Geralmente estes arquivos contem bibliotecas de funções ou rotinas do usuário. Sintaxe: #include <nome_da_biblioteca> onde nome_da_biblioteca é o nome da biblioteca que se deseja incluir. Exemplos de bibliotecas: BIBLIOTECA ctype.h Converte para maiúscula ou para minúscula uma letra toupper(letra) tolower(letra) BIBLIOTECA math.h Calcula o valor absoluto real d fabs(double d) Funções trigonométricas do ângulo arco, em radianos sin(double arco) cos(double arco) tan(double arco) asin(double arco) acos(double arco) atan(double arco) Funções de arredondamento para inteiro ceil(double num) Ex. ceil(3.2) => 4.0 arredonda pra cima floor(double num) Ex. floor(3.2) => 3.0 arredonda para baixo Funções logarítmicas: log() é logaritmo natural (base e), log10() é logaritmo decimal (base 10). log(double num) log10(double num) Funções: potência e raiz quadrada pow(double base, double exp); Potenciacao: pow(3.2,5.6) => 3.25.6 sqrt(double num); Raiz quadrada: sqrt(9.0) = >3.0. BIBLIOTECA stdio.h Esvazia o buffer, lê e imprime fflush(stdin); scanf(…); scanf(…); BIBLIOTECA stdlib.h Calcula o valor absoluto do inteiro i e do real d, respectivamente abs(int i) BIBLIOTECA string.h Concatena duas strings strcat(str1, str2); Copia o conteúdo de uma variável em outra variável strcpy(str1, str2) /* não é permitido: str1 =str2;*/ Fornece o número de caracteres de uma string strlen(str1) Compara duas strings devolve número menor que 0 se str1 vier antes de str2 strcmp(str1, str2) devolve número maior que 0 se str1 vier depois de str2 devolve 0 se str1 for igual à str2 Converte para maiúscula ou para minúscula uma string strupr(lstr1) converte para maiúscula uma string strlwr(str1) converte para minúscula uma string 2. Saída Existem varias maneiras de se fazer uma escrita de informações na linguagem C. Primeiramente, vamos aprender a usar função printf(). Biblioteca: stdio.h printf( "expressão de controle ", <lista_de_argumentos > ); A expressão de controle contém uma descrição de tudo que aparecerá na tela. Além das mensagens, estarão presentes também os códigos de controle para impressão dos conteúdos das variáveis, alimentação de linha, tabulação, etc. Código Significado %d Inteiro %f Float %c Caractere %s String %o Constante octal %x ou %X Constante hexadecimal %u Inteiro sem sinal %ld Longo inteiro %f float %e exponencial %g Usa-se %e ou %f %p Ponteiro %+.. Coloca sinal %<n>d Formata Inteiro %0<n>d Formata inteiro preenchendo com 0 %<n.f>f Formata real %% Coloca na tela um % Controle/Caracter Seqüência de escape nulo (null) campainha (bell) retrocesso (backspace) tabulacao horizontal nova linha (new line) tabulacao vertical alimentacao de folha (form feed) retorno de carro (carriage return) aspas (") apostrofo (') interrogacao (?) barra invertida (\) \0 \a \b \t \n \v \f \r \" \' \? \\ Exemplos: printf("\nUNESA\n"); /*sem lista de argumentos */ printf("\nO numero eh: %d", num); /* imprime mensagem e conteúdo de uma variável inteira*/ #include <stdio.h> void main() { printf("\nletra %c - numero %d ",'A','A'); printf("\n%06d",123); printf("\n%d",-15); printf("\n%+d",123); printf("\n%8.5f", 12.3456); printf("\n%8.0f", 12.3456); } 3. Constantes e variáveis 3.1 Constantes O C possui quatro tipos básicos de constantes: inteiras, de ponto flutuante, caracteres e strings. Constantes inteiras e de ponto flutuante representam números de um modo geral. 3.1.1 Constantes inteiras As constantes inteiras na linguagem C podem ser escritas no formato decimal (base 10), hexadecimal (base 16) ou octal (base 8). Exemplos: Decimal: 12 Octal : 033 ( em decimal vale 27. O zero antes do número caracteriza a constante octal) Hexadecimal: 0xff ( em decimal vale 255. O zero e o x antes do número caracterizam a constante hexadecimal) #include <stdio.h> void main(void){ printf("\ndecimal= %d octal= %o hexadecimal= %X",27,27,27); printf("\ndecimal= %d octal= %o hexadecimal= %X",27,27,27); } 3.1.2 Constantes de ponto flutuante São números reais com um ponto decimal e (opcionalmente) um expoente. Exemplos: 1.876 476.65 1.23e-9 -1.e2 10.6e18 -.853E+67 3.1.3 Constantes caracteres Uma constante caracter é uma letra ou símbolo colocado entre plicas. Exemplo: ’U’ ’N’ ’E’ ’S’ ’A’ As constantes caracter são armazenadas como números inteiros. Estes números correspondem aos valores de cada caracter dentro do código ASCII. 3.1.4 Constantes strings Uma constante string consiste de um conjunto de caracteres do código ASCII padrão ou estendido, colocados entre aspas duplas. Exemplo: ”UAL!” ”Matemática” ”APRENDENDO A PROGRAMAR EM C ” Na linguagem, C uma string é um vetor de caracteres terminado com um caracter nulo. O caracter nulo é um caracter 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'. char nome_da_string[tamanho]; Como precisamos reservar uma posição para o terminador, sempre iremos declarar o tamanho necessário mais um. Vamos supor que declaremos uma variável de nome palavra de 11 posições(char palavra[11]; ) e armazenemos a palavra PROGRAMAS nela. É bom ressaltar que a linguagem C não inicializa as variáveis e toda célula não usada têm valor indeterminado. Não se esqueça de inicializar as variáveis de seus programas, pois coisas incríveis podem acontecer! As strings são consideradas vetores de caracteres( matriz linha). Como na Matemática, para se acessar um determinado caracter de uma string, basta "indexarmos". str[1] = 'o' str[2] = 'a' No exemplo acima, percebemos que o primeiro caracter se encontra na posição 0( em algumas linguagens, seria a posição 1). Desta forma, se indexarmos com 1, na verdade estaremos nos referindo ao segundo caracter da string; se indexarmos com 2, na verdade estaremos nos referindo ao terceiro caracter da string e assim sucessivamente. 3.1.5 Constantes Simbólicas A Matemática define pi como tendo o valor 3,14159265. Muitas vezes precisaremos definir algumas constantes em nossos programas. 3.1.5.1 Constantes definidas pelo programador O programador pode definir constantes simbólicas em qualquer programa. Sintaxe: #define <nome> < valor > Onde #define é uma diretiva de compilação que diz ao compilador para trocar as ocorrências do texto nome por valor. Observe que não há ; no final da instrução pois trata-se de um comando para o compilador e não para o processador. A instrução #define deve ser escrita antes da instrução de declaração da rotina principal. Exemplo: #include <stdio.h> #include <math.h> #define quadrado(x) (x*x) #define pi 3.14159265 #define conv(x) (x*pi/180) void main(void) { printf("\nnumero: 12" ); printf("\n\nquadrado= %d", quadrado(12)); printf("\n\nangulo: 30" ); printf("\n\nseno de %.2f eh %4.2f",30.,sin(conv(30))); } O uso da diretiva #define não se restringe apenas para declarar constante(#define pi 3.14159265 ) mas também podemos usá-la para definir macro instruções(#define conv(x) (x*pi/180) ou #define quadrado(x) (x*x) ). 3.2 Variáveis A variável é um lugar na memória principal que armazena um dado e tem um nome associado. Em C, como na maioria das linguagens, as variáveis devem ser declaradas no inicio do programa. Estas variáveis podem ser de vários tipos: int (inteiro), float (real de simples precisão) , char (caracter único), double (real de dupla precisão). Tipo Tamanho Intervalo Uso char int float double 1 byte 2 bytes 4 bytes 8 bytes -128 a 127 -32768 a 32767 3.4e-38 a 3.4e38 1.7e-308 a 1.7e308 número muito pequeno e caracter ASCII contador, controle de laço real (precisão de 6dígitos) científico (precisão de 10 dígitos) Quando se define um tipo de variável, informamos ao computador quanto de memória será necessária para armazenar este dado e que tipos de operações poderão ser realizadas com este dado. Para se declarar uma variável, usamos a seguinte sintaxe: < tipo> nome_da_variável ; O nome de uma variável deve obedecer algumas regras: O primeiro caracter pode ser uma letra ( maiúscula ou minúscula) ou o caracter sublinha. Os demais caracteres, letras algarismos ou o caracter sublinha. Exemplos: int a; float peso; char sexo; int idade1, idade2; 3.2.1 Palavras reservadas Existem certos nomes que não poderão ser usados como identificadores. São chamadas as palavras reservadas e são de uso restrito da linguagem C. O conjunto de palavras reservadas usadas em C é o seguinte: asm auto break case cdecl char class const continue _cs default delete do double _ds else enum _es extern _export far _fastcall float for friend goto huge if inline int interrupt _loadds long near new operator pascal private protected public register return _saveregs _seg short signed sizeof _ss static struct switch template this typedef union unsigned virtual void volatile while 3.2.2 Tipos modificados Além dos tipos de dados mencionados, existem os modificadores: long, short, signed e unsigned. Tipicamente o modificador long aumenta o número de bytes usados para o registro do número. O modificador unsigned, usado somente em inteiros, permite que um bit usado para guardar o sinal do número seja usado para guardar o valor do número. Tipo Tamanho (bytes) Intervalo unsigned char 1 0 a 255 unsigned int 2 0 a 65 535 unsigned long int 4 0 a 4 294 967 295 long int 4 -2 147 483 648 a 2 147 483 647 short int 2 -32768 a 32767 long double 10 3.4e-4932 a 1.1e4932 3.2.3 Conversão de tipo (Casting) Algumas vezes queremos, momentaneamente, modificar o tipo de dado representado por uma variável, isto é, queremos que o dado seja apresentado em um tipo diferente do qual a variável foi inicialmente declarada. Por exemplo: ao fazermos uma divisão entre dois inteiros, a linguagem C trunca a parte fracionária e podemos desejar que isto não aconteça. Este procedimento é chamado de conversão de tipo ou casting . Sintaxe: (tipo) variável onde tipo é o nome do tipo ao qual queremos converter o dado armazenado em variável. Exemplo: #include <stdio.h> void main(void) { printf("\nnumero: 7" ); printf("\n\nDIVIDINDO POR 3\nsem conversao= %d com conversao= %f",7/3, (float)7/3); } 4. Atribuição Consiste em atribuir um valor a uma variável. Em C, o comando de atribuição tem a seguinte sintaxe: < nome_da_variável > = <conteúdo> ; Exemplos: a = 12 ; peso = 65.2; sexo ='f'; idade1 = 21; idade2 = 34; Observação 1: Em C, é possível declarar e inicializar uma variável: int a = 12; Observação 2: Em C, é possível inicializar várias variáveis: x =t =s = 0; Na atribuição múltipla as operações ocorrem da direita para a esquerda, isto é, inicialmente o valor 0 é atribuído a s, depois o valor de s é atribuído a t e, por último, o valor de t é atribuído a x. 5. Entrada de dados scanf O formato geral da função scanf() é:Biblioteca: stdio.h scanf( "expressão de controle ", <lista_de_argumentos > ); A função scanf() permite que o usuário digite dados através do dispositivo padrão de entrada: teclado. A expressão de controle contém os códigos de formatação para o tipo de dado que será lido. A lista de argumentos corresponde aos endereços das variáveis. O nome de cada variável deverá ser precedido pelo caracter &. Código Significado %d Lê um número inteiro %f Lê um número em ponto flutuante %e Lê um número em ponto flutuante %g Lê um número em ponto flutuante %c Lê um caracter %s Lê uma string %o Lê um número octal %x ou %X Lê um número hexadecimal %u Lê um inteiro sem sinal %ld Lê um longo inteiro %lf Lê um double inteiro %p Lê um ponteiro Exemplos: scanf("%d", &num); /* lê para uma variável inteira*/ scanf("%d %d", &num1, &num2 ); /* lê para duas variáveis inteiras separadas por um espaço*/ scanf("%d,%d", &num1, &num2 ); /* lê para duas variáveis inteiras separadas por uma vírgula*/ #include <stdio.h> void main(void) { int n; char resp; printf("\nnumero:" );scanf("%d",&n); printf("\ndecimal= %d octal= %o hexadecimal= %X hexadecimal= %x",n,n,n,n); fflush(stdin); scanf("%c",&resp); } 6. Operadores Aritméticos Existem cinco operadores aritméticos em C. Cada operador aritmético está relacionado a uma operação aritmética elementar: adição, subtração, multiplicação e divisão. Existe ainda um operador (%) chamado operador de módulo cujo significado é o resto da divisão inteira. Operador Operação + - * / % adição subtração multiplicação divisão módulo (resto da divisão inteira) Sintaxe: operando1 operador operando2 onde operador é um dos símbolos mostrados acima e operando é uma constante ou um identificador de variável. Exemplos: 12 + 5 -> 17 12 * 5 -> 60 12 / 5 -> 2 quando se divide dois inteiros, o resultado é um inteiro 12 % 5 -> 2 resto da divisão inteira Não existe em C, como existe em outras linguagens, um operador específico para a operação de potenciação (ab). Existe, porém, uma função de biblioteca (pow()) que realiza esta operação. #include <stdio.h> void main(void) { int n; char resp; printf("\nnumero:" );scanf("%d",&n); printf("\n\nTUDO POR 5 \n\nsoma= %d subtracao= %d multiplicacao= %d divisao inteira= %d resto= %d",n+5,n-5,n*5,n/5,n%5); fflush(stdin); /* esvazia o buffer de entrada */ scanf("%c",&resp); } 6.1 Hierarquia das operações Categoria Operadores Prioridade parênteses ( ) interno ( externo função nome() E ( D incremental, lógico ++ -- ! E ( D aritmético * / % E ( D aritmético + - E ( D relacional < > <= >= E ( D relacional == != E ( D lógico && E ( D lógico || E ( D condicional ?: E ( D atribuição = += -= *= /= %= E ( D 6.2 Operadores de Atribuição Aritmética Muitas vezes queremos alterar o valor de uma variável realizando alguma operação aritmética com ela. A linguagem C apresenta instruções otimizadas com o uso de operadores ditos operadores de atribuição aritmética. Os símbolos usado são (+=, -=, *=, /= , %=). Sintaxes: var += exp; var -= exp; var *= exp; var /= exp; var %= exp; var = var + exp; var = var - exp; var = var * exp; var = var / exp; var = var % exp; onde var é o identificador da variável e exp é uma expressão válida. Estas instruções são equivalentes as seguintes: Exemplos: Atribuição Aritmética Instrução Equivalente cont += 1; j -= i ; num *= 1 + k; divide /= 5; resto %= 2; cont = cont + 1; j = j – i ; num = num * (1 + k); divide = divide / 5; resto = resto % 2; O operador de atribuição aritmética tem precedência menor que os outros operadores até aqui discutidos. 6.3 Operadores Incrementais Em programação existem instruções muito comuns chamadas de incremento e decremento. Uma instrução de incremento adiciona uma unidade ao conteúdo de uma variável. Uma instrução de decremento subtrai uma unidade do conteúdo de uma variável. Existem, em C, operadores específicos para realizar as operações de incremento (++) e decremento (--). Eles são genericamente chamados de operadores incrementais. Sintaxe: Instrução Equivalente ++ var; var ++ ; -- var ; var -- ; var = var + 1; var = var + 1; var = var – 1; var = var – 1; onde var é o nome da variável da qual se quer incrementar ou decrementar um unidade. Observe que existe duas sintaxes possíveis para os operadores: pode-se colocar o operador como prefixo ou como sufixo. Nos dois casos o valor da variável será incrementado (ou decrementado) de uma unidade. Porém se o operador for colocado como sufixo, o valor da variável será incrementado (ou decrementado) antes que a variável seja usada em alguma outra operação. Caso o operador seja colocado como sufixo, o valor da variável será incrementado (ou decrementado) depois que a variável for usada em alguma outra operação. #include <stdio.h> void main(void) { int n,n1,n2; char resp; printf("\033[2J"); printf("\033[30;47m"); printf("\nnumero:" );scanf("%d",&n); printf("\n\nprefixo++ n1= %d sufixo++ n2= %d",n1=++n, n2=n++); fflush(stdin); scanf("%c",&resp); } Observação: Não se preocupe com os avisos, pois o objetivo foi mostrar os incrementos pré e pós fixados. Como visto na tabela de hierarquia das operações, o operador ++ tem hierarquia da direita para esquerda. Desta forma, ele atribui 13 à variável n2 e depois incrementa n. Como a atribuição à variável n1 é com prefixo, ele incrementa n outra vez e depois atribui o valor 15 à variável n1. Os operadores incrementais tem a mais alta precedência entre todos, sendo superados apenas pelos parênteses que tem precedência ainda maior. 6.4 Operadores Relacionais e Lógicos As expressões lógicas usadas nas estruturas de teste são formadas pelos operadores relacionais e lógicos. 6.4.1 Operadores relacionais Operadores relacionais verificam a relação de magnitude e igualdade entre dois valores. São seis os operadores relacionais em C: Operador Significado > < >= <= == != maior que menor que maior ou igual a menor ou igual a igual a diferente de Sintaxe: expressão_1 operador expressão_2 onde expressão_1 e expressão_2 são duas expressões numéricas quaisquer, e operador é um dos operadores relacionais. Ao contrário de outras linguagens, em C não existem tipos lógicos, portanto o resultado de uma expressão lógica é um valor numérico: uma expressão avaliada verdadeira recebe o valor 1, uma expressão lógica avaliada falsa recebe o valor 0. Os operadores relacionais de igualdade (== e !=) tem precedência menor que os de magnitude (>, <, >= e <=). Estes, por sua vez, tem precedência menor que os operadores aritméticos. 6.4.2 Operadores lógicos São três os operadores lógicos de C: &&, || e !. Estes operadores têm os mesmos significados dos operadores lógicos Booleanos AND, OR e NOT. Sintaxes: expr_1 && expr_2 expr_1 || expr_2 !expr onde expr_1 , expr_2 e expr são expressões quaisquer. Observe que os operadores lógicos atuam sobre expressões de quaisquer valores. Para estes operadores todo valor numérico diferente de 0 é considerado 1. Operador Matemática C conjunção disjunção negação e ou nao && || ! TABELA VERDADE DO OPERADOR&& Suponha duas perguntas feitas a quatro pessoas. Se a resposta do candidato for negativa, deverá falar 0, caso contrário, falará 1. Suponha também que só será chamado para entrevista o candidato que dominar as duas linguagens. Você conhece C? Você conhece PASCAL? SAÍDA 0 0 0 0 1 0 1 0 0 1 1 1 Neste exemplo, somente o quarto candidato seria chamado para a entrevista, pois o operador && (e), só considera a expressão como verdadeira se todas as expressões testadas forem verdadeiras. TABELA VERDADE DO OPERADOR || Suponha duas perguntas feitas a quatro pessoas. Se a resposta do candidato for negativa, deverá falar 0, caso contrário, falará 1. Suponha também que será chamado para entrevista o candidato que dominar pelo menos uma linguagem. Você conhece C++? Você conhece JAVA? SAÍDA 0 0 0 0 1 1 1 0 1 1 1 1 Neste exemplo, somente o primeiro candidato não seria chamado para a entrevista , pois o operador || (ou), considera a expressão como verdadeira se, pelo menos uma expressão testada for verdadeira. Observação: O Operador && tem precedência sobre o operador ||. Estes dois têm precedência menor que os operadores relacionais. TABELA VERDADE DO OPERADOR ! Suponha uma pergunta feita a duas pessoas. Se a resposta do candidato for negativa, deverá falar 0, caso contrário, falará 1. Você Não conhece C++? SAÍDA 1 0 0 1 O operador ! tem a mesma precedência que os operadores incrementais. 6.5 Operador Condicional O operador ternário (?) é usado em expressões condicionais. Este operador necessita de três operandos. Seu uso poderá simplificar a instrução if expressão1; else expressão2;. Sintaxe: condição ? expressão_1 : expressão_2 Exemplo: ... a=24; b=38; c= (a >b) ?a: b; /* o valor de c seria 38, pois b é maior do que a. O operador condicional tem baixa precedência, precedendo apenas aos operadores de atribuição. . � PAGE �1�
Compartilhar