Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Curso de Linguagem C, Notas de estudo de Informática

Um curso básico de linguagem c, abordando conceitos como tipos e extensões de dados, variáveis, entrada e saída de dados, estruturas de controle, funções, ponteiros, matrizes, entre outros. Além disso, são fornecidos exemplos para ilustrar cada conceito.

Tipologia: Notas de estudo

2010

Compartilhado em 01/11/2010

carlos-henrique-silva-5
carlos-henrique-silva-5 🇧🇷

4 documentos

Pré-visualização parcial do texto

Baixe Curso de Linguagem C e outras Notas de estudo em PDF para Informática, somente na Docsity! 1 1 Curso de Linguagem C 1 Curso de Linguagem C Curso de Linguagem C Rodolfo Jardim de Azevedo Instituto de Computação UNICAMP 2 Curso de Linguagem C Programação Estruturada n A linguagem C é uma linguagem estruturada em bloco simples. Uma característica distintiva de uma linguagem estruturada em bloco é a compartimentalização de seu código e de seus dados, que é a habilidade de uma linguagem tem de seccionar e esconder do resto do programa todas as instruções necessárias para a realização de uma determinada tarefa. 3 Curso de Linguagem C Declaração de variáveis n Variáveis devem ser declaradas antes de serem usadas, permitindo assim, que o compilador saiba de antemão informações como tipo e espaço gasto em memória podendo fazer checagem durante o processo de compilação. 4 Curso de Linguagem C Funções - Blocos de código n Utilizando funções, é possível esconder parte do código e variáveis, evitando assim, que sejam gerados efeitos colaterais em outras partes do programa. Desta forma, é necessário saber apenas o que as rotinas fazem, e não como elas fazem. 5 Curso de Linguagem C Laços n Os programas passam a maior parte do tempo repetindo tarefas até que uma condição seja satisfeita (ou um número fixo de vezes). Desta forma, fica mais fácil a programação e eliminam-se os inconvenientes gerados por vários gotos espalhados pelo programa. 6 Curso de Linguagem C Testes de condições n Numa linguagem estruturada, os testes de condições são amplamente utilizados, tanto como controle de laços, quanto para execuções condicionais de blocos de código. 2 2 Curso de Linguagem C 7 Curso de Linguagem C A linguagem C n Surgiu nos anos 70 de uma linguagem chamada B. Criada por Dennis Ritchie. Embora houvessem poucas divergências entre as primeiras implementações em nível de código- fonte, foi desenvolvido o padrão ANSI sendo assim, qualquer programa C ANSI pode ser compilado em qualquer compilador C ANSI não importando a máquina na qual o programa vá ser executado. Por isso, quando se quer portabilidade, a escolha acaba recaindo sobre a linguagem C. 8 Curso de Linguagem CLinguagem feita para programadores n Ao contrário do que possa parecer, nem todas as linguagens foram feitas para programadores. C é virtualmente única, porque ela foi criada, influenciada e testada em campo por programadores. Ela oferece ao programador exatamente o que ele quer: poucas restrições e queixas, código rápido e eficiência. Por isso ela é a linguagem mais popular entre os programadores profissionais altamente qualificados. 9 Curso de Linguagem C Sensível ao caso n A linguagem C é sensível ao caso, isto quer significa que letras maiúsculas e minúsculas são tratadas como caracteres separados. 10 Curso de Linguagem C Programa exemplo /* Este é o primeiro programa */ #include <stdio.h> main() { printf(“Alo mundo\n”); } n Este é um exemplo bem simples, mas que mostra alguns componentes básicos que existem nos programas feitos em C. Nele vemos: 11 Curso de Linguagem C /* Este é o primeiro programa */ n Esta linha é um comentário. 12 Curso de Linguagem C #include <stdio.h> n Indica a inclusão de arquivos dentro do programa atual (neste caso, o arquivo stdio.h). Normalmente são arquivos cabeçalhos contendo declarações de tipos e protótipos de funções. Serão vistos mais tarde. 5 5 Curso de Linguagem C 25 Curso de Linguagem C Tipos de dados n Em C, existem 5 tipos de dados básicos: caracter, inteiro, ponto flutuante, ponto flutuante de dupla precisão e sem valor. As palavras reservadas para declarar variáveis destes tipos são char, int, float, double e void respectivamente. Veja na tabela a seguir o espaço gasto por cada um destes tipos assim como seus limites em máquinas IBM PC compatíveis. 26 Curso de Linguagem C Tipos de dados Tipo Extensão em bits Escala char 8 -128 a 127 int 16 -31768 a 32767 float 32 3.4E-38 a 3.4E+38 double 64 1.7E-308 a 1.7E308 void 0 sem valor 27 Curso de Linguagem C Modificadores de tipo n Com exceção de void, os tipos de dados básicos têm vários modificadores que os precedem. O modificador é usado para alterar o significado do tipo-base para que ele se adapte da maneira mais precisa às necessidades das várias situações. Eis aqui uma lista dos modificadores: signed, unsigned, long, short. Os dois primeiros modificadores indicam a existência ou não de sinal enquanto os outros dois são relativos ao tamanho de memória necessário para armazenar o valor de um elemento deste tipo. 28 Curso de Linguagem C Modificadores de tipo Tipo Extensão em bits char 8 int 16 short int 16 long int 32 float 32 short float 32 long float 64 double 64 short double 64 long double 80 29 Curso de Linguagem C Declarando variáveis n Uma declaração de variável deve seguir a seguinte regra: tipo lista_variáveis; n onde tipo deve ser um tipo válido em C e lista_variáveis pode consistir em um ou mais identificadores separados por vírgula. 30 Curso de Linguagem CExemplos de declaração de variável n int i, j, l; n short int si; n unsigned int ui; n long inteiro_grande; n double balanco, lucro, prejuizo; 6 6 Curso de Linguagem C 31 Curso de Linguagem C Onde declarar? n Existem 3 lugares em um programa C onde as variáveis podem ser declaradas. 32 Curso de Linguagem C Variável global n O primeiro lugar é fora de todas as funções, incluindo a função main(). A variável decalrada dessa maneira é chamada variável global e pode ser usada em qualquer parte do programa. 33 Curso de Linguagem C Variável local n O segundo lugar é dentro de uma função. Estas variáveis são chamadas variáveis locais e podem ser usadas somente pelos comandos que estiverem na mesma função. 34 Curso de Linguagem C Parâmetro (argumento) n O último lugar onde as variáveis podem ser declaradas é na declaração dos parâmetros formais de uma função, embora as variáveis aqui declaradas sejam utilizadas para receber os argumentos quando a função é chamada, eles podem ser utilizados como outra variávei qualquer. 35 Curso de Linguagem C Programa exemplo: /* soma os números de 0 a 9 */ int soma; /* Variável global */ main() { int cont; /* Variável local */ soma = 0; /* inicializa variável soma */ for (cont = 0; cont < 10; cont ++) { total(cont); display(); } } 36 Curso de Linguagem C Função total() /* acumula no total parcial */ total(x) int x; /* Parâmetro formal */ { soma = x + soma; } 7 7 Curso de Linguagem C 37 Curso de Linguagem C Função display() display() { int cont; /* Variável local */ /* esta variável cont é diferente daquela declarada em main() */ for(cont = 0; cont < 10; cont ++) printf(“-”); printf(“A soma atual é %d”, soma); } 38 Curso de Linguagem C Comentários n Neste exemplo, qualquer função do programa pode acessar a variável global soma. Porém total() não pode acessar diretamente a variável local cont em main(), que deve passar cont como um argumento. Isto é necessário porque uma variável local só pode ser usada pelo código que está na mesma função na qual ela é declarada. Observe que cont em display() é completamente separada de cont em main(), novamente porque uma variável local é conhecida apenas pela função na qual ela é declarada. 39 Curso de Linguagem C Inicialização de variáveis n Nós vimos que em main() existe uma linha somente para inicializar a variável soma, esta linha poderia ser suprimida se a variável fosse declarada int soma = 0; n Desta forma, podemos inicializar variáveis no momento de sua declaração, o que facilita muito a escrita do programa além de reduzir o seu tamanho. 40 Curso de Linguagem C Constantes n Constantes são valores fixos que o programa não pode alterar. 41 Curso de Linguagem C Exemplos de Constantes Tipo de dado Exemplo char ‘a’ ‘n’ ‘9’ int 1 123 2100 -234 long int 35000 -34 short int 10 -12 90 unsigned int 10000 987 40000 float 123.23 4.34E-3 double 123.23 12312333 -0.9876 42 Curso de Linguagem C Constantes hexadecimais e octais n Podem ser declaradas constantes em hexadecimal ou octal conforme o exemplo a seguir: int hex = 0xFF; /* 255 em decimal */ /* as constantes em hexadecimal devem ser precedidas por 0x */ int oct = 011; /* 9 em decimal */ /* as constantes em octal devem ser precedidas por 0 */ 10 10 Curso de Linguagem C 55 Curso de Linguagem C Conversões de tipos n Quando você mistura constantes e variáveis de tipos diferentes em uma expressão, C as converte para o mesmo tipo. O compilador C converterá todos os operandos para o tipo do maior operando, uma operação de cada vez, conforme descrito nestas regras de conversão de tipo: 56 Curso de Linguagem C Regra 1 n Todo char e short int é convertido para int. Todo float é convertido para double. 57 Curso de Linguagem C Regra 2 n Para todos os pares de operandos, ocorre o seguinte, em seqüência: se um dos operandos for um long double, o outro será convertido para long double. Se um dos operandos for double, o outro será convertido para double. Se um dos operandos for long, o outro será convertido para long. Se um dos operandos for unsigned, o outro será convertido para unsigned. 58 Curso de Linguagem C Type cast n Pode-se forçar o compilador a efetuar determinada conversão utilizando-se um type cast que tem a seguinte forma: (tipo) expressão 59 Curso de Linguagem C Exemplo: main() { int x = 3; printf(“%f %f\n”, (float) x / 2, (float) (x / 2)); /* serão impressos na tela 1.5 e 1.0 pois no primeiro caso, x é convertido para float e depois é dividido, já no segundo, somente o resultado é convertido para float */ } 60 Curso de Linguagem C Modificadores de acesso n Os modificadores de acesso informam sobre como será feito o acesso à variável. 11 11 Curso de Linguagem C 61 Curso de Linguagem C Register n Sempre que uma variável for declarada do tipo register, o compilador fará o máximo possível para mante-la num dos registradores do microprocessador, acelerando assim o acesso a seu valor. É pratica comum, declarar as variáveis de controle de loop como sendo register. 62 Curso de Linguagem C Static n Variáveis static são variáveis existem durante toda a execução do programa, mas só podem ser acessadas de dentro do bloco que a declarou. 63 Curso de Linguagem C Exemplo: /* Exemplo de variável static */ main() { printf(“%d\n”, numero()); /* imprimirá 0 */ printf(“%d\n”, numero()); /* imprimirá 1 */ } numero() { static valor = 0; /* atribuição só executada 1 vez */ return valor ++; } 64 Curso de Linguagem C printf() n Rotina de finalidade geral para saída pelo console n A função printf() serve para mostrar mensagens na tela. Sua forma geral é printf(“string de controle”, lista argumentos); 65 Curso de Linguagem C “string de controle” n A string de controle consiste em dois tipos de itens: Caracteres que a função imprimirá na tela Comandos de formatação 66 Curso de Linguagem C Comandos de formatação n Todos os comandos de formatação começam por % que é seguido pelo código de formatação n Deve haver exatamente o mesmo número de argumentos quanto forem os comandos de formatação e eles devem coincidir em ordem 12 12 Curso de Linguagem C 67 Curso de Linguagem C Comandos de formatação Código Formato %c um único caracter %d decimal %i decimal %e notação científica %f ponto decimal flutuante %g usa %e ou %f - aquele que for menor %o octal %s string de caracteres %u decimal sem sinal %x hexadecimal %% sinal % %p exibe um ponteiro %n o argumento associado será um ponteiro inteiro no qual será colocado o número de caracteres escritos até o momento 68 Curso de Linguagem C Comprimento mínimo do campo n Para especificar o comprimento mínimo que um campo poderá ter, basta colocar um inteiro entre o sinal % e o comando de formatação. Observe que este é o comprimento mínimo e que o campo pode ocupar um espaço maior. Exemplo Função %3d inteiro com pelo menos 3 dígitos (preenchido com espaços) %03d inteiro com pelo menos 3 dígitos (preenchido com zeros) %5s string com pelo menos 5 caracteres 69 Curso de Linguagem C Número de casas decimais n Para especificar o número de casas decimais, coloque um ponto decimal após o especificador de largura mínima do campo e depois dele, o número de casas decimais que deverão ser exibidas. Exemplo Função %7.2f Usar 2 casas decimais 70 Curso de Linguagem C Comprimento máximo n Quando o formato de casas decimais é colocado em strings, o número de casas decimais passa a ser considerado como comprimento máximo do campo. Exemplo Função %5.7s string com no mínimo 5 e no máximo 7 caracteres 71 Curso de Linguagem C Número mínimo de dígitos n Quando o formato de casas decimais é aplicado em inteiros, o especificador de casas decimais será utilizado como número mínimo de dígitos Exemplo Função %7.6d 7 caracteres no mínimo e 6 dígitos no mínimo 72 Curso de Linguagem C Alinhamento n Por padrão, todo resultado é alinhado à direita, para inverter este padrão, utilize um sinal de menos (-) antes de especificar o tamanho. Exemplo Função %-5d 5 caracteres alinhados à esquerda %-10s 10 caracteres alinhados à esquerda 15 15 Curso de Linguagem C 85 Curso de Linguagem C Comandos de controle de fluxo n Os comandos de controle de fluxo são a base de qualquer linguagem. n A maneira como eles são implementados afeta a personalidade e percepção da linguagem. n C tem um conjunto muito rico e poderoso de comandos de controle de fluxo. n Eles se dividem em comandos de teste de condições e comandos de controle de loop. 86 Curso de Linguagem C Comandos de testes de condições n Estes comandos avaliam uma condição e executam um bloco de código de acordo com o resultado. São eles: • if • switch 87 Curso de Linguagem C if n O comando if serve para executar comandos de acordo com uma determinada condição n A forma geral do comando if é if (condição) comando; else comando; n onde a parte else é opcional 88 Curso de Linguagem C Exemplo /* programa do número mágico */ #include <stdlib.h> main() { int magico, adivinhacao; magico = rand() % 10; /* gerar um número */ printf(“Adivinhe o número: ”); scanf(“%d”, &adivinhacao); if (adivinhacao == magico) printf(“** número certo **”); else printf(“-- número errado --”); } 89 Curso de Linguagem C if aninhados n C permite que sejam colocados comandos if dentro de outros comandos if. A isto chamamos de if aninhados. n Quando se trata de if aninhados, o comando else se refere ao if mais próximo que não possui um comando else. Tanto o if quanto o else devem estar dentro do mesmo bloco de código. 90 Curso de Linguagem C Exemplos if (x) if (y) printf(“1”); else printf(“2”); n Neste caso, o else pertence ao segundo if. if (x) { if (y) printf(“1”); } else printf(“2”); n Neste caso, o else pertence ao primeiro if. 16 16 Curso de Linguagem C 91 Curso de Linguagem C if-else-if n É muito comum encontrar programas que possuem uma “escada” if-else-if da seguinte forma: if (condição) comando; else if (condição) comando; else comando; 92 Curso de Linguagem C Avaliação do if-else-if n O computador avalia as expressões condicionais de cima para baixo. Assim que encontra uma condição verdadeira, ele executa o comando associado a ela e passa por cima do resto da “escada”. n Se nenhuma condição for verdadeira, o computador executará o else final. 93 Curso de Linguagem C A expressão condicional n Qualquer expressão válida em C pode servir como expressão condicional. Veja o exemplo: /* dividir o primeiro número pelo segundo */ main() { int a, b; printf(“Digite dois números: “); scanf(“%d %d”, &a, &b); if (b) printf(“%d\n”, a/b); else printf(“não posso diridir por zero\n”); } 94 Curso de Linguagem C switch n Embora o if-else-if possa executar vários tipos de testes, o código pode ficar muito difícil de ser seguido. n C possui um comando de vários desvios chamado switch. n No switch, o computador testa uma variável sucessivamente contra uma lista de constantes inteiras ou de caracteres e executa um comando ou bloco de comandos quando encontrar uma coincidência. 95 Curso de Linguagem C Forma geral do switch switch (variável) { case constante1: seqüência de comandos break; case constante2: seqüência de comandos break; default: seqüência de comandos } 96 Curso de Linguagem CO comando default dentro do switch n O comando default será executado se não for encontrada nenhuma coincidência na lista de constantes. n Caso não seja colocado um comando default e não haja coincidência, nenhum comando será executado. 17 17 Curso de Linguagem C 97 Curso de Linguagem C O comando break n Quando o computador encontra alguma coincidência, ele executa os comandos associados àquele case até encontrar break ou o fim do comando switch. n É um erro comum programadores esquecerem de colocar o break após os comandos. 98 Curso de Linguagem C Importante n O switch difere do if, já que o primeiro só pode testar igualdade e a expressão condicional if pode ser de qualquer tipo. n Não pode haver duas constantes case com valores iguais no mesmo switch. n Podem ser colocados comandos switch dentro de comandos switch. n Pode ser deixado um case vazio quando mais de uma condição usa o mesmo código. 99 Curso de Linguagem C Comandos de controle de loops n Os comandos de controle de loops permitem que o computador repita um conjunto de instruções até que alcance uma certa condição. Em C temos os seguintes comandos de controle de loop: • for • while • do while 100 Curso de Linguagem C for n O loop for em C é muito mais forte e mais flexível que o da maioria das outras linguagens. Sua forma geral é for (inicialização; condição; incremento) comando; n Observe que as três partes do loop for são separadas por ponto e vírgula. n Nenhuma destas partes precisa existir. 101 Curso de Linguagem C Inicialização n Na forma mais simples, inicialização é um comando de atribuição que o compilador usa para estabelecer a variável de controle de loop. n A inicialização pode conter qualquer comando válido em C. 102 Curso de Linguagem C Condição n A condição é uma expressão de relação que testa se a condição final desejada pelo loop for ocorreu. n Aqui também pode ser colocado qualquer comando válido em C. 20 20 Curso de Linguagem C 115 Curso de Linguagem C Exemplo 2 n O exemplo anterior pode ser reescrito sem utilizar variável. Veja: main() { printf(“Tecle ESPAÇO para continuar...”); while (getche() != ‘ ’); } 116 Curso de Linguagem C do while n Ao contrário do loop for e do loop while, que testam a condição no começo do loop, o loop do while verifica a condição somente no final. Desta forma, o loop será executado pelo menos uma vez. A forma geral do loop do while é: do { comando; } while (condição); 117 Curso de Linguagem C Exemplo /* Lê um número maior que 100 */ main() { int num; do { printf(“Digite um número maior que 100”); scanf(“%d”, &num); } while (num <= 100); } 118 Curso de Linguagem C Loops aninhados n Quando um loop está dentro do outro, dizemos que o loop interior está aninhado. n Loops aninhados permite que sejam solucionados vários problemas de programação. n Em C podemos aninhar qualquer tipo de loop. 119 Curso de Linguagem C Exemplo /* exibir uma tabela de potências dos números de 1 a 9*/ main() { int i, j, k, temp; printf(“\ti\ti^2\ti^3\ti^4\n”); for (i = 1; i < 10; i ++) { /* loop externo */ for (j = 1; j < 5; j ++) { /* primeiro nível de aninhamento */ temp = 1; for (k = 0; k < j; k ++) /* loop mais interior */ temp = temp * i; printf(“%8d”, temp); } } } 120 Curso de Linguagem C Interrupção de loops n Quando precisamos encerrar um loop sem que sua condição de encerramento esteja satisfeita, podemos utilizar o comando break. n O comando break é especialmente útil quando algum evento externo controle um loop. 21 21 Curso de Linguagem C 121 Curso de Linguagem C Comando continue n O comando continue funciona de maneira parecida com o comando break. Porém, em vez de forçar o encerramento, continue força a próxima iteração do loop e pula o código que estiver no meio. 122 Curso de Linguagem C Exemplo /* programa para imprimir os números pares entre 0 e 98 */ main() { int x; for (x = 0; x < 100; x ++) { if (x % 2) continue; printf(“%d ”, x); } } 123 Curso de Linguagem C Vetores n Vetores são uma coleção de variáveis do mesmo tipo que são referenciadas pelo mesmo nome. n Em C, um vetor consiste em locações contíguas de memória. n O elemento mais baixo corresponde ao primeiro elemento e o mais alto ao último. n O vetor mais utilizado é o de caracteres. 124 Curso de Linguagem C Declarando vetores n A forma geral da declaração de um vetor é: tipo nome_var[tamanho]; n Onde • tipo é o tipo base do vetor e • tamanho é a quantidade de elementos que o vetor conterá 125 Curso de Linguagem C Acessando um vetor n Os vetores são acessados através de índices colocados entre colchetes. n O índice do primeiro elemento do vetor é 0 (ZERO). int amostra[10]; /* vetor de 10 inteiros */ amostra[0] /* primeiro elemento */ amostra[9] /* último elemento */ 126 Curso de Linguagem C Exemplo main() { int x[10]; /* vetor com 10 elementos int */ int t; for (t = 0; t < 10; t ++) x [ t ] = t; } 22 22 Curso de Linguagem C 127 Curso de Linguagem C Limites dos vetores n C não faz checagem dos limites dos vetores, isto é responsabilidade do programador. Logo, o código a seguir não causará nenhum erro. int elementos[10]; elementos[12] = 0; elementos[10] = 0; 128 Curso de Linguagem C Strings n Uma string é por definição, um vetor de caracteres terminado em 0. Então, para declarar a string, devemos declarar sempre um elemento a mais para o terminador. Veja que char mensagem[10] = “Exemplo” n Ficará armazenado na memória como: E x e m p l o \0 129 Curso de Linguagem C Funções para manipular strings Função Finalidade gets Lê uma string do teclado puts Imprime uma string na tela strcpy Copia uma string em outra srtcat Concatena strings strcmp Compara strings strlen Retorna o tamanho da string 130 Curso de Linguagem C gets n Lê uma string do teclado. n Forma geral: gets(nome_string); n Exemplo: main() { char str[80]; gets(str); printf(“%s”, str); } 131 Curso de Linguagem C puts n Mostra uma string na tela. n Forma geral: puts(nome_string); n Exemplo: main() { puts(“Esta é uma mensagem”); } 132 Curso de Linguagem C strcpy n Copia uma string em outra. n Forma geral: strcpy(para, de); n Lembre-se que a string para deve ser grande o suficiente para conter de. main() { char str[80]; strcpy(str, “alo”); } 25 25 Curso de Linguagem C 145 Curso de Linguagem C Ponteiros n Entender e usar corretamente os ponteiros são pontos cruciais para criação de programas bem-sucedidos em C. n Além dos ponteiros serem uma das características mais fortes em C, também é a mais perigosa. n É muito fácil usar ponteiros incorretamente causando erros difíceis de serem encontrados. 146 Curso de Linguagem C Motivos para usar ponteiros n Os ponteiros fornecem maneiras pelas quais as funções podem modificar os argumentos recebidos. n Dão apoio às rotinas de alocação dinâmica. n Podem substituir o uso vetores em muitas situações para aumentar a eficiência. 147 Curso de Linguagem C Ponteiros são endereços n Um ponteiro é uma variável que contém um endereço de memória. Isto é, eles possuem armazenam a localização de outra variável dentro da memória do computador. n Então dizemos que um ponteiro aponta para esta variável. 148 Curso de Linguagem C Ilustração de poteiros Endereçamento de memória Variável na memória 1000 1003 1001 1002 1003 1004 1005 149 Curso de Linguagem C Variáveis ponteiros - declaração n A declaração de variáveis ponteiros, segue a seguinte regra geral: tipo *nome_var; n onde tipo é o tipo do elemento para o qual o ponteiro apontará. n Exemplo: char *p; int *temp, *valor; 150 Curso de Linguagem C Os operadores de ponteiros n Existem 2 operadores especiais de ponteiros: & e *. n O operador & devolve o endereço da variável. É utilizado para fazer um ponteiro apontar para ela. n O operador * devolve o valor armazenado no endereço apontado pelo ponteiro. 26 26 Curso de Linguagem C 151 Curso de Linguagem C Exemplo main() { int numero = 5, *p; p = &numero; printf(“%d %d\n”, numero, *p); *p = 3; printf(“%d %d\n”, numero, *p); numero = 7; printf(“%d %d\n”, numero, *p); } 152 Curso de Linguagem C Expressões com ponteiros n C permite que sejam feitas expressões com ponteiros e elas seguem as mesmas regras das outras expressões em C. n Quando se compara um ponteiro com outro, estamos comparando seus endereços. Isto é útil quando ambos os ponteiros apontam para elementos de um vetor. 153 Curso de Linguagem C Ponteiros e vetores n Existe um relacionamento muito próximo entre os ponteiros e os vetores. Veja o código: char str[80], *p; p = str; n Este código faz com que p aponte para o primero elemento do vetor, pois um vetor sem o índice se comporta como um ponteiro para seu primeiro elemento. 154 Curso de Linguagem C Exemplo n Após a definição: char str[80], *p; p = str; n são equivalentes os acessos ao quinto elemento de str: str[4] *(p + 4) p[4] 155 Curso de Linguagem C Problemas com ponteiros n É muito fácil errar quando se trabalha com ponteiros em C. n Algumas vezes, os erros com ponteiros só aparecem quando o programa cresce. n Ponteiros que não foram inicializados, apontam para um lugar desconhecido na memória, que pode ser inclusive o código do programa. 156 Curso de Linguagem C Dois erros comuns /* este programa está errado */ main() { int x, *p; x = 10; *p = x; } /* este programa está errado */ main() { int x, *p; x = 10; p = x; printf(“%d”, *p); } 27 27 Curso de Linguagem C 157 Curso de Linguagem C Alocação dinâmica de memória n A linguagem C permite que seja feita alocação dinâmica de memória, isto é, solicitar memória a medida que ela for sendo necessária. n Programas que utilizam listas, pilhas, e outros tipos de dados complexos cuja quantidade máxima não é definida durante a compilação, trabalham com alocação dinâmica de memória. 158 Curso de Linguagem C Funções de alocação dinâmica n Alocar um bloco de memória void *malloc(int número_de_bytes); void *calloc(unsigned num, unsigned tam); n Liberar um bloco de memória void free(void *p); n Alterar o tamanho de um bloco de memória void *realloc(void *p, unsigned tam); 159 Curso de Linguagem C Exemplo 1 #include <stdio.h> #include <stdlib.h> main() { char *str; str = (char *) malloc(101 * sizeof(char)); if (str) { strcpy(str, “Isto é um teste”); printf(“%s”, str); free(str); } } 160 Curso de Linguagem C Exemplo 2 #include <stdio.h> #include <stdlib.h> main() { float *p; p = (float *) calloc(100, sizeof(float)); if (!p) { printf(“alocação fracassada - abortado”); exit(1); } free(p); } 161 Curso de Linguagem C Funções n Funções são os blocos de contrução em que ocorrem todas as atividades do programas. n Programar utilizando funções é reduzir a complexidade do código e simplificar sua escrita. 162 Curso de Linguagem C Forma geral n A forma geral da declaração de uma função é: tipo nome_função(lista_parâmetros) declaração de parâmetros { corpo da função } n Caso não seja especificado o tipo da função, ela será do tipo int. 30 30 Curso de Linguagem C 175 Curso de Linguagem C Preprocessador n Antes do programa ser compilado, ele é submetido ao preprocessador. Esta característica é muito útil. n Todos os comandos do preprocessador são iniciados por um sinal #, sendo os dois mais usados: • #define • #include 176 Curso de Linguagem C #define n O comando define serve para definir um identificador e uma string. O compilador substituirá o identificador pela string toda vez que for encontrado no arquivo- fonte. O identificador é chamado de nome de macro, e o processo de substituição é chamado de substituição de macro. #define indentificador string 177 Curso de Linguagem C Exemplo #define mensagem “Isto é um teste.\n” #define verdadeiro 1 #define falso !verdadeiro main() { if (verdadeiro) printf(mensagem); if (falso) printf(mensagem); } 178 Curso de Linguagem C #include n Instrui o compilador a incluir um outro arquivo fonte com aquele que contém o comando #include. O nome do arquivo a ser incluído deve estar entre aspas ou entre o sinal de maior e menor. n Se o nome do arquivo for colocado entre aspas, o compilador procurará pelo arquivo na seguinte seqüência: diretório atual, diretórios configurados no compilador e diretórios padrões. Caso o nome do arquivo esteja entre < >, não será procurado no diretório atual. 179 Curso de Linguagem C Entrada e saída n A entrada e saída em C é feita utilizando-se funções da biblioteca do compilador, não existe nenhuma palavra reservada para esta finalidade. n Existem dois sistemas de entrada e saída em C: • Bufferizado • Não bufferizado n O padrão ANSI só define o primeiro. 180 Curso de Linguagem C Arquivo cabeçalho stdio.h n Muitas bibliotecas em C exigem que certos tipos de dados ou outras informações sejam partes dos programas que as usam. Para isto, é necessário utilizar o comando #include e incluir arquivos cabeçalho com estas definições nos programas. #include <stdio.h> 31 31 Curso de Linguagem C 181 Curso de Linguagem C Filas de bytes n O sistema de arquivo bufferizado destina-se a trabalhar com uma variedade de dispositivos, que inclui terminais, acionadores de disco e acionadores de fita. n Embora cada dispositivo seja diferente, o sistema de arquivo bufferizado transforma cada um em um dispositivo lógico chamado fila de bytes. 182 Curso de Linguagem C Arquivos n Em C, um arquivo é um conceito lógico que o sistema pode aplicar a qualquer coisa, desde arquivos em disco até terminais. n Para associar uma fila de bytes a um determinado arquivo, basta realizar uma operação de abertura. n Todas as filas de bytes são iguais. n Nem todos os arquivos são iguais. 183 Curso de Linguagem CSistema de entrada e saída buferizado n O sistema de entrada e saída bufferizado é composto de várias funções relacionadas. n Para utiliza-las, é necessário incluir o arquivo-cabeçalho stdio.h no programa. 184 Curso de Linguagem C O ponteiro do arquivo n É o que mantém unido o sistema de entrada e saída bufferizado. n É um ponteiro para a informação que define vários aspectos do arquivo, incluindo nome, status e posição corrente. n Um ponteiro de arquivo é uma variável de ponteiro do tipo FILE, que é definida em stdio.h. 185 Curso de Linguagem C Algumas funções Nome Função fopen() abre uma fila fclose() fecha uma fila putc() grava um caracter na fila getc() lê um caracter na fila fseek() ajusta a posição atual no arquivo fprintf() printf para a fila fscanf() scanf para a fila feof() indica se a marca EOF foi encontrada ferror() indica se ocorreu um erro rewind() reposiciona no início do arquivo remove apaga um arquivo 186 Curso de Linguagem C fopen() n Abre uma fila de bytes para ser usada e liga um arquivo a esta fila. n Protótipo: FILE *fopen(char *nome_arq, char *modo); n onde modo é uma string que contém o status de abertura desejado. n nome_arq é uma string com um nome de arquivo válido para o sistema operacional, podendo incluir drive e diretório. n Retorna NULL ( = 0 ) se a função falhar. 32 32 Curso de Linguagem C 187 Curso de Linguagem C Valores legais de modo Modo Significado r abre um arquivo-texto para leitura w cria um arquivo-texto para gravação a anexa a um arquivo-texto rb abre um arquivo binário para leitura wb cria um arquivo binário para gravação ab anexa a um arquivo binário r+ abre um arquivo-texto para leitura/gravação w+ cria um arquivo-texto para leitura/gravação a+ abre ou cria um arquivo-texto para leitura/gravação r+b abre um arquivo binário para leitura/gravação w+b cria um arquivo binário para leitura/gravação a+b abre um arquivo binário para leitura/gravação rt abre um arquivo-texto para leitura wt cria um arquivo-texto para gravação at anexa a um arquivo-texto r+t abre um arquivo-texto para leitura/gravação w+t cria um arquivo-texto para leitura/gravação a+t abre ou cria um arquivo-texto para leitura/gravação 188 Curso de Linguagem C fclose() n Fecha uma fila que foi aberta com fopen(). n Todas as filas devem ser fechadas antes que o programa termine. n Protótipo: int fclose(FILE *arquivo); 189 Curso de Linguagem C ferror() e rewind() n ferror() determina se a última operação com arquivos produziu um erro (devolvendo 1 caso tenha ocorrido). n rewind() reposiciona no início do arquivo. n Protótipos: int ferror(FILE *arquivo); void rewind(FILE *arquivo); 190 Curso de Linguagem C getc() e putc() n São utilizados para ler e gravar caracteres numa fila previamente aberta. n Protótipo: int putc(int caracter, FILE *arquivo); int getc(FILE *arquivo); n putc devolve o caracter gravado em caso de sucesso, em caso de erro EOF(definido em stdio.h) será devolvido. n getc devolve um inteiro mas com o byte superior zero. Ele devolve EOF quando alcançar o fim do arquivo. 191 Curso de Linguagem C fprintf() e fscanf() n São os correspondentes a printf e scanf do sistema de entrada e saída do console. A diferença é que o primeiro parâmetro é um ponteiro de arquivo. n Protótipos: int fprintf(FILE *arq, const char *controle, ...); int fscanf(FILE *arq, const char *controle, ...); 192 Curso de Linguagem C fgets() e fputs() n São as correspondentes a gets e puts para arquivos. n Protótipos: char *fputs(char *str, FILE *arquivo); char *fgets(char *str, int comprimento, FILE *arquivo); n Observe que em fgets pode ser especificado o comprimento máximo da string e, ao contrário do gets, o \n final é colocado na string. 35 35 Curso de Linguagem C 205 Curso de Linguagem C Ponteiros para estruturas n Em C, podem ser declarados ponteiros para estruturas. n Forma geral: struct pessoa *primeiro; 206 Curso de Linguagem CVantagens de se usar ponteiros para estruturas n Fazer chamada por referência para uma função; n Criar listas ligadas com estruturas dinâmicas de dados usando o sistema de alocação. n É mais rápido passar estruturas grandes por referência (usando ponteiros) do que por valor, pois estamos passando apenas um endereço. 207 Curso de Linguagem CAcessando os elementos usando ponteiros para estruturas n Veja a declaração: struct pessoa *primeiro, segundo; strcpy(segundo.nome, “José”); segundo.idade = 10; primeiro = &segundo; n Para acessar o campo idade de primeiro: (*primeiro).idade primeiro -> idade 208 Curso de Linguagem CVetores, matrizes e estruturas dentro de estruturas n Os elementos das estruturas podem ser simples ou complexos, assim, podemos colocar vetores, matrizes e até estruturas dentro das estruturas. Veja: struct complexa { char setor[21]; struct pessoa funcionarios[50]; } 209 Curso de Linguagem C Campos de bit n C possui metodos para acessar somente um bit dentro de um byte. Isto é útil para: • Economizar memória declarando várias variáveis booleanas num só byte • Comunicar com dispositivos que transmitem informações diversas codificadas em bytes • Rotinas de codificação que precisam acessar bits dos bytes 210 Curso de Linguagem C Como declarar campos de bit n Os campos de bit só podem ser declarados dentro de estruturas. n Forma geral: struct nome_estrutura { tipo1 var1 : comprimento; tipo2 var2 : comprimento; } nome_var ; n Os tipos podem ser: int, signed e unsigned. Quando o tamanho é 1, ele deve ser obrigatoriamente unsigned. 36 36 Curso de Linguagem C 211 Curso de Linguagem C Exemplo struct dispositivo { unsigned ativo : 1; unsigned pronto : 1; unsignet erro : 1; unsigned : 2; unsigned ultimo_erro : 3; } 212 Curso de Linguagem C Uniões n Em C, uma união é uma localização de memória que é usada por muitas variáveis diferentes, que podem ser de tipos diferentes. n A declaração e o acesso a uma união é feita de forma semelhante as estruturas, só que usando a palavra reservada union no lugar de struct. 213 Curso de Linguagem C Exemplo union dois_bytes { int inteiro; char caracter[2]; } valor; main() { valor.inteiro = ‘A’ * 256 + ‘B’; printf(“%c %c”, valor.caracter[0], valor.caracter[1]); } 214 Curso de Linguagem C Enumerações n Enumeração é um conjunto de constantes inteiras com nome e e especifica todos os valores legais que uma variável daquele tipo pode ter. n Para declarar: enum nome_tipo { lista de constantes } nome_var; n Todas as constantes receberão valores inteiros a começar por zero, a não ser que seja especificado o contrário. 215 Curso de Linguagem C Exemplo enum tamanhos {pequeno, medio, grande = 5} tamanho; main() { tamanho = pequeno; printf(“%d”, tamanho); tamanho = medio; printf(“%d”, tamanho); tamanho = grande; printf(“%d”, tamanho); } 216 Curso de Linguagem C sizeof n Como estamos trabalhando só com computadores IBM PC, até agora, não nos preocupamos com os tamanhos das variáveis pois já sabemos seus valores. n C possui o operador sizeof com a finalidade de garantir a portabilidade dos programas entre ambientes cujos tamanhos das variáveis sejam diferentes. n sizeof retorna a quantidade de bytes que uma variável ocupa na memória. 37 37 Curso de Linguagem C 217 Curso de Linguagem C Exemplos n Alocar memória para 10 floats: float *numeros; numeros = (float *) calloc(10, sizeof(float)); n Imprimir o tamanho gasto por uma variável inteira: printf(“%d”, sizeof(int)); 218 Curso de Linguagem C typedef n C permite que sejam definidos explicitamente novos tipos de dados usando a palavra reservada typedef. n typedef não cria realmente uma nova classe de dados, mas sim define um novo nome para uma tipo já existente. n O uso do typedef torna os programas em C mais legíveis e mais portáteis pois bastará alterar a definição do typedef quando trocar de ambiente. 219 Curso de Linguagem C Exemplo n Após as definições: typedef float balanco; typedef char string[21]; typedef struct pessoa tipo_pessoa; n As seguintes declarações serão equivalentes: balanco valor; float valor; string frase; char frase[21]; tipo_pessoa aluno; struct pessoa aluno; 220 Curso de Linguagem C Operadores avançados n C possui vários operadores especiais que aumentam em muito sua força e flexibilidade - especialmente na programação a nível de sistema. 221 Curso de Linguagem C Operadores bit a bit n Como C foi projetada para substituir a linguagem assembly na maioria das tarefas de programação, ela possui um completo arsenal de operadores bit a bit. n Os operadores bit a bit só podem ser usados nos tipos char e int. 222 Curso de Linguagem C Tabela dos operadores bit a bit Operador Ação & E | OU ^ OU exclusivo (XOR) ~ Complemento de um (NOT) >> Deslocar para direita << Deslocar para esquerda 40 40 Curso de Linguagem C 235 Curso de Linguagem C Erros por um n Todos os índices dos vetores e matrizes em C começam em 0. Logo, o programa abaixo está errado. main() { int x, num[100]; for (x = 1; x <= 100; x ++) num[x] = x; } 236 Curso de Linguagem C Erros de limite n Muitas funções em C (inclusive as das bibliotecas) não possuem (ou possuem pouca) verificação de limites. Assim, a chamada a gets abaixo pode gerar um problema caso o usuário digite mais que 20 caracteres. main() { char texto[21]; gets(texto); } 237 Curso de Linguagem COmissões de declaração de função n Esquecer de definir o protótipo de uma função pode causar erro pois o compilador estará esperando sempre que as funções não declaradas retornem um inteiro. O mesmo problema ocorre também com os parâmetros. 238 Curso de Linguagem C Erros de argumentos de chamada n Os argumentos passados a uma função devem ser do mesmo tipo do esperado por elas. O programa abaixo está errado: main() { int x; char string[10]; scanf(“%d%s”, x, string); } 239 Curso de Linguagem C Exercício (parte 1) n Faça um programa que leia 5 nomes com suas respectivas idades e mostre o maior e o menor. n Vamos dividir o problema em partes, primeiro vamos definir uma estrutura contendo um campo nome e um campo idade: typedef struct { char nome[21]; int idade; } pessoa; 240 Curso de Linguagem C Exercício (parte 2) n Vamos definir a função mais_velho que recebe 2 ponteiros do tipo pessoa e retorna um ponteiro para a pessoa mais velha: pessoa *mais_velho(pessoa *p1, pessoa *p2); { if (p1 -> idade < p2 -> idade) return p2; else return p1; } 41 41 Curso de Linguagem C 241 Curso de Linguagem C Exercício (parte 3) n Vamos definir a função mais_novo que recebe 2 ponteiros do tipo pessoa e retorna um ponteiro para a pessoa mais nova: pessoa *mais_novo(pessoa *p1, pessoa *p2); { if (p1 -> idade > p2 -> idade) return p2; else return p1; } 242 Curso de Linguagem C Exercício (parte 4) n Vamos definir a função le_pessoa que recebe um ponteiro do tipo pessoa e faz a leitura do teclado: void le_pessoa(pessoa *p) { printf(“Nome: ”); gets(p -> nome); printf(“Idade: ”); scanf(“%d”, p -> idade); } 243 Curso de Linguagem C Exercício (parte 5) n Vamos definir a função mostra_pessoa que recebe um ponteiro para uma pessoa e mostra seus dados na tela. void mostra_pessoa(pessoa *p) { printf(“Nome: %s\nIdade: %d\n”, p->nome, p->idade); } 244 Curso de Linguagem C Exercício (parte 6) n Agora só falta declarar as variáveis e definir o programa principal, que será composto por um loop de entrada, um loop de pesquisa e a apresentação dos resultados. n Dividindo o código do programa, fica mais fácil resolver os problemas e verificar os erros que possam ocorrer. 245 Curso de Linguagem C Exercício (parte 7) main() { pessoa pessoas[5], *velho, *novo; int i; for(i = 0; i < 5; i++) le_pessoa(&pessoas[i]); velho = novo = pessoas; for(i = 1; i < 5; i++) { velho = mais_velho(velho, &pessoas[i]); novo = mais_novo(novo, &pessoas[i]); } puts(“O mais novo é\n”); mostra_pessoa(novo); puts(“O mais velho é\n”); mostra_pessoa(velho); }
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved