Baixe o app para aproveitar ainda mais
Prévia do material em texto
Programação em C PRC Parte 02 – Introdução a Linguagem C Prof. Victor Thomaz www.sites.google.com/site/professorvictorthomaz/materialprc Linguagem C - Origens • Criada por Dennis Ritchie (em um Sistema Operacional Unix) na década de 1970 nos Laboratórios Bell (Bell Labs) • É derivada da Linguagem B, criada por Ken Thompson no final do anos 1960, que por sua vez foi influenciada pela Linguagem BCPL inventada por Martin Richards Linguagem C - Origens Da esquerda para direita: Ken Thompson (Criador da linguagem B) e Dennis Ritchie (Criador da Linguagem C). Fonte: pt.wikipedia.org Linguagem C - Origens • Com a popularização dos microcomputadores muitas implementações da linguagem C foram criadas • O ANSI (American National Standards Institute) criou um comitê em 1983 para criar um padrão para definir a linguagem • Anteriormente, era considerada como padrão a versão fornecida com o Sistema Operacional Unix versão 5 Linguagem C • É considerada uma linguagem de nível médio • Relembrando: – Alto nível: Linguagem mais próxima do entendimento humano (Linguagem com instruções mais próximas do inglês) – Baixo nível: Mais próxima da linguagem de máquina (Instruções binárias) • Quanto mais clara para o ser humano mais obscura será para máquina. • É estruturada. Tarefas divididas em sub-rotinas/função, variáveis locais, suporta laços de repetição, blocos de comandos (entre { }) Linguagem C • Médio nível não significa menos poderosa ou menos desenvolvida que uma linguagem de alto nível. • A linguagem C combina elementos de alto nível com funcionalidades de linguagens de baixo nível. • C suporta: Conceito de tipo de dados, manipulação de bits, bytes e endereços, portabilidade (software escrito para Windows funciona no Linux, por exemplo) Linguagem C – Função main #include <stdio.h> int main(){ printf(“Programa simples em C.\n”); return 0; } Softwares • Windows: – Dev C++ IDE (Integrated Development Environment) – Site: www.bloodshed.net/devcpp.html – CodeBlocks – Site: www.codeblocks.org/ • Linux: – Linha de comando (Shell) + Editor de texto – Compilador GCC (“GNU” C Compiler) – Comando para compilar: gcc arquivoFonte.c –o arquivoExecutavel Termos Úteis • Código Fonte: Texto codificado de acordo com a linguagem de programação que o programador escreve. É a entrada para o compilador C. • Código Objeto: É código fonte traduzido para código de máquina. Ou seja, o programa que o computador é capaz de executar. O código objeto é a entrada para o Linkeditor. • Linkeditor: Combina o código que o programador escreveu com as funções presentes em bibliotecas que foram compiladas separadamente. • Biblioteca: Arquivo que contém funções úteis que podem ser utilizadas pelo programa que será desenvolvido. • Tempo de Compilação: Eventos que acontecem no momento da compilação do código fonte. Exemplo: Erro do sintaxe. • Tempo de Execução: Eventos que ocorrem quando o programa está sendo executado. Palavras Reservadas/Palavras-Chave • Lista com as 27 Originais + 5 comitê ANSI: • 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 Palavras Reservadas/Palavras-Chave • Todas as palavras reservadas são escritas com letras minúsculas. • if é uma palavra reservada mas IF não é. • Lembre-se, a linguagem C considera como nomes de variáveis diferentes em maiúsculo ou minúsculo • int num é diferente de int Num Palavras Reservadas/Palavras-Chave • Programa em C consiste em uma ou mais funções • A função main() precisa estar presente em todos os programas • Não tente usar main() como nome de variável pois compilador irá se confundir Cinco Tipos Básicos de Dados • Caractere: char • Inteiro: int • Ponto flutuante: float • Ponto flutuante de precisão dupla: double • Sem valor: void Todos os tipos do padrão ANSI • 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 Modificadores de Tipo • signed • unsigned • long • short Nome de Identificadores • Identificadores são utilizados definição de variáveis e funções, por exemplo. • Primeiro caractere deve ser letra ou sublinhado(underline) • Restante pode ser letras, números ou sublinhados • Exemplo: • Certo – cont, ab23, v_nota; • Errado – 1cont, ab!cd, v...nota; Variáveis • Posição nomeada de memória • int cont, i, a, b; • unsigned int ui; • float dinheiro, p, notasAlunos[3]; • double custo, m, n[100]; • char letra, nome[20];//Vetor deve terminar com o caractere “\0” Variáveis Locais • Variáveis acessíveis dentro do bloco • Bloco de código inicia com { e termina com } • Só existem enquanto o bloco de código está sendo executado • É criada no início da execução do bloco e destruída na saída Variáveis Locais - Exemplo void func1(void) { int x; x = 10; } void func2(void){ int x; x = -199; } void f(int t){ if (t==1) { char s[80]; //Só existe dentro do bloco do if printf(“Digite um nome:"); gets(s); } printf(“letra em s %c”, s[2]);/*Não posso fazer isso. Está fora do bloco de declaração da variável /* } Variável Global • Reconhecidas em todo o programa • Guardam os valores durante toda a execução • São declaradas fora de qualquer função, em lugar anterior a seu primeiro uso. Inicialização de Variáveis • char letra = ‘a’; • int num = 4; • float valor = 276.34; • int vetor[5] = {67, 13, 77, 9, 10}; • int number[3] = { [0] = 5, [2] = 7 };//Elemento [1] = 0, implicitamente • int matriz[2][3] = {{1,2,3},{4,5,6}}; Operadores - Atribuição • Sinal de igual = • Nome_variavel = algum_valor • Exemplo: • a = 5; • nota = 4 * (2 + 1) / 2; • Atribuição Múltipla: • x = y = z = 0;// Todas as variáveis com valor “0” Operadores Aritméticos • Subtração – • Adição + • Multiplicação * • Divisão / • Módulo % • Incremento ++ • Decremento -- PRECEDÊNCIA OPERADOR Alta + + - - - (Menos unário) * / % Baixa + - Operadores Aritméticos • Incremento ++ – Se usado antes do operando (variável), incrementa o valor e depois utiliza o valor já incrementado. • Ex.: X = 10; Y = ++X;//Y recebe 11 – Se usado depois do operando (variável), utiliza o valor e somente depois incrementa. • Ex.: X = 10; Y = X++;//Y recebe 10 • Decremento -- – O operador decremento possui o mesmo comportamento, porém decrementando o valor. • Ex.: X = 10; Y = --X;//Y recebe 9 • Ex.: X = 10; Y = X--;//Y recebe 10 Falso e Verdadeiro em C • Muito utilizado nos comandos de decisão e repetição, onde expressões condicionais são avaliadas resultando em valores lógicos Verdadeiro ou Falso. De acordo com o resultado lógico, uma ação é executada ou não. • Verdadeiro: É sempre um valor diferente de zero, incluindo números negativos, mas também pode ser considerado como 1 (um). • Falso: É exatamente o valor zero. Operadores Relacionais OPERADOR AÇÃO > Maior que >= Maior ou igual < Menor que <= Menor ou igual == Igual != Diferente • Expressões que utilizam operadores relacionais ou lógicos retornam 0 (zero) para FALSO e 1 para VERDADEIRO. Operadores Lógicos OPERADOR AÇÃO && E (AND) || OU (OR) ! NÃO (NOT) Operadores Lógicos P Q P && Q P || Q !P 0 0 0 0 1 0 1 0 1 1 10 0 1 0 1 1 1 1 0 • Exemplo: 10>5 && !(10<9) || 3<=4 • Resultado é VERDADEIRO Precedência de Operadores Lógicos e relacionais PRECEDÊNCIA OPERADORES Alta ! > >= < <= == != && Baixa || Exemplo 1: !0 && 0 || 0 resultado é FALSO Exemplo 2: !(0 && 0 )|| 0 resultado é VERDADEIRO Obs.: O operador ! (NOT) é avaliado primeiro Exemplo 3: int x; x = 100; printf(“%d”, x > 10); Função de Entrada e Saída Formatada – printf() • printf(<string_de_controle>,<lista_de_argume ntos>); • string_de_controle: Parte textual apresentada na tela. Define a posição em que as variáveis serão posicionadas, através dos especificadores de tipo com o caractere % . • lista_de_argumentos: Lista de variáveis separadas por vírgula e na ordem dos especificadores na lista de argumentos. • Ex.: printf(“valor do inteiro %d”, x); Função de Entrada pelo Console • scanf(<especificador_tipo>,<endereço_variavel>); • especificador_tipo: Utilizado com o caractere %, define o tipo de dado que será lido. • endereço_variavel: Indica uma variável para se armazenar o valor. O & indica o endereço de memória da variável. • Ex.: scanf(“%c”,&letra); Exercício • Crie um programa em C que leia dois números inteiros e apresente na tela os resultados das operações de soma, subtração, divisão, multiplicação e resto. • Utilize o comando printf para apresentar o resultado das operações abaixo. Observe o comportamento dos operadores incremento e decremento. • Ex.: resultado1 = a + (b++); • resultado2 = a + (++b); Exercício • Construa um programa que receba três notas de alunos e seus respectivos nomes e imprima na tela. Um aluno e sua nota por linha. Crie uma variável para o nome e outra para a nota. • Ex.: Aluno: João Nota: 7.3 Aluno: Fulano Nota: 4.7 Aluno: Beltrano Nota: 8.9 Decisão ou Seleção – if else • if ( expressão ) comandoA; else comandoB; • Onde: comando é um único comando ou um bloco de comandos {} ou pode ser omitido. A cláusula else é opcional Decisão ou Seleção – if else • Exemplo: • if (opcao == 1) printf(“Você escolheu opção 1.”); else printf(“Você escolheu opção diferente de 1.”); Decisão ou Seleção – if else • Exemplo com bloco. Necessário quando existe mais de um comando: • if (opcao == 1){ //Início do bloco printf(“Você escolheu opção 1.”); printf(“Não foi uma boa escolha!”); } //Fim do bloco else printf(“Você escolheu opção diferente de 1.”); Decisão ou Seleção – if else • Exemplo com bloco e aninhado: • if ( i ){ //Início do bloco. if( j ) // Este if não tem else associado a ele. comandoA(); if( k ) //Possui o else logo abaixo associado a ele. comandoB(); else // else associado ao if (k). comandoC(); } //Fim do bloco if ( i ) else // Associado ao if (i). comandoC(); Decisão ou Seleção – if else • Exemplo com vários if aninhados: • if ( i ) comandoA(); else if( j ) comandoB(); else if ( k ) comandoC(); else comandoD(); Exercícios • Faça um programa em C para ler a temperatura de uma pessoa e exibir a mensagem “ESTÁ COM FEBRE” ou “ESTÁ NORMAL”. Considere o valor base como 36.5. • Faça um programa que solicite o sexo do usuário (M ou F) e a seguir informe a mensagem “Homem”, “Mulher” ou “Letra inválida”. Faça uma versão com if e outra com switch (Veremos a seguir). Decisão ou Seleção – Switch • É uma estrutura de seleção múltipla que testa uma expressão sobre uma lista de constantes, que pode ser de inteiros ou caracteres. Quando uma correspondência for encontrada, o comando que está associado a constante será executado. • switch ( expressão ){ case constant1 : comandoA; break; case constant2 : comandoB; break; case constant3 : comandoC; break; default : comandoD; break; //Poderia ser omitido já que é a última opção dentro do switch } Decisão ou Seleção – Switch • A expressão no switch não pode ser sobre números reais (float/double). O resultado da expressão é testado sobre cada constante após o case. • switch só testa igualdade, if pode avaliar qualquer tipo de expressão lógica ou relacional. • break faz com que a execução dos comandos dentro do case termine. Se break for omitido de um case, então a execução continua em outros case até encontrar um break ou terminar o switch. Decisão ou Seleção – Switch - Exemplo switch(ch) { //ch é uma variável do tipo char case ‘A’: printf(“A escolhido. \n"); break; case ‘B’: printf(“B escolhido. \n"); break; case ‘C’: printf(“C escolhido. \n"); break; default : printf(“Nenhuma opção anterior foi selecionada. \n"); }//Fim switch Decisão ou Seleção – Operador ? • O operador ? É ternário necessitando de três operandos conforme a forma geral abaixo: • Op1 ? Op2 : Op3 • Onde Op1, Op2 e Op3 são expressões avaliadas da seguinte maneira: • Op1 é uma expressão condicional que é avaliada primeiro. Se o resultado for VERDADEIRO, então Op2 é avaliado e se torna o valor de toda a expressão. Se o resultado de Op1 for FALSO, então Op3 é avaliado e se torna o valor de toda a expressão. Decisão ou Seleção – Operador ? • O operador ? Pode ser utilizado para substituir um if else conforme exemplo abaixo: • x = 10; if (x > 9) y = 100; else y = 200; • Equivalente a: • x = 10; y = x>9 ? 100 : 200 • Em ambos os casos, y recebe o valor 100. Se o valor de x for menor que 9, então y recebe 200. Repetição - While • while (expressão) comandoA; • Enquanto o resultado da expressão for verdadeiro (diferente de zero), a linha comandoA será executada. Se o resultado da expressão for falso, então a execução é desviada para a linha imediatamente posterior ao comando while. • comandoA pode ser uma chamada de função, bloco de comandos. Repetição - While char letra; while(letra != 'A'){ printf("Digite qualquer letra ou 'A' para sair.\n"); scanf("%c",&letra); } printf("Você digitou 'A'.\n"); /*Comando imediatamente após o fim do loop(repetição)*/ Repetição – Do While • É uma variação do loop while, porém ao invés de testar a expressão antes de executar o loop, o teste é feito ao final. Desta forma o loop será executado pelo menos uma vez. • do { comandoA; }while(expressão); • As chaves do bloco podem ser omitidas se houver somente um comando dentro do loop. • Enquanto a expressão for verdadeira, a execução ficará “presa” dentro do loop. Repetição – Do While • do { scanf(“%d”, &num); } while (num < 100); • Neste trecho de código a execução do loop só termina quando um número maior ou igual a 100 for digitado. • Pelo menos na primeira iteração o comando scanf será chamado. Repetição - For • Uma outra forma de executar repetidamente um conjunto de instruções é através do for. • for (inicialização; condição; incremento) comandoA; • Inicialização é onde será a atribuído um valor inicial para variável de controle do loop. • Condição é uma expressão relacional que determina a condição de parada do loop. • Incremento define como a variável de controle do loop muda cada vez que o loop é repetido. • ComandoA pode ser um bloco de comandos ou único comando/chamada de função/ etc. Repetição - For • int x; for (x = 1; x <= 100; x++) printf(“%d \n”,x); • Este exemplo apresenta na tela os número de 1 até 100. • A variável x é inicializada com o valor 1. Enquanto a condição x <= 100 for verdadeira, a função printf será chamada. A cada iteração(execução dos comandos dentro do loop) o valor de x é incrementado em uma unidade. Repetição - For • int x = 10; for (y = 10; x != y ; y++ ){printf(“Olá ”); printf(“Mundo!”); } • Importante observar que o código dentro de um loop for pode nunca ser executado, pois a condição de parada é verificada antes da execução dos comandos internos. • No exemplo, logo na primeira verificação da condição, x será igual a y e as funções printf nunca serão executadas. Comandos de Desvio • A linguagem C permite o desvio da execução do programa conforme apresentado a seguir: • return = retorna valor de uma função. • goto = desvia a execução para a posição do identificador label. • break = Força a finalização da execução de um loop. Termina a execução de um case no switch. • exit() = Função que interrompe a execução do programa inteiro. • continue = continue força uma nova iteração do loop. Após a chamada de continue, a condição de parada é testada e a variável de controle é incrementada. Vetor • É uma coleção de valores de um mesmo tipo referenciados por um mesmo nome. • Os elementos nos vetores são acessados através de índices. • Forma geral: tipo nome_var [tamanho] • Tipo indica o tipo de dado de cada elemento no vetor. Nome_var é um identificador válido e tamanho define quantos elementos o vetor irá armazenar. Vetor • Veja abaixo a declaração de um vetor chamado notas do tipo float com capacidade para armazenar dez elementos. • float notas[10]; • notas[3] = 6.7; Atribui o valor 6.7 ao quarto elemento do vetor notas. Diferentemente da declaração do vetor, o número entre colchetes representa a posição de um único elemento não o tamanho do vetor. • O vetor notas possuí 10 elementos, notas[0] até notas[9]. Exercícios • Crie um programa em C que armazene em um vetor três números inteiros positivos digitados pelo usuário e informe na tela qual é o maior número armazenado no vetor. String – Vetor de char • Uma string é um vetor de caracteres terminado com o caractere nulo (‘\0’). • Ao declarar um vetor de caracteres lembre-se de determinar o tamanho do vetor suficiente para armazenar a string e ainda o caractere nulo (‘\0’). • Exemplo: char nome[31]; //Armazena uma string de 30 caracteres e na última posição o caractere ‘\0’. String – Vetor de char • Constante do tipo string: É um conjunto de caracteres entre aspas. • Exemplo: “Olá mundo!”. • No caso de constante string, o compilador atribui o caractere nulo no fim da string automaticamente. • Exemplo: charmensagem[20] = “Olá alunos de PRC.”//Frase com 18 caracteres(incluindo os espaços) mais o caractere nulo no final. String – Vetor de char • Declaração e inicialização: • Char cor[10] = “azul”;//Inclui nulo automaticamente • Char cor[10] = { ‘a’, ‘z’, ‘u’, ‘l’, ‘\0’}; • Char cor[] = “azul”;//Tamanho determinado pelo //comprimento da string. • As declarações acima são equivalentes. String – Vetor de char • Para obter uma string do usuário, veja o exemplo: char frase[51]; puts(“Informe uma string:”); gets(frase); printf(“Conteúdo de frase: %s \n”, frase); • A função gets armazena tudo o que foi digitado pelo usuário antes do mesmo digitar ENTER e inclui o caractere nulo (‘\0’) no fim da string. • A função puts apresenta uma string na tela e posiciona o cursor em uma nova linha. É geralmente utilizada quando não é necessário apresentar conteúdo de variáveis com formatação como no printf. • São funções presentes no cabeçalho stdio.h. String – Vetor de char • Funções de Manipulação de Strings mais comuns: • strcpy • strcat • strlen • strcmp • strchr • strstr • OBS.: Inclua a biblioteca string.h para utilizar estas funções. Exercícios • Crie um programa em C que verifique se duas strings digitadas pelo usuário são iguais ou diferentes. • Crie um programa em C que busque uma palavra digitada pelo usuário em uma string também informada pelo usuário. Matriz • Uma matriz pode ser considerada como um vetor multidimensional. A matriz mais comum é composta por duas dimensões. • O exemplo abaixo declara uma matriz de números inteiros com duas dimensões de nome m e tamanho 10, 20: • int m[10][20]; • O número entre colchetes mais a esquerda representa a quantidade de linhas e o mais a direita o número de colunas. Matriz • O trecho de código abaixo atribui os valores de 1 até 12 em uma matriz 3x4. • int t, i, num[3][4]; for (t=0; t<3;++t) for (i=0; i<4; ++i) num[t][i] = (t*4)+i+1; Linha/Coluna 0 1 2 3 0 1 2 3 4 1 5 6 7 8 2 9 10 11 12 Matriz de char ou Matriz de strings • É comum em C o uso de uma matriz que armazena várias strings. • Exemplo: char listaAlunos[50][36]; • A matriz listaAlunos possui 50 linhas e 36 colunas. Neste caso, esta é uma matriz do tipo char, logo podemos interpretar que o tamanho mais a esquerda [50] determina a quantidade de strings e tamanho da direita [36] representa o comprimento máximo de cada string. Matriz de char ou Matriz de strings • Para armazenar uma única string em uma linha da matriz de char (lista de strings) utilize a função gets como abaixo: • gets(listaAluno[2]); • Neste caso, uma string será armazenada na terceira linha da matriz, onde cada caractere ocupará uma célula em várias colunas. • Semelhantemente pode-se usar a função puts para apresentar o conteúdo de uma linha inteira da matriz. • puts(listaAluno[2]);//ou printf(“%s”, listaAluno[2]); • Ou utilizar a função printf, porém acessando uma célula da matriz por vez. • printf(“%c”, listaAluno[2][0]); Exercícios • Crie um programa em C que peça para usuário digitar dez caracteres e armazene-os em uma matriz 5x2. Após, apresente na tela todos os caracteres que o usuário digitou. • Crie um programa em C que armazene uma lista de telefones em uma matriz de strings. Cada telefone deve estar em uma linha da matriz. Peça para o usuário digitar os números no formato (00)0000-0000. Ponteiros • Uma variável em C é um espaço reservado na memória para armazenar um conteúdo (int, float, char, etc). • O nome de uma variável está associado a um endereço de memória utilizado para localizar este espaço que foi reservado. • Uma variável do tipo ponteiro armazena um endereço de memória. Ponteiros • Exemplo: int *ptr; //Ponteiro para um dado do tipo Inteiro int val = 1; ptr = &val; //Variável ponteiro recebe o endereço de val printf("Dado do armazenado no endereco: %d\n", *ptr); printf("Valor da variável ptr: %p\n", ptr); • Ponteiros são, utilizados com estruturas de dados dinâmicas (e.g. Listas encadeadas e Árvores Binárias), para alocação dinâmica de memória, etc. • Cuidado! Ponteiro com valor inválido pode fazer seu programa travar/fechar. “Bugs” em programas com ponteiros são difíceis de encontrar. Ponteiros • Fonte: http://darksiren.net/stuff/ Ponteiros • Fonte: http://codingsihalen.blogspot.com.br/2013/03/8-c-pointers.html Ponteiros • Uma variável que armazena um endereço de memória é chamada de ponteiro. • Se uma variável armazena o endereço de memória de outra variável, dizemos que a primeira variável “aponta” para a segunda. • Declaração: tipo * nome_var; • tipo indica o tipo de dado que o ponteiro irá apontar. Ponteiros • Operadores: • & : Retorna o endereço de memória de seu operando. Ex.: m = &cont; //m receberá o endereço de memória a variável cont. O operador “&” é utilizado, normalmente, para retornar o endereço de variáveis que não são ponteiros. • * : Retorna o valor contido no endereço de memória. Ex.: q = *m; //Se m contém o endereço de cont, q recebe o valor da variável cont. Ponteiros • Aritmética de Ponteiros: – É permitido a utilização de duas operações aritméticas com ponteiros: adição e subtração.– Considere int *p1, se o endereço em p1 é 2000 e cada número inteiro ocupa dois bytes na memória, então depois da expressão p++, p1 terá o endereço 2002 e não 2001 como era de se esperar. Incrementando p1 ele deve apontar para o próximo inteiro na memória, mas o tipo inteiro neste exemplo ocupa duas posições, logo p1 apontará para o endereço 2002. – OBS.: A aritmética com ponteiros depende do tipo de dado especificado (char, int, float, etc) na declaração do ponteiro, que pode ocupar uma ou várias posições de memória, dependendo também da plataforma. Ponteiros • Fonte: http://www.c4learn.com/pointer-arithmatics-incrementing-pointer- variable-in-c-programming.html Ponteiros e Vetores • Ponteiros e Vetores em C podem ser utilizados de forma semelhante. • Exemplo: char str[80]; //Vetor de char char *p1; //Ponteiro para char p1 = str; //p1 recebeu o endereço de memória do primeiro //elemento do vetor str • Então, podemos acessar o 5º elemento no vetor str de duas formas: printf(“Quinta posição do vetor: %c”, str[4]); printf(“Quinta posição do vetor: %c”, *(p+4)); Vetores de Ponteiros • Podemos criar um vetor onde cada posição armazena um endereço de memória, ou seja, um vetor de ponteiros. • int *x[10]; //Vetor de ponteiros para o tipo int com //dez posições • int var = 8; • x[2] = &var;//Terceira posição do vetor recebe o endereço da variável var • printf(“Dado apontado pela posição x[2]: %d”, *x[2]); //Apresenta o valor de var na tela, ou seja, 8 Ponteiro para Ponteiro • Fonte: http://www.thegeekstuff.com/2012/01/advanced-c-pointers/ Ponteiro para Ponteiro • É um ponteiro que contém o endereço de memória de outro ponteiro. Este último aponta para a variável que possui o valor/dado/informação que será utilizado. • Declaração: float **ptrParaPtr; – Não é um ponteiro para um número float, mas um ponteiro para um ponteiro de float. • Exemplo: int x, *p, **q; x = 10; p=&x; q=&p; printf(“%d”, **q);//Apresenta o valor 10 da variável x Exercícios • Faça um programa em C que some dois números inteiros e armazene o resultado em uma variável. O valores devem ser somados utilizando ponteiros. • Crie um ponteiro para o tipo char que receba uma string digitada pelo usuário e a apresente na tela. Função • Forma geral: – tipo_retorno nome_função(lista_parametros) { corpo_função } • tipo_retorno: Especifica o tipo de dado retornado. Uma função pode retornar qualquer tipo de dado exceto vetor e matriz. Retorno void especifica que nenhum valor será retornado. • nome_função: Deve ser um identificador válido • corpo_função: Local para inserir o código que determina a finalidade da função. Função • Forma geral (Continuação): • lista_parametros: É uma lista que especifica variáveis e seus respectivos tipos. Cada parâmetro(variável) recebe valores dos argumentos quando a função é chamada. • Uma função pode não ter parâmetros, neste caso, a lista lista_parametros é vazia. Pode-se usar a palavra-chave void entre os parênteses para especificar isto ou simplesmente deixar somente os parênteses. • Ex.: func1(void) ou func1() Função #include <stdio.h> //Protótipo ou cabeçalho da função int numQuadrado(int x); int main(){ int t=10; printf(“Número %d elevado ao quadrado é: %d", t, numQuadrado(t)); return 0; } //Definição da função int numQuadrado (int x){ int r; r = x*x; return(r); } Função – Passagem Parâmetros • Chamada por valor: – Uma cópia do dado é passada para a função – float i; – func (i);//Chamada da função – float func (float num ){return num+1.0; } – //Valor de i permanece inalterado • Chamada por referência: – Um endereço de memória é passado para a função – float i; – func (&i); //Chamada da função – void func (float *num ){*num = *num+1.0; } – //Neste caso o valor de i é modificado, mesmo i estando fora //da função Função – Passagem Parâmetros • Uma função pode ter vários parâmetros. • Podemos modificar os valores dos parâmetros assim como fazemos com as variáveis “comuns”. void minhaFuncao(int x, float y, char *c){ x = x + (x*3); y = 2.2 + 2.2; strcpy(c,"Ola alunos!"); printf(“Valores %d %y %s”, x, y, c); } //char *c está sendo considerado como string, Se for passado uma string como argumento para função Função – Passando Vetor int getMaior(int vetor[TAM]){ int i, maior = 0; for(i=0;i<TAM;i++){ if (vetor[i] > maior ) maior = vetor[i]; } return maior; } int getMaior2(int *v){ int i, maior = 0; for(i=0;i<TAM;i++){ if (v[i] > maior ) maior = v[i]; } return maior; } Função - Passando Matriz int getMaior(int matriz[LIN][COL]){ int i, j, maior = 0; for(i=0;i<LIN;i++) for(j=0;j<COL;j++) if (matriz[i][j] > maior ) maior = matriz[i][j]; return maior; } int getMaior2(int (*m)[COL]){ int i, j, maior = 0; for(i=0;i<LIN;i++){ for(j=0;j<COL;j++) if (m[i][j] > maior ) maior = m[i][j]; } return maior; } Função - Biblioteca • Uma biblioteca é um arquivo ou conjunto de arquivos com várias funções definidas. • Exemplo: stdio.h é uma biblioteca. As funções printf e scanf estão definidas (implementadas) dentro desta biblioteca. Função - Biblioteca • É possível criarmos nossa própria biblioteca. • Crie um arquivo novo e escreva funções que desejar. Então, salve o arquivo com a extensão “.h” ao invés de “.c”. • Exemplo no arquivo “minhaBiblioteca.h”: int verificaInteiroNegativo(int n){ if (n > 0) return n; //Retorna o próprio número se positivo else return 0; //Se número é negativo } Função - Biblioteca • Para utilizar uma função em uma biblioteca inclua a diretiva #include “minhaBiblioteca.h” e faça a chamada da função normalmente. • Exemplo arquivo “principal.c”: #include <stdio.h> #include “minhaBiblioteca.h” main(){ int num = 65; printf(“%d”, verificaInteiroNegativo(num)); } Arquivos em C • Existe uma camada de abstração entre o programador e o dispositivo que pode ser o terminal ou um disco rígido, um drive de fita e etc. • Esta camada é chamada de stream. • Qual é a vantagem? O programador trabalha com os streams da mesma forma independente do dispositivo que está sendo utilizado. • Então uma mesma função que utiliza stream pode um arquivo no disco rígido ou em outro tipo de dispositivo. Arquivos em C • Código (biblioteca stdio): FILE *fp;//Ponteiro para “arquivo”. if ((fp = fopen("test","w"))==NULL) { printf(“Ocorreu alguma falha.\n"); exit(1); } • FILE: É uma estrutura (STRUCT), que define nome do arquivo, estado, posição do arquivo e etc. • fopen: É uma função que abre um stream e associa a um arquivo. Arquivos em C • Sintaxe: • FILE* fopen (char *NomeArquivo, char *modo); • NomeArquivo especifica o nome de arquivo válido • modo é uma string que representa o status de abertura desejado • Retorna NULL se ocorrer um erro. Arquivos em C Modo Significado “r” Abre Arquivo de Texto para Leitura “w” Cria Arquivo de Texto para Escrita “a” Abre (ou cria) e acrescenta conteúdo em Arquivo de Texto “rb” Abre Arquivo Binário para Leitura “wb” Cria Arquivo Binário para Escrita “ab” Abre (ou cria) e acrescenta conteúdo em Arquivo Binário “r+” Abre Arquivo de Texto para Leitura/Escrita “w+” Cria Arquivo de Texto para Leitura/Escrita “a+” Abre (ou cria) e acrescenta conteúdo em Arquivo de Texto para Leitura/Escrita “r+b” Abre Arquivo Binário para Leitura/Escrita “w+b” Cria Arquivo Binário para Leitura/Escrita “a+b” Abre (ou cria) e acrescenta conteúdo em Arquivo Binário para Leitura/Escrita “rt” Idem a “r” “wt” Idem a “w”“at” Idem a “a” “r+t” Idem a “r+” “w+t” Idem a “w+” “a+t” Idem a “a+” Arquivos em C NOME FUNÇÃO fopen() Abre um arquivo fclose() Fecha um arquivo feof() Retorna verdadeiro se fim do arquivo foi alcançado fread() Lê blocos de dados (Modo binário) fwrite() Grava bloco de dados (Modo binário) ferror() Retorna verdadeiro se um erro tiver ocorrido fprintf() Saída formatada. É a função printf para arquivo. fscanf() Entrada formatada. É a função scanf para arquivo. fseek() Procura um byte especificado no arquivo getc() Lê um caractere no arquivo putc() Grava um caractere no arquivo getw() Lê um inteiro no arquivo putw() Grava um inteiro no arquivo fgets() Lê uma string no arquivo fputs() Grava uma string no arquivo remove() Apaga conteúdo do arquivo Estruturas • É um conjunto de variáveis referenciadas pelo mesmo nome. • Mantem informações relacionadas no mesmo conjunto. struct endereco{ char nome[30]; char rua[40]; int numero; char cidade[20]; int cep; } ; // Esta declaração apenas define um tipo agregado (struct), não uma variável. Estruturas • Declaração de variável do tipo struct e atribuição: Int main(){ struct endereco meuEndereco; meuEndereco.cep = 12345678; printf(“Informe o nome da rua: ”); gets(meuEndereco.rua); return 0; } Estruturas • Definindo struct com declaração de variável: struct retangulo{ float altura; float largura; } x, y, lista[30]; //Variáveis do tipo retangulo x = y; //Atribuição de struct. Passa o valor de todas as variáveis internas (largura e altura) lista[4].altura = 2.5;//Atribuindo em vetor Estruturas • Passando membros de struct para função: struct fred { char x; int y; float z; char s[10]; } mike; func(mike.x); /* valor caractere de x */ func2(mike.y); /* valor inteiro de y */ func3(mike.z); /* valor float de z */ func4(mike.s); /* endereço da string s */ func(mike.s[2]); /* valor caractere da posição 2 da string s[2] */ Estruturas • Passando endereços de membros de struct para função: func(&mike.x); /* endereço do caractere x */ func2(&mike.y); /* endereço do inteiro y */ func3(&mike.z); /* endereço do float z */ func4(mike.s); /* endereço da string s */ func(&mike.s[2]); /* endereço do caractere da posição 2 da string s[2] s[2] */ Passando estruturas inteiras para função #include <stdio.h> struct tipoA { int a, b; char ch; } ; void f1(struct tipoA param); int main(void){ struct tipoA arg; arg.a = 1000; f1(arg); return 0; } void f1(struct tipoA param) { printf("%d", param.a); } Estruturas • Ponteiro para struct: struct comissao { float valor; char nome[80]; } pessoa;//pessoa é uma variável do tipo struct comissao struct comissao *p; //ponteiro para struct comissao p = & pessoa;//Ponteiro recebe o endereço de pessoa p-> valor = 78.80; //Operador utilizado para //acessar um membro de struct através de um ponteiro é “->” //e não o ponto “.” Estruturas • Estruturas aninhadas: struct empregado { //Membro que é um struct struct endereco end; float salario; } trabalhador; trabalhador.end.cep = 93456260; struct endereco{ char nome[30]; char rua[40]; int numero; char cidade[20]; int cep; } ;
Compartilhar