Baixe o app para aproveitar ainda mais
Prévia do material em texto
( P gg4gama¿ãg 3gsggsggaga / Autoria: Renato Cristiano Torres Tema 01 Conceitos Básicos de Programação ) ( © 2014 Anhanguera Educacional. Proibida a reprodução final ou parcial por qualquer meio de impressão, em forma idêntica, resumida ou modificada em língua portuguesa ou qualquer outro idioma. Pág. 17 Pág. 16 Pág. 16 Pág. 16 Pág. 11 ACOMPANHE NA WEB Pág. 10 POR DENTRO DO TEMA Pág. 3 CONVITE À LEITURA Pág. 3 Índice 3ema OS Conceitos Básicos de Programação Autoria: Renato Cristiano Torres Como citar esse documento: TORRES, Renato Cristiano. Programação Estruturada I: Conceitos Básicos de Programação . Caderno de Atividades. Anhanguera Publicações: Valinhos, 2014. ) ( FLUXOGRAMA PSEUDOCÓDIGO Notas dos Alunos Programação Estruturada I Se ((B1+B2)/2) > 7 então // Condição de Aprovação sem exame Mostra “Aprovado” // Passou Direto Senão // Exame Média > 7 SIM Aprovado Se EX > 5 então // Condição de Aprovação no Exame Mostra “Aprovado” Senão Mostra “Reprovado” NÃO Exame Nota Exame > 5 SIM Aprovado Reprovado 4 Figura 1.1 Exemplo de algoritmos em fluxograma e pseudocódigo. POR DENTRO DO TEMA Agora, imagine que você tenha de fazer o mesmo com um computador, ou seja, ensiná-lo a fazer algo, seja calcular a média aritmética das notas de todos os alunos de uma universidade para apresentar os aprovados ou reprovados na disciplina de Programação Estruturada I, seja calcular a disponibilidade de professores para lecionar as disciplinas para diversas turmas. Veja que os dois casos envolvem um problema a ser solucionado (Figura 1.1). O termo algoritmo é utilizado pela ciência da computação para descrever essa solução, que pode ser convertida para uma linguagem de programação e executada por um computador. ) ( POR DENTRO DO TEMA Conceitos Básicos de Programação Definição de Algoritmo Segundo Sedgewick (2003), um algoritmo é a descrição para a solução de um problema, que pode ser escrita utilizando um modelo matemático, um pseudocódigo ou, até mesmo, um fluxograma. Imagine que você tenha de explicar para uma pessoa como se frita um ovo, considerando que ela nunca fez isso. Você terá de descrever o passo a passo de como realizar essa ação em uma linguagem e estrutura que a pessoa entenda. 5 CONVITE À LEITURA Este Caderno de Atividades foi elaborado com base no livro Treinamento em Linguagem C , do autor Victorine Viviane Mizrahi, Editora Pearson, 2008. (Livro-Texto) Conteúdo Nesta aula, você estudará: Definição de algoritmo. Comandos básicos da linguagem de Programação C. Como construir seu primeiro programa em C. Habilidades Ao final, você deverá ser capaz de responder as seguintes questões: Quais são os principais elementos para a construção de um algoritmo? Como é a conversão de um algoritmo em um programa de computador? Como escrever e executar o primeiro programa em C? ) ( 5 POR DENTRO DO TEMA Transformando um Algoritmo em Programa Um algoritmo normalmente não deve depender de uma linguagem de programação específica nem do tipo de computador; ele deve ser genérico do ponto de vista de implementação (SEDGEWICK, 2003). Retomando nossa analogia de ensinar alguém a fritar um ovo, a descrição dessa ação deve ser genérica, de uma forma que qualquer pessoa consiga ler, compreender e executar. Porém, sabemos que não existe uma única língua no mundo, assim como na computação não existe apenas uma linguagem de computador. Portanto, para transformar o algoritmo, que é genérico, em um programa que utiliza comandos específicos, você deve observar quais comandos precisam ser utilizados durante a execução de cada passo do algoritmo. Você verá ao longo dos temas deste caderno de atividades que esses comandos poderão ser de decisão, iteração, declaração e outros. Estrutura Básica de um Programa em C Um programa na linguagem C é composto por uma, no mínimo, ou mais funções e estruturas de dados utilizadas para a manipulação de dados. A forma geral é a seguinte: [Tipo do dado] [Nome da Função](parâmetros) { Instrução_1; Instrução_2; return variável; } Toda função em C deve ter um tipo de retorno, especificado em [Tipo do Dado]. Se não tiver um tipo definido, utiliza-se “void”. Em C, o símbolo “{ }” delimita blocos de códigos. Sempre que abrir com “{“ você deve fechar com “}”, como em expressões numéricas. O ponto e vírgula é importante para você informar que o comando encerra naquela linha. ) ( 6 A diretiva #include indica para o compilador que deve ser incluso outro arquivo no programa-fonte, e a substituição é executada antes de o programa ser compilado. Quando utilizamos #include <nomedoarquivo>, o arquivo é procurado na pasta INCLUDE do seu compilador. Quando utilizamos “” aspas duplas, o arquivo é procurado na pasta atual e, se não for encontrado, na pasta INCLUDE do compilador. POR DENTRO DO TEMA Vamos escrever nosso primeiro programa. Escreva no seu compilador o seguinte código: #include <stdio.h> int main() { printf(“Primeiro Programa em C”); system(“PAUSE”); return 0; } Dica para erros comuns: se seu programa não funcionar na primeira execução, não fique desapontado, pois isso pode acontecer. É necessário que você fique atento aos seguintes pontos: A linguagem C diferencia letras maiúsculas e minúsculas para comandos. Verifique se ao copiar o programa houve esta troca. Em cada término de linha é obrigatório ter “;” para indicar o encerramento da linha de comando. Verifique também que todo bloco de código inicia com “{” e tem de terminar com “}”. Esse programa deve ter como saída após sua execução: Primeiro Programa em C Pressione qualquer tecla para continuar ... ) ( ⁄ Fonte: Adaptada de Mizrahi (2008) POR DENTRO DO TEMA Todo programa em C deve possuir minimamente uma função denominada obrigatoriamente “main”, pois, quando o computador ler seu programa, essa será a primeira função que ele executará. Ela deve ser única, e, por padrão, toda função deve ser descrita pelo tipo de retorno, nome e parênteses, que indica para o computador que aquele bloco de código é uma função. Declaração de Variáveis Uma variável em C representa um local da memória reservado para alocar determinado dado. Quando você nomeia uma variável em seu programa, você está utilizando um rótulo para um endereço de memória, o que torna mais fácil a nossa leitura do programa, em vez de utilizar endereços de memória que são numéricos em formato hexadecimal . A Tabela 1.1 apresenta os tipos de dados primitivos que C aceita. Na segunda coluna da tabela é apresentado o tamanho ocupado na memória por cada tipo, e a escala é a faixa de valor que pode ser armazenado. Tabela 1.1 Treinamento em Linguagem C. ) Tipo Bytes Escala char 1 -128 a 127 int 4 -2.147.483.648 a 2.147.483.647 short 2 -32.765 a 32.767 long 4 -2.147.483.648 a 2.147.483.647 unsigned char 1 0 a 255 unsigned 4 0 a 4.294.967.295 unsigned long 4 0 a 4.294.967.295 unsigned short 2 0 a 65.535 float 4 3,4 x 10-38 a 3,4 x 1038 double 8 1,7 x 10-308 a 3,4 x 10308 long double 10 3,4 x 10-4932 a 3,4 x 104932 void 0 nenhum valor ( 8 Agora que você já viu a declaração de variáveis do tipo inteiro, você verá a declaração de variável do tipo float e char. } numero_2 = numero_1 + 20; // atribuímos o valor soma a numero_2 printf(“\no primeiro número é : %d, numero_1); printf(“\no segundo número é numero_1 + 20 : %d”, numero_2); system(“PAUSE”); return 0; // declaramos numero_2 int numero_2; POR DENTRO DO TEMA Agora que você já conheceu os tipos de variáveis, você verá como declarar em C alguns desses tipos. Toda variável em C deve ser declarada antes de ser usada. Veja a declaração de 2 variáveis do tipo inteira, em um programa: #include <stdio.h> int main() { int numero_1; // declaramos numero_1 numero_1 = 44; // atribuímos o valor 44 a numero_1 Esse programa deve ter como saída após sua execução: O primeiro número é 44 O segundo número “numero_1 + 20” = 64 Pressione qualquer tecla para continuar ... ) ( SO ACOMPANHE NA WEB Laboratório de computação gráfica Acesse o site do Laboratório de computação gráfica. Neste link , você encontrará um curso de nivelamento em Linguagem C. Disponível em: <http://www.lcg.ufrj.br/Cursos/curso-nivelamento/linguagem-C.ppt/view> . Acesso em: 5 mai. 2014. História da programação Leia o artigo “História da programação”. Trata da história das linguagens de programação. Disponível em: <http://www.infoescola.com/informatica/historia-da-programacao/ > . Acesso em: 5 mai. 2014. Arquivos de Tag: C Você encontrará diversos códigos exemplos, desde simples algoritmos até aplicações mais complexas. Disponível em: <http://codigofonte.uol.com.br/codigos/outras-linguagens/c-cpp> . Acesso em: 5 mai. 2014. Na Tabela 1.2, você nota que na última linha a variável com nome “while” não é aceita, pois “while” é o nome de um comando de C, ou seja, é uma palavra reservada. POR DENTRO DO TEMA Tabela 1.2 Exemplo de nomes de variáveis. ) ( 9 A facilidade de nomear as variáveis pode ajudar a entender melhor o que o programa faz e evitar erros ou, ainda, facilitar uma manutenção no código. Porém, você deve atentar-se para o fato de que há regras para nome de variáveis (Tabela 2.1), visto que elas só podem conter letras, números e o caractere sublinhado “_”. POR DENTRO DO TEMA #include <stdio.h> int main() { int evento = 5; char corrida = ‘C’; float tempo = 27.25; printf(“\n O tempo vitorioso na eliminatória ”); printf(“corrida \n da competição : %d”, evento); printf(“ foi %f”, tempo) // veja que a linha de comando termina aqui } Veja que a variável do tipo char foi inicializada com a letra C, utilizando apóstrofes, pois se trata de um caracter. Inicializar uma variável significa atribuir um valor a ela na mesma instrução de declaração. Você verá que é possível inicializar uma variável do tipo char com uma cadeia de letras, ou seja, uma palavra ou texto. Esse programa deve ter como saída após sua execução: O tempo vitorioso na eliminatória C da competição 5 foi 27.25 Pressione qualquer tecla para continuar ... ) Correto Errado Média_1 Cosseno# Valor_de_PI Valor& Nota_10 While ( ACOMPANHE ) ( NA ) ( WEB ) ( SS AGORA É A SUA VEZ Instruções: Agora, chegou a sua vez de exercitar seu aprendizado. A seguir, você encontrará algumas questões de múltipla escolha e dissertativas. Leia cuidadosamente os enunciados e atente-se para o que está sendo pedido. Questão 1 O que entende por linguagem de programação? ACOMPANHE NA WEB Lista de palavras reservadas em C Conheça todas as palavras reservadas de C. Disponível em: <http://linguagemc.com.br/lista-de-palavras-reservadas-em-c/> . Acesso em: 5 mai. 2014. Iniciando linguagem C 1 parte 1 Assista ao vídeo: Iniciando linguagem C 1 parte 1. Disponível em: <www.youtube.com/watch?v=w-brjonvZuY> . Acesso em: 5 mai. 2014. ) ( Sł AGORA É A SUA VEZ Questão 2 Um tipo de variável em C define: Uma variáveh armazenada em hexadecimah. O tamanho de memória (em bytes) que a variáveh ocupará. Uma variáveh em binário. A base a ser usada no armazenamento da variáveh. A forma de armazenamento e de recuperação de um vahor na variáveh. Questão 3 Qual nome não é válido para a variável em C ? 3ab _sim n_a_o \meu 98Fim ) ( S5 AGORA É A SUA VEZ Questão 4 Em qual tipo de dado podemos armazenar um número real? int. char fhoat hong short int Questão 5 Todo programa em C deve minimamente possuir: função main() função printf() função system() #inchude #define ) AGORAÉASUAVEZ Questão 6 Um aluno preparou o programa apresentado a seguir para ser avaliado. Aponte os erros no programa. #include <stdio.h> #include <stdlib.h> int main{} ( printf(Existem % d semanas no ano., 52); cout << endl; system(“PAUSE”); return 0; ) Questão 7 O programa a seguir está correto? #include <stdio.h> #include <stdlib.h> int main() { printf(“Linguagem C”); system(“pause”); } S4 ( S6 GLOSSÁRIO Compilador: compilador é um programa que traduz um programa escrito em uma linguagem como C em linguagem de máquina. Hexadecimal: sistema numérico que representa os números na base 16. O número decimal 79 convertido em hexadecimal fica 4F. Pseudocódigo: é uma forma de representar um algoritmo utilizando uma linguagem intermediária entre a nossa linguagem e a linguagem do computador. REFERÊNCIAS MIZRAHI, Viviane V. Treinamento Linguagem C . São Paulo: Pearson, 2008. SCHILDT, H. C. Completo e Total . 3. ed. São Paulo: Makron Books, 1996. SEDGEWICK, R. Algorithms in C - Parts 1 – 4. Addison Wesley, 2003. FINALIZANDO Neste tema, você aprendeu a converter algoritmos em programas, executar o primeiro programa em C, declarar variáveis, obedecer às regras formais da linguagem, para que o computar seja capaz de entender e executar os códigos gerados. ) ( S5 AGORA É A SUA VEZ Questão 8 Analise o programa, a seguir, e aponte qual(is) erro(s) ele possui: #include <stdio.h> #include <stdlib.h> int main() { int a; int b;int c; printf(“Os números são : %d%d%d\n”,a,b,c,d); system(“pause”); } Questão 9 A declaração de variáveis precisa ocorrer em uma área específica do código. Apresente um programa simples que demonstre essa área. Questão 10 Escreva um programa que tenha a seguinte saída: Treinamento em programação. Linguagem C Com uma única instrução de impressão. Com duas instruções de impressão. ) ( GABARITO Questão 1 Resposta: A forma de se comunicar com um computador chama-se programa, que é escrito em uma linguagem de programação que só o computador entende. Essa linguagem possui regras bem-estabelecidas para que seja possível ser executada pelo computador. Questão 2 Resposta: Alternativa B. Questão 3 Resposta: Alternativa D. Questão 4 Resposta: Alternativa C. Questão 5 Resposta: Alternativa A. Questão 6 Resposta: int main{} <- Aqui é parênteses, e não chaves ( <- aqui é chave, e não parênteses printf(Existem % d semanas no ano., 52); <- estão faltando aspas em Existem % d semanas no ano. cout << endl; <- o comando cout é da linguagem c++, e não de c system(“PAUSE”); return 0; ) S⁄ ) Questão 7 Resposta: Sim, o programa está correto. Questão 8 Resposta: A variável d não foi declarada. Questão 9 Resposta: Uma variável deve ser declarada sempre antes de ser utilizada, normalmente, no começo da função. #include <stdio.h> #include <stdlib.h> int main() { int a; int b;int c;int d; <- Veja que declaramos antes de utilizar printf(“Os números são : %d%d%d\n”,a,b,c,d); system(“pause”); } Questão 10 Resposta: a) int main() { printf(“Treinamento em programação\n Linguagem C”); system(“pause”); } b) int main() { printf(“Treinamento em programação”); printf(“\nLinguagem C”); system(“pause”); } S8 ( P gg4gama¿ãg3gsggsggaga / Autoria: Renato Cristiano Torres Tema 02 Operadores, Laços, Comandos de Decisão e Funções ) ( © 2014 Anhanguera Educacional. Proibida a reprodução final ou parcial por qualquer meio de impressão, em forma idêntica, resumida ou modificada em língua portuguesa ou qualquer outro idioma. Pág. 22 Pág. 21 Pág. 21 Pág. 20 Pág. 18 ACOMPANHE NA WEB Pág. 17 POR DENTRO DO TEMA Pág. 4 CONVITE À LEITURA Pág. 3 Índice 3ema Oł Operadores, Laços, Comandos de Decisão e Funções Autoria: Renato Cristiano Torres Como citar esse documento: TORRES, Renato Cristiano. Programação Estruturada I: Operadores, Laços, Comandos de Decisão e Funções . Caderno de Atividades. Anhanguera Publicações: Valinhos, 2014. ) ( 4 POR DENTRO DO TEMA Operadores, Laços, Comandos de Decisão e Funções Operadores A linguagem C possui mais de 50 operadores. Trataremos dos principais e de sua precedência, ou seja, qual deve ser executado primeiro. Operadores de Atribuição Em C o símbolo = tem interpretação diferente da que recebe na matemática, pois representa a atribuição da expressão à sua direita à variável à sua esquerda. Exemplo: x = 1000; A execução é realizada da direita para esquerda. Isso quer dizer que primeiro o valor é guardado em uma posição de memória temporária e depois movido para a área de memória nomeada pela variável X. Operadores Aritméticos C dispõe de cinco operadores aritméticos. São eles: + Soma - Subtração * Multiplicação / Divisão % Módulo ) ( 5 CONVITE À LEITURA Este Caderno de Atividades foi elaborado com base no livro Treinamento em Linguagem C , do autor Victorine Viviane Mizrahi, Editora Pearson, 2008. (Livro-Texto) Conteúdo Nesta aula, você estudará: Regras de Precedência. Conversão de Tipos e Operadores de Incremento e Decremento. Operadores Aritméticos, Lógicos e de Atribuição. Laços, Comandos de Decisão, Funções e Matrizes. Habilidades Ao final, você deverá ser capaz de responder as seguintes questões: Qual operador deverá ser executado primeiro em uma cadeia? Como utilizar operadores? Como criar laços? Como utilizar comandos de decisão? ) PORDENTRODOTEMA Os operadores (+,-,*,/) operam com os tipos de dados inteiros ou pontos flutuantes (decimais) e executam a operação da mesma forma que na aritmética. O operador Módulo realiza o cálculo do resto de uma divisão de 2 inteiros, inteiro à sua esquerda pelo inteiro à sua direita, como no exemplo: 17 % 5 // resulta 2 Quando dividimos 17 por 5, temos como máximo divisor 3, isso se verifica em 3 * 5 = 15, e sobra 2, como o comando nos mostrou. Precedência Conforme você provavelmente aprendeu no ensino fundamental, os operadores de multiplicação e divisão têm prioridade sobre os de adição e subtração. Tal como na aritmética, adição e subtração têm a mesma precedência. A expressão é resolvida sempre da esquerda para a direita. O uso dos parênteses altera a precedência, pois a expressão interna dos parênteses é resolvida primeiro, para depois a parte externa ser avaliada e resolvida. Exemplo 1: N = (z + y) * x Primeiramente, é realizada a soma z+y dentro dos parênteses para depois ser efetuada a multiplicação por x. Exemplo 2: N = x – y + 5 Neste caso, como a precedência da soma e subtração são iguais, a operação é executada da esquerda para direita, ou seja, primeiramente é executada a subtração “x-y” para depois o resultado dessa subtração ser somado ao valor 5. Operadores de Incremento (++) e Decremento (--) Em alguns programas, é muito comum a necessidade de criarmos contadores incrementais ou decrementais, como um cronômetro progressivo ou regressivo. O operador de incremento adiciona o valor 1 à variável indicada como operando e pode ser utilizado de duas maneiras: prefixada, quando aparecer antes do nome da variável, ou pós-fixada, quando aparecer depois do nome da variável. 5 ( 6 POR DENTRO DO TEMA Exemplo: x = x +1; //adiciona 1 a x ++x; // adicionando 1 a x utilizando o operador ++ (prefixado) x++; // adicionando 1 a x utilizando o operador ++(posfixado) Exemplo 1: n=5; x = ++n; printf(“\nN=” << n <<” X=” << x; A saída será: n=6 x=6 Neste exemplo, você pode notar que o operador de incremento prefixado soma 1 na variável antes da atribuição em x; com isso, n passa a valer 6 e x também 6. Exemplo 2: n=5; x = n++; printf(“\nN=%d”,n, “X=%d”,x); A saída será: n=6 x=5 Neste outro exemplo você nota que o operador pós-fixado soma 1 na variável após a execução da atribuição. Isso quer dizer que primeiro x recebe o valor 5 e depois n é incrementado em 1. ) ( 8 POR DENTRO DO TEMA Os operadores são muito utilizados na programação como mecanismo auxiliar nos comandos de decisão, pois realizam comparações de dados e expressões. Laços Os laços são comandos para repetir um comando ou um bloco de comando várias vezes de forma determinada ou até que uma condição seja satisfeita. Estudaremos três tipos de comandos laços presentes no C. São eles: for, while, do-while. Laço for O laço for é utilizado na maioria das vezes quando desejamos criar uma repetição com um número fixo de vezes. Exemplo: #include <stdio.h> int main() { int i; for (i=0; i<20;i++) // imprime 20 * printf(‘*’); system(“PAUSE”); return 0; } Como você pode notar, nosso programa imprime 20 vezes o símbolo * (asterisco); na primeira parte do for “i=0”, informamos em que número nossa variável de incremento deve começar; na segunda parte, informamos a expressão condicional para o “for” repetir, neste caso, informamos que a repetição deve acontecer até i ser menor que 20, como ele inicia em 0, fará 20 vezes; e, na última parte, o tipo de incremento, neste caso, um incremento crescente de valor 1 à variável i. O incremento pode variar para somar 2, 3 ou 4 e assim por diante ou até mesmo decrementar. ) ( ⁄ POR DENTRO DO TEMA O operador de decremento (--) é idêntico ao de incremento. Exemplo: --x; // subtrai 1 de x ou x-- // subtrai 1 de x O funcionamento da forma pós-fixada e prefixada é idêntico ao operador de incremento. Operadores Lógicos e Relacionais Os operadores lógicos realizam comparações com base em avaliações binárias, ou seja, 0 ou 1. Vamos estudar três operadores importantes (E, OU e NÃO). && – Operador Lógico E x && y – Resultado verdadeiro somente se x e y forem verdadeiros || – Operador Lógico OU x || y – Resultado verdadeiro se x ou y for verdadeiro, caso contrário, resulta falso. ! – Operador Lógico NÃO !x – Resulta verdadeiro se x for falso e falso de x for verdadeiro, ou seja, ele inverte o valor. Os operadores relacionais (>,>=,<,<=) operam da mesma forma que na aritmética. x > y – resulta verdadeiro se x for maior que y. x >= y – resulta verdadeiro se x for maior ou igual a y. x < y – resulta verdadeiro se x for menor que y. x <= y – resulta verdadeiro se x for menor ou igual a y. x == y – resulta verdadeiro se x for exatamente igual a y. x != y – resulta verdadeiro se x for diferente de y. ) ( 9 Veja que, para imprimir, o comando está sendo executado pelo “for” até que i tenha um valor maior que 100; quando não colocamos “{}” significa que o comando que será executado várias vezes é o que estiver diretamente na linha abaixo do comando de laço. Se tivéssemos mais comandos para executar, precisaríamos colocá-los dentro de um bloco com chaves “{}”, assim, o bloco todo seria executado várias vezes. POR DENTRO DO TEMA A execução do laço “for” inicia-se pela atribuição do valor inicial da variável responsável pela contagem, no nosso caso, a variável i, que inicia com o valor de 3. O próximo passo é comparar se o valorde i é menor ou igual a 3, caso seja verdadeiro, passa-se para o próximo passo incrementando em 3, caso contrário, o laço é interrompido e o próximo comando após o for é executado. Vamos a outro exemplo em que vamos imprimir múltiplos de 3 entre os números 3 e 100. #include <stdio.h> int main() { for (int i=3; i <= 100; i = i + 3) printf(“\t%d”,i); // comando executado dentro do laço for ) system(“PAUSE”) ; return 0; } A saída será: 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 ( SO POR DENTRO DO TEMA Laço while O laço while é semelhante ao laço for em operação, porém, a estrutura de utilização é diferente. Exemplo: #include <stdio.h> int main() { int i=0; //inicialização while (i < 20) // condição para acontecer as repetições { printf(“*”); // imprime 20 vezes * i++; // incremento } system(“PAUSE”); return 0; } Veja que a saída será igual à saída do programa com o laço for, mas o while é utilizado com mais frequência quando o número de iterações (repetições) não for conhecido e dependerá de uma expressão lógica, que será colocada na condição após o comando while(<expressão>). Laço do-while O laço do-while é similar ao while, porém, com apenas uma diferença: primeiro executa um bloco de código para depois comparar se haverá repetição e quantas vezes será realizada. É bem útil em casos como conferência de senha. Imagine você que, ao digitar um usuário e senha em um sistema, ele permita que você erre apenas 3 vezes. Isso quer dizer que o laço deve permitir que você execute a inserção de sua senha primeiro para depois comparar se você a errou e permitir, se necessário, que você insira a senha mais 2 vezes. ) ( Sł POR DENTRO DO TEMA Comando if O comando if informa ao computador para avaliar e tomar uma decisão simples. Vamos a um exemplo: #include <stdio.h> int main() { printf(“Quantos anos você tem?”); int anos; scanf(“%d”,anos); if (anos < 30) // Avalia se a idade informada é menor que 30 anos printf(“Você é muito jovem”); // Apresenta essa mensagem se a idade for < 30 anos. system(“PAUSE”); return 0; } Neste caso, apenas será apresentada a mensagem se a expressão da condição for verdadeira. Comando if-else O comando if-else permite executar um bloco de código caso a expressão da condição não seja satisfeita. ) ( SS POR DENTRO DO TEMA Exemplo: #include <stdio.h> int main() { int i=0; //inicialização do { printf(“*”); // imprime 20 vezes * i++; // incremento } while (i < 20) // condição para acontecer as repetições system(“PAUSE”); return 0; } Comandos de Decisão Qualquer programa deve ter um mecanismo de decisão para executar ou não um bloco de comandos com base no resultado de uma expressão condicional. Portanto, durante a execução de um programa, várias decisões são tomadas pelo computador com base em resultados calculados durante este período. ) ( S5 POR DENTRO DO TEMA Exemplo: #include <stdio.h> int main() { printf(“Quantos anos você tem?” << endl; int anos; scanf(“%d”,anos); if (anos < 30) // Avalia se a idade informa é menor que 30 anos printf(“Você é muito jovem”); else printf(“Você está com trinta anos ou já passou”); system(“PAUSE”); return 0; } Veja que, neste caso, a mensagem “Você está com trinta anos ou já passou” é executada quando a idade for superior ou igual a 30 anos. Comando switch O comando switch tem como finalidade proporcionar uma maneira estruturada de selecionar uma opção entre várias alternativas. Vamos compreender como é a sintaxe. ) PORDENTRODOTEMA switch (variável) { case constante 1: instrução; instrução; break; case constante 2: instrução; instrução; break; case constante 3: instrução; instrução; break; default: instrução; instrução; } Vamos ver um exemplo que imprime o dia da semana com base em uma data. O ano deve ser maior que 1600. Exemplo: #include <stdio.h> #include <conio.h> int main() { int dia, mês, ano; const char ESC = 27; do { printf(“Digite a data na forma dd mm aaaa: “; scanf(“%d%d%d”,dia ,mês ,ano); int dSemana = ano + dia + 3 * (mês - 1) – 1; if (mês < 3) ano --; S4 PORDENTRODOTEMA else dSemana = dSemana - (int (0.4*mês+2.3)); dSemana=dSemana+( int(ano/4) – int((ano/100 + 1)* 0.75)); dSemana %= 7; switch(dSemana) // variável que determinará em qual case entra. { case 0: // Se dSemana = 0 printf(“domingo”; break; case 1: //Se dSemana = 1 .... printf(“segunda-feira”; break; case 3: cout <<”terça-feira”; break; case 4: cout <<”quarta-feira; break; case 5: cout <<”quinta-feira”; break; case 6: cout <<”sexta-feira”; break; case 7: cout <<”sábado”; break; } printf(“\nESC para terminar ou ENTER para recomeçar”); } while (getch() != ESC); system(“PAUSE”); return 0; } S5 PORDENTRODOTEMA Se você executar o programa e digitar 30 7 1978, notará que o resultado será domingo. Funções Segundo Mizrahi (2010), uma função é um conjunto de instruções implementadas para cumprir determinada tarefa e agrupadas em uma unidade ou bloco de código com um nome para referenciá-la. Dividir um grande programa em blocos de códigos organizados e bem estruturados ajuda na leitura e manutenção. Portanto, a utilização de funções para cumprir este papel é o princípio fundamental das linguagens estruturadas. A maioria das funções possui parâmetros, que são as variáveis que recebem as informações enviadas à função. Depois, são processadas e devolvidas como valor de retorno. O tipo de uma função é determinado pelo valor que ela retorna, e não pelo tipo de parâmetros que ela recebe. Exemplo de utilização de função para conversão de temperatura em graus Fahrenheit para temperatura em Celsius: #include <stdio.h> int celsius(int fahr) // Protótipo ou assinatura int main() { int c, f; printf(“Digite a temperatura em graus Fahrenheit:”); scanf(“%f”,f); // obtém a temperatura e coloca na variável g c = celsius(f) // chama a função passando o valor de f como parâmetro printf(“Celsius = %d”,c); system(“PAUSE”); return 0; } int celsius(int fahr) { int c; c = (faht - 32) * 5/9; // faz a conversão return c; // retorna o valor em grau Celsius contido na variável c } S6 ( AGORA É A SUA VEZ Instruções: Agora, chegou a sua vez de exercitar seu aprendizado. A seguir, você encontrará algumas questões de múltipla escolha e dissertativas. Leia cuidadosamente os enunciados e atente-se para o que está sendo pedido. Questão 1 Qual a vantagem de se utilizar funções na construção de programas? Questão 2 Qual dos seguintes operadores não é aritmético? a) + && – * / Questão 3 Os operadores relacionais são usados para: Combinar vahores. Comparar vahores. Distinguir diferentes tipos de variáveis. Trocar variáveis por vahores hógicos. Concatenar vahores. S8 ) ( S⁄ ACOMPANHE NA WEB Laboratório de computação gráfica Acesse o site do Laboratório de computação gráfica. Neste link , você encontrará um curso de nivelamento em Linguagem C. Disponível em: <http://www.lcg.ufrj.br/Cursos/curso-nivelamento/linguagem-C.ppt/view> . Acesso em: 5 mai. 2014. C para iniciantes - Aula 04 - Laço WHILE Assista ao vídeo: C para iniciantes - Aula 04 - Laço WHILE . Uma aula que traz um exemplo simples do comando while. Disponível em: <http://www.youtube.com/watch?v=clxnWBY6wT4> . Acesso em: 5 mai. 2014. POR DENTRO DO TEMA Toda função deve retornar um valor. As funções que não possuemvalor de retorno devem ser declaradas no protótipo como retorno “void”. Se você definir sua função antes da função principal main, você não precisa criar um rótulo no topo do código-fonte. O comando return, responsável por retornar o valor da função, retorna apenas um único valor para a função. Esse valor pode ser um valor numérico, endereço de memória, valor boleano ou qualquer outro tipo previsto na linguagem. ) ( AGORA É A SUA VEZ Questão 4 Em uma instrução if sem else, o que acontece se a condição de teste for falsa? O controhe procura peho úhtimo ehse do programa. Nada. O controhe passa para a instrução seguinte ao if. O corpo do comando if é executado. Nenhuma das anteriores. Questão 5 Qual sentença do comando for, a seguir, está correta? a) for(i=0; < 10; i++) b) for(i=0; i < 10, i++) c) for(i=0; < 10; i++) d) for(i=0; 10; i++) e) for(0; < 10; i++) Questão 6 Crie um contador de números pares utilizando o laço while e apresente a contagem na tela. Questão 7 Uma empresa contrata um encanador a R$ 20,00 por dia. Crie um programa que solicite o número de dias trabalhados pelo encanador e imprima o valor líquido a ser pago, sabendo que são descontados 8% de imposto de renda. S9 ) ( łO FINALIZANDO Neste tema, você aprendeu qual operador deverá ser executado primeiro em uma cadeia. Além disso, você também verificou como utilizar operadores, como criar laços e como utilizar comandos de decisão. AGORA É A SUA VEZ Questão 8 Uma moça entrou em uma loja para comprar roupa e gastou R$ 1.250,00. Como ela pagou à vista, ganhou um desconto de 5%. Escreva um programa que calcule o desconto. Questão 9 Sabendo que o latão é obtido fundindo-se sete partes de cobre com três partes de zinco, faça um programa que solicite quantos quilos de latão se quer produzir e imprima quantos quilos de cobre e zinco são necessários. Questão 10 Escreva uma função recursiva chamada potencia() que aceite dois argumentos inteiros positivos i e j e retorne a soma dos n números inteiros do intervalo . Por exemplo, se a função receber 1 e 5 , deverá retornar 15, pois: 1+2+3+4+5 = 15. ) ( GABARITO Questão 1 Resposta: As funções organizam o código em blocos que facilitam a leitura do programa e também sua manutenção. Questão 2 Resposta: Alternativa B. Questão 3 Resposta: Alternativa B. Questão 4 Resposta: Alternativa C. Questão 5 Resposta: Alternativa B. Questão 6 Resposta: #include <stdio.h> #include <stdlib.h> int main() { int i; while i < 10 { printf(“Contando %d”,i); i++; } system(“pause”); } łł ) ( łS GLOSSÁRIO Fahrenheit: o grau fahrenheit (símbolo: °F) é uma escala de temperatura proposta por Daniel Gabriel Fahrenheit em 1724. Nessa escala, o ponto de fusão da água é de 32°F e o ponto de ebulição de 212°F. Uma diferença de 1,8 grau fahrenheit equivale à de 1°C. REFERÊNCIAS MIZRAHI, Viviane V. Treinamento Linguagem C . São Paulo: Pearson, 2008. SCHILDT, H. C. Completo e Total . 3. ed. São Paulo: Makron Books, 1996. SEDGEWICK, R. Algorithms in C - Parts 1 – 4. Addison Wesley, 2003. ) ( ł5 Questão 7 Resposta: #include <stdio.h> #include <stdlib.h> int main() { int dias; printf(“Digite o número de dias :”); scanf(%d,dias); printf(“Valor %f”,(dias*20)*0.92); system(“pause”); } Questão 8 Resposta: #include <stdio.h> #include <stdlib.h> int main() { printf(“Valor %f”,1250*0.95); system(“pause”); } ) Questão 9 Resposta: #include <stdio.h> #include <stdlib.h> int main() { int latao; printf(“Digite quantidade de latao :”); scanf(%d,latao); printf(“Quantidade Total de Cobre %d”,latão*0.7); printf(“Quantidade Total de Zinco %d”,latão*0.3); system(“pause”); } Questão 10 Resposta: #include <stdio.h> #include <stdlib.h> int potencia(int i, int j) { int a,res; for a=i to j { res = res + a; } } int main() { ł4 ( ł5 } int i,j; printf(“Digite o primeiro numero :”); scanf(%d,i); printf(“Digite o segundo numero :”); scanf(%d,i); printf (“Resultado : %”,potencia(i,j)); system(“pause”); ) ( P gg4gama¿ãg 3gsggsggaga / Autoria: Renato Cristiano Torres Tema 03 Matrizes, Estruturas Definidas pelos Usuários e Ponteiros ) ( © 2014 Anhanguera Educacional. Proibida a reprodução final ou parcial por qualquer meio de impressão, em forma idêntica, resumida ou modificada em língua portuguesa ou qualquer outro idioma. Pág. 17 Pág. 16 Pág. 16 Pág. 16 Pág. 13 ACOMPANHE NA WEB Pág. 12 POR DENTRO DO TEMA Pág. 4 CONVITE À LEITURA Pág. 3 Índice 3ema 05 Matrizes, Estruturas Definidas pelos Usuários e Ponteiros Autoria: Renato Cristiano Torres Como citar esse documento: TORRES, Renato Cristiano. Programação Estruturada I: Matrizes, Estruturas Definidas pelos Usuários e Ponteiros . Caderno de Atividades. Anhanguera Publicações: Valinhos, 2014. ) ( POR DENTRO DO TEMA Matrizes, Novos Tipos de Dados e Ponteiros Segundo Mizrahi (2008), uma matriz é um tipo de dado em C utilizado para representar uma coleção de variáveis de mesmo tipo e que compartilham o mesmo nome. Imagine que precisássemos encontrar a média aritmética das notas de 5 alunos. Para isso, utilizamos um vetor ou uma matriz unidimensional. A matriz é formada por um conjunto de variáveis do mesmo tipo e referenciada por um único nome, e cada variável é identificada por meio de um número denominado índice, em que os colchetes indicam esse tipo de acesso. Exemplo 1: Declaração de uma matriz unidimensional ou conhecida como vetor: int notas[5]; // vetor com 5 posições de inteiros Exemplo 2: #include <stdio.h> int main() { int notas[5], media=0; for (int i=0; i < 5; i++) { printf(“Digite a nota do aluno %d”,i+1); scanf(%d,notas[i]); media = media + notas[i]; // podemos escrever assim media+=notas[i]; } media = media/5; // podemos escrever assim media /= 5; printf(“Média das notas : %d”,media); systema(“PAUSE”); return 0; } 4 ) ( 5 CONVITE À LEITURA Este Caderno de Atividades foi elaborado com base no livro Treinamento em Linguagem C , do autor Victorine Viviane Mizrahi, Editora Pearson, 2008. (Livro-Texto) Conteúdo Nesta aula, você estudará: Como alocar matrizes. Como fazer referência a seus elementos. A utilização de Ponteiros. Habilidades Ao final, você deverá ser capaz de responder as seguintes questões: Quando utilizar matrizes? Como referenciar e operar seus elementos? Qual a importância de ponteiros e como utilizá-los? ) ( 6 freqmedia = freqmedia/5; printf(“Média das notas : %d”, media); printf(“ “Média de freqüência : %d”, freqmedia); systema(“PAUSE”); return 0; } Execução do programa: Digite a nota do aluno 1: 75 <- valor digitado pelo usuário Digite a frequência do aluno 1: 100 <- valor % digitado pelo usuário Digite a nota do aluno 2: 55 Digite a frequência do aluno 2: 90 Digite a nota do aluno 3: 60 Digite a frequência do aluno 3: 75 Digite a nota do aluno 4: 80 Digite a frequência do aluno 4: 95 Digite a nota do aluno 5: 90 Digite a frequência do aluno 5: 95 POR DENTRO DO TEMA = media/5; // podemos escrever assim media /= 5; media ) ( 5 POR DENTRO DO TEMA Execução do programa: Digite a nota do aluno 1: 75 <- valor digitado pelo usuário Digite a nota do aluno 2: 55 Digite a nota do aluno 3: 60 Digite a nota do aluno 4: 80 Digite a nota do aluno 5: 90 Média das notas: 72 <- média calculada pelo programa Como você pode notar no exemplo, para acessar cada elemento da matriz, utilizamos o formato notas[i], em que a variável i indica o índice, ou seja, o número da posição que desejamos capturar ou armazenar valor na matriz. Agora, utilizaremos o mesmo programacom algumas modificações para mostrar como utilizar uma matriz de duas dimensões. Uma matriz de duas dimensões é acessada por meio do uso de duas coordenadas, linha e coluna. Vamos ao exemplo: #include <stdio.h> int main() { int notas[5][2], media=0, freqmedia=0; for (int i=0; i < 5; i++) { printf(“Digite a nota do aluno %d :”, (i+1)); scanf(%d,notas[i] [1]); printf(“Digite a frequência do aluno %d :”,(i+1)); scanf(%d,notas[i] [2]); media = media + notas[i][1]; freqmedia = freqmedia + notas[i][2]; } ) PORDENTRODOTEMA A matriz está preenchida da seguinte forma: Coluna 1 Coluna 2 Linha 1 75 100 Linha 2 55 90 Linha 3 60 75 Linha 4 80 95 Linha 5 90 95 Média das notas: 72 <- média calculada pelo programa Média de frequência: 91 <- média calculada pelo programa Note que, se você deseja acessar a nota do aluno 4, você deve informar da seguinte maneira: notas[4][1]. Desta forma, está acessando o endereço da linha 4 e coluna 1. A matriz é muito importante, pois é uma estrutura que permite alocar grandes quantidades de dados e é rastreável, ou seja, por coordenadas de linha e coluna todos os dados são acessíveis. Alocar uma matriz de forma estática, ou seja, no início do programa, pode desperdiçar memória, visto que dimensionamos a matriz com tamanho definido e podemos ter espaços não utilizados. A alocação ideal é dinamicamente a matriz ser alocada à medida que o programa necessite. É possível fazer referência a um elemento da matriz utilizando ponteiro. Se uma variável “p” aponta para uma matriz, podemos acessar o primeiro elemento da matriz escrevendo *(p+1); isso informa ao programa para deslocar um elemento a partir do primeiro endereço de p. Novos Tipos de Dados – Struct Segundo Mizrahi (2010), estruturas são tipos de variáveis que agrupam dados geralmente desiguais, diferentemente das matrizes que utilizam os mesmos tipos. Utilizando a palavra reservada struct, definimos um novo tipo de dado, que informa ao compilador seu nome, tamanho e a forma que deve ser acessado. Vamos observar um exemplo: #include <stdio.h> ⁄ ( 8 POR DENTRO DO TEMA struct Aluno // é dessa forma que definimos a estrutura palavra-chave e o nome da estrutura { int nmat; // Número da matrícula float nota[3]; // Notas float media; // média // dentro das chaves temos os membros da estrutura nesse caso temos: número da matrícula, notas e média. }; // definir uma estrutura não criar nenhuma variável, somente informa ao compilador as características do novo tipo de dado. int main() { Aluno Jose; // é nesse momento que declaramos uma variável do tipo aluno; Jose.nmat = 456; // Nome que para acessar um elemento do tipo utilizamos o ponto “.”; Jose.nota[0] = 7.5; Jose.nota[1] = 5.2; Jose.nota[2] = 8.4; Jose.media = (Jose.nota[O] + Jose.nota[1] + Jose.nota[3])/3.O; printf( “Matricula : %s”, Jose.nmat); printf( “Média : %s”,Jose.media); system(“PAUSE”); return 0; } ) PORDENTRODOTEMA Conforme você pode ver no exemplo, as estruturas têm o objetivo fundamental de armazenar tipos de dados diferentes e organizá-los de forma que podemos acessá-los facilmente. É muito útil quando precisamos trazer grandes quantidades de dados de um banco de dados para a memória do computador para realizarmos cálculos ou cruzamento de dados. Como a estrutura é um tipo de dado cujo formato é definido pelo programador, há grande flexibilidade de utilização. Ponteiros Segundo Mizrahi (2008), ponteiro é um endereço de memória e um mecanismo para acessar uma variável sem fazer referência a ela diretamente, ou seja, não pelo seu nome, mas por seu endereço. Os ponteiros são utilizados em situações em que a utilização do nome de uma variável não é desejável ou não é permitida. · Algumas razões para o uso dos ponteiros (MIZRAHI, 2010): · Manipular elementos de matrizes. · Receber argumentos de funções que necessitem de modificação. · Passar strings (cadeia de caracteres) de uma função para outras. · Criar estruturas de dados complexas. · Alocar e desalocar memória. · Passar para uma função o endereço de outra. Exemplo 1 #include <stdio.h> int main() { int i,j,k; printf(“Endereço de i = %d”, &i); // o símbolo & obtém o endereço onde está alocada a variável printf(“Endereço de j = %d”,&j); printf(“Endereço de k = %d”,&k); system(“PAUSE”); return 0; } 9 ( POR DENTRO DO TEMA A saída da execução: Endereço de i = 0012FED4 // o endereço pode variar de um computador para outro Endereço de J = 0012FEC8 Endereço de K = 0012FEBC A ideia do uso de ponteiros é que utilizemos posição de memória em vez de utilizarmos a passagem de estruturas em funções, visto que por ponteiros é bem mais eficiente. Vamos a outro exemplo, em que temos uma função que tem por objetivo reajustar um preço em 20%, e a alteração acontecerá diretamente nas variáveis passadas como parâmetros. Exemplo 2: #include <stdio.h> void reajusta2O(float *preco, float *reajuste); // protótipo int main() { float val_preco, val_reaj; do { printf( “Insira o preço atual : ”); scanf(%f,val_preco); reajusta2O(&val_preco, &val_reaj); //envio dos endereços printf(“\n O preço novo é &f”,val_preco); printf(“\n O aumento foi de %f”,val_reaj); } while (val_preco != O.O); system(“PAUSE”); return 0; } S0 ) ( Sł ACOMPANHE NA WEB Matriz em C No link a seguir, você encontrará um site dedicado à linguagem C. Disponível em: <http://linguagemc.com.br/matriz-em-c/> . Acesso em: 5 mai. 2014. A história das matrizes Descubra a curiosa história das matrizes. Disponível em: <http://www.mat.ufrgs.br/~portosil/passa3b.html> . Acesso em: 5 mai. 2014. Linguagem C: endereços e ponteiros Encontre informações sobre ponteiros, com exercícios e exemplos. Disponível em: <http://www.ime.usp.br/~pf/algoritmos/aulas/pont.html> . Acesso em: 5 mai. 2014. Matriz em linguagem C - Conceito e Definição Assista ao vídeo: Matriz em linguagem C - Conceito e Definição . Tutorial divertido sobre o conceito de matrizes e uma boa explicação que ajudará a esclarecer o uso de matrizes em C. Disponível em: <http://www.youtube.com/watch?v=-9Nafr7zdJs> . Acesso em: 5 mai. 2014. UFRPE Linguagem C PONTEIROS aula 01 Assista ao vídeo: UFRPE Linguagem C PONTEIROS aula 01 . Esta aula completa sobre ponteiros ajudará a apoiar a compreensão do uso de ponteiros em C. Disponível em: <http://www.youtube.com/watch?v=mKDRIH38S4k> . Acesso em: 5 mai. 2014. ) ( SS POR DENTRO DO TEMA // a função receberá os endereços das variáveis preço e reajuste void reajusta2O(float *preco, float *reajuste) { // Para acessar o conteúdo do endereço passado, temos que colocar o símbolo * antes do nome da variável; *reajuste = *preco * O.2; *preco *= 1.2; //<- igual a *preco = *preco * 1.2; } Vamos a outro exemplo, em que utilizaremos ponteiros para atribuir um valor à variável x e, em seguida, utilizaremos novamente o ponteiro para atribuir esse valor a y. Exemplo 3: #include <stdio.h> int main() { int x,y; int *px=&x; // inicializa a variável px com o endereço de x; *px = 14; // o mesmo que x=14, indica que atribua 14 ao endereço de x y = *px; // o mesmo que y=x, indica que atribua a y o conteúdo do endereço apontado por px. A utilização de ponteiros é vista por muitos programadores iniciantes como algo complexo, mas, na verdade, não o é. Quando bem-utilizado, é muito eficiente para a manipulação de matrizes e estruturas complexas. ) ( AGORA É A SUA VEZ Instruções: Agora, chegou a sua vez de exercitar seu aprendizado. A seguir, você encontrará algumas questões de múltipla escolha e dissertativas. Leia cuidadosamente os enunciados e atente-se para o que está sendo pedido. Questão 1 O que você entende por matriz? Questão 2 Qual declaração de matriz de inteiros está correta? int mat(25) int xmat{1} int notas[10] int y|6| int [10]x Questão 3 Na instrução mat[3] = 5, o que estáocorrendo? Atribuição do vahor 3 na posição 5 da matriz. Comparação de 3 ehementos da matriz com vahor 5. Ahocação de 3 ehementos na matriz. Atribuição do vahor 5 na posição 3 da matriz. Comparação do vahor da posição 3 da matriz com vahor 5. S5 ) ( S4 AGORA É A SUA VEZ Questão 4 O que é do tipo int na instrução seguinte? int *p A variáveh p. O endereço de p. A variáveh apontada por p. O endereço da variáveh apontada por p. Obrigatoriamente o conteúdo e endereço da variáveh p. Questão 5 Qual instrução, a seguir, declara um ponteiro para uma variável float? fhoat *p; *fhoat p; Fhoat * p; *p fhoat=*p; Questão 6 Uma string é uma coleção de caracteres. Por que podemos dizer que uma string é uma matriz de caracteres? ) ( S6 GLOSSÁRIO Matriz: uma matriz é uma tabela de m linhas e n colunas de símbolos sobre um conjunto. Quando a matriz possui apenas 1 linha e n colunas, é chamada de matriz unidimensional ou vetor. REFERÊNCIAS MIZRAHI, Viviane V. Treinamento Linguagem C . São Paulo: Pearson, 2008. SCHILDT, H. C. Completo e Total . 3. ed. São Paulo: Makron Books, 1996. SEDGEWICK, R. Algorithms in C - Parts 1 – 4. Addison Wesley, 2003. FINALIZANDO Neste tema, você aprendeu a criar matrizes e a referenciar seus elementos, assim como a utilizar ponteiros e criar estruturas de dados personalizadas. ) ( S5 AGORA É A SUA VEZ Questão 7 Se uma matriz é declarada como: float preço[MAX]; a instrução a seguir é correta para acessar todos os elementos da matriz? for (int j=O; j <= MAX; j++) scanf(“%f”, preco[j]) Questão 8 O seguinte programa está correto? # include <stdio.h> const VAL=987; int main() { int *p = VAL; printf(“%d”,*p); return 0; } Questão 9 Qual a diferença entre mat[3] e *(mat+3)? Questão 10 Qual o erro deste trecho de programa? float x = 333.33; float *p = & x; printf(“%f\n”,*p); ) ( S8 Questão 8 Resposta: Não! # include <stdio.h> const VAL=987; int main() { int *p = VAL; <- está inicializando o endereço da variável p com o valor da variável VAL, veja que VAL teria de ser um endereço para estar correto, ou seja, int * p = &VAL, assim o programa pega o endereço de VAL. printf(“%d”,*p); return 0; } Questão 9 Resposta: Os comandos produzem o mesmo efeito: mat[3] - nesse formato o valor da posição 3 é acessado por índice. *(mat+3) – nesse formato, o deslocamento é realizado por ponteiro, ou seja, a partir da posição mat será deslocado em 3 endereços e depois retornado o valor contido nesta posição. Questão 10 Resposta: Não há erro float x = 333.33; float *p = & x; -> A variável p está sendo inicializado com endereço x printf(“%f\n”,*p); -> aqui mostrará o valor de x, pois p possui o endereço de x. ) ( GABARITO Questão 1 Resposta: Matriz é uma estrutura de dados que armazena uma coleção de variáveis de mesmo tipo, que compartilha o mesmo nome e permite o acesso a qualquer elemento por meio de coordenadas ou índice. Questão 2 Resposta: Alternativa C. Questão 3 Resposta: Alternativa D. Questão 4 Resposta: Alternativa C. Questão 5 Resposta: Alternativa A. Questão 6 Resposta: Porque String é uma matriz unidimensional ou vetor do tipo char que armazena um texto formado de caracteres sempre terminado pelo caractere (‘0’). Questão 7 Resposta: Não está correta, pois teremos problemas. Imagine MAX valendo 1o o tamanho efetivo da matriz é 10 elementos, como o 1.o elemento da matriz é a posição 0, o último será posição 9, e o for percorrerá até o elemento MAX ocorrerá um erro, pois tentará acessar o elemento da posição 10, que não existe. float preço[MAX]; for (int j=O; j <= MAX; j++) scanf(“%f”, preco[j]) S⁄ ) ( P gg4gama¿ãg 3gsggsggaga / Autoria: Renato Cristiano Torres Tema 04 Operações com Arquivos ) ( © 2014 Anhanguera Educacional. Proibida a reprodução final ou parcial por qualquer meio de impressão, em forma idêntica, resumida ou modificada em língua portuguesa ou qualquer outro idioma. Pág. 17 Pág. 16 Pág. 16 Pág. 16 Pág. 11 ACOMPANHE NA WEB Pág. 10 POR DENTRO DO TEMA Pág. 4 CONVITE À LEITURA Pág. 3 Índice 3ema 04 Operações com Arquivos Autoria: Renato Cristiano Torres Como citar esse documento: TORRES, Renato Cristiano. Programação Estruturada I: Operações com Arquivos . Caderno de Atividades. Anhanguera Publicações: Valinhos, 2014. ) ( POR DENTRO DO TEMA Operações com Arquivos Segundo Mizhari (2008), arquivo é utilizado para indicar um “fluxo de dados” (stream). Todo local que tem capacidade para receber bytes da memória do computador ou transferi-los para ela recebe o nome de arquivo, por exemplo: arquivos de disco, teclado, vídeo, impressora, portas de comunicação etc. Desta forma, o conceito de arquivo é ampliado. A linguagem C dispõe de funções para abertura, fechamento, leitura e escrita em arquivos. Abertura de Arquivos A função fopen() cria e preenche uma estrutura com as informações do arquivo e retorna um ponteiro do tipo FILE. Em C podemos realizar gravação e leitura caractere a caractere, utilizando as funções fputc() e fgetc(). Vamos a um exemplo para aprender a utilizá-las. #include <stdio.h> #include <stdlib.h> #include <conio.h> int main(void) { /* Declaramos um ponteiro do tipo FILE que receberá as propriedades do arquivo */ FILE *fptr; char ch; /* Abre o arquivo para gravar “w” em modo texto */ fptr=fopen(“arqtext.txt”,”w”); /* Lê um caractere até receber um enter sem digitar qualquer outro caractere */ while ((ch=getche()) != ‘\r’) /* Grava caractere no arquivo */ fputc(ch,fptr); /* Fecha o arquivo */ fclose(fptr); return 0; } 4 ) ( 5 CONVITE À LEITURA Este Caderno de Atividades foi elaborado com base no livro Treinamento em Linguagem C , do autor Victorine Viviane Mizrahi, Editora Pearson, 2008. (Livro-Texto) Conteúdo Nesta aula, você estudará: Leitura e gravação de arquivos. Manipulação de dados em arquivos. Gravação de estruturas em disco. Habilidades Ao final, você deverá ser capaz de responder as seguintes questões: Como abrir e fechar um arquivo? Como escrever e ler um dado de arquivo? Como gravar um registro em um arquivo? ) PORDENTRODOTEMA Nosso programa cria um arquivo chamado de “arqtext.txt” e pede para digitar um caractere. À medida que o caractere é digitado e confirmado com enter, é gravado no arquivo. Se você não digitar nenhum caractere e teclar enter, o programa fecha o arquivo e se encerra. Se você abrir o arquivo, notará que os dados que digitou estarão gravados. A ação de fechar o arquivo é muito importante, pois informa ao programa que qualquer informação pendente no buffer precisa ser gravada no arquivo. O buffer é uma memória temporária. Imagine: se você digitar vários caracteres rapidamente, e cada um necessitar de um acesso ao disco, eles poderão ser perdidos. Por isso existe o buffer, que armazena temporariamente o dado antes de ser gravado no disco. Agora vamos fazer o contrário. Vamos ler um arquivo e apresentar no vídeo caractere a caractere. #include <stdio.h> #include <stdlib.h> int main(void) { FILE * fptr; /* Ponteiro para arquivo */ short int ch; fptr=fopen(“arqtext.txt”,”r”); /* Abre arquivo para ler “r” */ while((ch=fgetc(“ArqText.txt”,”r”) != EOF) /* lê um caractere do arquivo até encontrar o final do arquivo) print(“%c”,ch); /* mostra o caractere lido */ fclose(fptr); /* fecha o arquiv */ return 0; } É importante ressaltar que EOF não é um caractere do arquivo, e sim uma constante do tipo inteira. O fim do arquivo é reconhecido pelo sistema operacional, que envia 0 ao lermos o último caractere do arquivo para indicar que o arquivo chegouao final. 5 ( 6 POR DENTRO DO TEMA A abertura de um arquivo pode apresentar falha, por exemplo, caso falte espaço em disco. Por este motivo, é importante você colocar um teste para avaliar se o arquivo foi aberto com sucesso. Vamos a um exemplo: #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fptr; short int ch; if (( fptr == fopen(“ArqText.txt”,”r”)) ==NULL) { puts(“Não foi possível o arquivo”); exit(1); } while(ch=fgetc(fptr) != EOF) printf(“%c”,ch); fclose(fptr); return 0; } Veja que o programa apresentado testa, por meio do comando IF, se o ponteiro do arquivo é NULO. Se for, emite uma mensagem e o programa encerra. Isso é necessário para não gerar erros nos códigos, pois, se o ponteiro é NULO, é consequência da não abertura do arquivo, logo, se tentarmos ler algum dado utilizando o ponteiro, ocorrerá um erro. Você pode criar um programa para ler e gravar dados linha a linha, ao invés de ler e gravar caractere a caractere, como visto até aqui. Vamos a um exemplo: ) ( 8 POR DENTRO DO TEMA #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fptr; char str[81] ; if (( fptr == fopen(“Teststr.txt”,”r”)) ==NULL) { puts(“Não foi possível o arquivo”); exit(1); } while (fgets(str,80,fptr) != NULL) printf(“%s”,str); fclose(fptr); system(“pause”); return 0; } Note que no nosso programa colocamos um teste para a abertura do arquivo e utilizamos a função fgets para ler linha a linha o arquivo. Essa função recebe três parâmetros, o vetor onde ficarão armazenados os caracteres da linha lida, a quantidade máxima de caracteres lidos em uma linha e, por último, o ponteiro para o arquivo. Há mais dois comandos muito úteis para ler e gravar dados formatados. Vamos a um exemplo: ) ( ⁄ POR DENTRO DO TEMA #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fptr; fptr = fopen(“Testestr.txt”,”w”); fputs(“Um grande antídoto contra o egoísmo\n”,fptr); fputs(“é a generosidade.... Dê, mesmo que\n”,fptr); fputs(“isso requeira de você um esforço\n”,fptr); fputs(“consciente. Pelo fato de partilhar\n”,fptr); fputs(“tudo o que possui. Seu egoísmo se\n”,fptr); fputs(“abrandará.\n”,fptr); fclose(fptr); return 0; } No programa apresentado, abrimos o arquivo Testestr para a gravação, como já visto anteriormente. Porém, utilizamos a função fputs para gravar linhas inteiras de texto. Note que essa função recebe a frase e o ponteiro do arquivo aberto. Para ler um arquivo não é muito diferente. Vamos a um exemplo: ) ( S0 ACOMPANHE NA WEB Introdução: Manipulação de Arquivos em C Acesso o texto “Introdução: Manipulação de Arquivos em C”. Você encontrará um manual completo para a manipulação de arquivos em C. Disponível em: <http://www.ufjf.br/jairo_souza/files/2009/12/3-Arquivos-Manipula%C3%A7%C3%A3o-de- arquivos-em-C.pdf> . Acesso em: 5 mai. 2014. Aula 12: arquivos No link a seguir você encontrará exemplos e dicas para manipular arquivos e gravar estruturas de dados em arquivos. Disponível em: <http://www.unicamp.br/fea/ortega/info/aula12.htm> . Acesso em: 5 mai. 2014. Programar em C - 06 – Arquivos Assista ao vídeo: Programar em C - 06 – Arquivos . Trata-se de um vídeo com dicas e instruções de manipulação de arquivos em C. Disponível em: <http://www.youtube.com/watch?v=PP-8eFJ4vB0> . Acesso em: 5 mai. 2014. Iniciando C++ Assista ao vídeo: Iniciando C++ . Para você que deseja um tutorial do Dev C++, acesse este link . O vídeo demonstra, passo a passo, como criar o primeiro projeto no Dev C++. Disponível em: <http://www.youtube.com/watch?v=LZ2dkIKc8FE> . Acesso em: 5 mai. 2014. ) ( 9 POR DENTRO DO TEMA #include <stdio.h> #include <stdlib.h> #include <string.h> #define TRUE 1 int main(void) { FILE *fptr; char titulo[30]; int regnum; double preco; fptr = fopen(“livros.txt”,”w”); while (TRUE) { printf(“\nDigite título, registro e preço do livro :”); scanf(“%s %d %lf”, titulo, %regnum, &preco); if (strlen(titulo) <= 1) break; fprint(fptr, “%s %d %.2lf\n”, titulo, regnum, preco); } fclose(fptr); return 0; } Nosso programa obtém dados do nome do livro, registro e preço, faz uma validação, pois não poderá prosseguir sem informar o nome do livro. Por este motivo, utiliza-se a função strlen, que tem a função de verificar o tamanho da string (vetor de caracteres) título. Por último, utiliza a função fprint para gravar no arquivo os dados de maneira formatada. ) ( AGORA É A SUA VEZ Instruções: Agora, chegou a sua vez de exercitar seu aprendizado. A seguir, você encontrará algumas questões de múltipla escolha e dissertativas. Leia cuidadosamente os enunciados e atente-se para o que está sendo pedido. Questão 1 O que é um arquivo? Questão 2 Para ler um caractere por vez, qual das seguintes funções é apropriada? fread() read() fgets() getc() getd() Questão 3 Quais dos seguintes parâmetros podem ser especificados pela função fopen()? O arquivo será aberto para acrescentar dados. O arquivo será aberto em modo hexadecimah. Números serão gravados em formato binário. O arquivo será hido caractere a caractere. O arquivo será hido hinha a hinha. SS ) ( Sł AGORA É A SUA VEZ Questão 4 Para gravar variáveis de diferentes formatos em um arquivo de maneira formatada, a função apropriada é: fputs() fgets() fprintf() fwrite() fread() Questão 5 Se um programador descuidado abrir um arquivo para inserir dados mas não o fechar, o que pode acontecer? Nada, o sistema operacionah fecha o arquivo automaticamente durante a execução do programa. Enquanto o programa estiver sendo executado, nenhum usuário consegue escrever no arquivo. Enquanto o programa estiver sendo executado, nenhum usuário consegue her o arquivo. Após encerrar o programa, o sistema operacionah mantém o arquivo como somente heitura. Após encerrar o programa, o sistema operacionah mantém o arquivo aberto. ) ( S5 AGORA É A SUA VEZ Questão 6 O programa, a seguir, possui um erro. Encontre-o e apresente a consequência e uma solução. #include <stdio.h> #include <stdlib.h> #include <conio.h> int main(void) { FILE *fptr; char ch; fptr=fopen(“arqtext.txt”,”r”); while ((ch=getche()) != ‘\r’) fputc(ch,fptr); fclose(fptr); return 0; } ) ( S4 AGORA É A SUA VEZ Questão 7 O programa, a seguir, força um erro simulando abertura malsucedida do arquivo por meio da atribuição do valor nulo ao ponteiro de arquivo. Comente o que acontecerá com as linhas, a seguir, do programa durante a execução. #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fptr; fptr = fopen(“Testestr.txt”,”w”); fptr = NULL; fputs(“Um grande antidote contra o egoísmo\n”,fptr); fputs(“é a generosidade.... Dê, mesmo que\n”,fptr); fputs(“isso requeira de você um esforço\n”,fptr); fputs(“consciente. Pelo fato de partilhar\n”,fptr); fputs(“tudo o que possui. Seu egosimo se\n”,fptr); fputs(“abrandará.\n”,fptr); fclose(fptr); return 0; } ) ( S6 GLOSSÁRIO String: É uma cadeia de caracteres, ou um vetor de caracteres, e algumas linguagens possuem um tipo de dado para tratar strings como C++. Em C, denota-se como matriz unidimensional ou vetor do tipo char. REFERÊNCIAS MIZRAHI, Viviane V. Treinamento Linguagem C . São Paulo: Pearson, 2008. SCHILDT, H. C. Completo e Total . 3. ed. São Paulo: Makron Books, 1996. SEDGEWICK, R. Algorithms in C - Parts 1 – 4. Addison Wesley, 2003. FINALIZANDO Neste tema, você aprendeu como abrir e fechar um arquivo,como escrever e ler um dado de arquivo e como gravar um registro em um arquivo. ) ( S5 AGORA É A SUA VEZ Questão 8 O programa, a seguir, contém um erro. Comente-o e apresente uma solução. #include <stdio.h> #include <stdlib.h> int main(void) { FILE * fptr; short int ch; fptr=fopen(“arqtext.txt”,”r”); while((ch=fgetc(“ArqText.txt”,”r”) == EOF) print(“%c”,ch); fclose(fptr); return 0; } Questão 9 Atualmente, acessar simultaneamente os arquivos pela rede é algo comum do nosso cotidiano. O que acontece se criarmos um programa para gravar dados em um arquivo e outro usuário tentar abrir e gravar dados nesse arquivo? Questão 10 Por que a constante EOF é importante para a leitura de arquivos? ) ( S8 Questão 9 Resposta: O primeiro usuário tem prioridade no arquivo; portanto, se ele abriu o arquivo com direito de escrita, o segundo abrirá apenas com direito de leitura. Se for o contrário, os dados que o usuário 1 estará enxergando podem ser antigos e precisará reabrir o arquivo para atualizar. Questão 10 Resposta: Para varrer um arquivo, precisamos saber qual é o ponto de parada, seja leitura caractere a caractere ou linha a linha, o EOF é o ponto de parada, ou seja, final do arquivo. ) ( GABARITO Questão 1 Resposta: Arquivo no contexto da linguagem C é todo lugar que tem capacidade para receber dados da memória do computador ou transferi-los para ela. Questão 2 Resposta: Alternativa D. Questão 3 Resposta: Alternativa A. Questão 4 Resposta: Alternativa C. Questão 5 Resposta: Alternativa B. Questão 6 Resposta: O arquivo “arqtext.txt” foi aberto para leitura e na linha que é executada a função fputc, tentamos escrever, isso gera um erro. Questão 7 Resposta: O ponteiro de arquivo está nulo. Logo, é como se o arquivo não estivesse aberto, portanto, o programa apresentará um erro. Questão 8 Resposta: A condição do laço While deve ser faça enquanto não for final de arquivo. Portanto, deve-se retirar o “==” e colocar “!=”, pois, da maneira que está o comando print, nunca será executado. S⁄ )
Compartilhar