Baixe o app para aproveitar ainda mais
Prévia do material em texto
Laboratório de Lógica de Programação II 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 1 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 2 Universidade do Estado do Amazonas Tecnologia em Análise e Desenvolvimento de Sistemas (Sistema Presencial Mediado) Ângela Timótia Pereira Lima Andreza Bastos Mourão Ivana do Nascimento Bernardo Laboratório de Lógica de Programação II 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 3 Governo do Estado do Amazonas Carlos Eduardo de Souza Braga Governador do Estado Omar José Abdel Aziz Vice-Governador do Estado Universidade do Estado do Amazonas Marilene Corrêa da Silva Freitas Reitora Carlos Eduardo de Souza Gonçalves Vice-Reitor Fares Franc Abinader Rodrigues Pró-Reitor de Administração Osail Medeiros de Souza Pró-Reitor de Planejamento Edinea Mascarenhas Dias Pró-Reitora de Ensino de Graduação José Luiz de Souza Pio Pró-Reitor de Pós-Graduação e Pesquisa Rogelio Casado Marinho Filho Pró-Reitor de Extensão e Assuntos Comunitários Escola Superior de Tecnologia Vicente de Paulo Queiroz Nogueira Diretor Curso Superior de Tecnologia em Análise e Desenvolvimento de Sistemas (Sistema Presencial Mediado por Tecnologia) Ednaldo Coelho Pereira Coordenador Geral Ângela Timótia Pereira Lima Coordenadora Pedagógica Nilo Barreto Falcão Neto Coordenador Técnico Administrativo Érica Lima Projeto gráfico Diana Maria da Câmara Gorayeb Revisão Lima, Ângela Timótia Pereira. L732lab Laboratório de programação II / Ângela Timótia Pereira Lima, Andreza Bastos Mourão, Ivana do Nascimento Bernardo – Manaus/AM: UEA Edições, 2008. – (Tecnologia em Análise e Desenvolvimento de Sistemas. 3. Período) 162 p.: il. ; 23 cm. Inclui bibliografia e anexo. ISBN 978-85-89453-82-0 1. 1. Programação - Informática. I. Mourão, Andreza Bastos. II. Bernardo, Ivana do Nascimento. III. Série. IV. Título. CDU (1997): 004.42/.43 Ficha Técnica 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 4 Andreza Bastos Mourão Professora da Escola Superior de Tecnologia (EST/UEA) Especialista em Sistemas de Informação e Aplicações Web (CESF/FUCAPI) Mestranda em Educação pela Universidade de Alcalá de Henares - Espanha (UAH) Ângela Timótia Pereira Lima Professora da Escola Superior de Tecnologia (EST/UEA) Mestre em Engenharia Elétrica pela Universidade Federal de Campina Grande (UFCG) Ivana do Nascimento Bernardo Professora da Escola Superior de Tecnologia (EST/UEA) Especialista em Desenvolvimento de Sistema Baseado em Software Livre (UFAM) Perfil dos Autores 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 5 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 6 Palavra da Reitora Nós últimos anos, o avanço da tecnologia da informática mudou os conceitos de ensino e de trabalho. A preocupação com o que se denominou de "inclusão digital" passou a ser um problema urgente a ser enfrentado pelos dirigentes do País, já que todos os processos de novas tecnologias deságuam no conhecimento de informática. No Amazonas, a dificuldade de locomoção na região, por falta de rodovias, por sua grande extensão territorial, pela baixa densidade demográfica e pelo subdesenvolvi- mento secular imposto à população ribeirinha, torna-se árduo o esforço do Governo para tornar realidade à inclusão digital. A UEA, que já nasceu moderna, incorporando tecnologias educacionais de ponta, utilizando-se particularmente da informática pela massificação do uso de microcomputadores combinados com uma rede complexa de acesso à Internet, não poderia ficar alheia a essa necessidade premente. Por isso, propôs e realizou o primeiro vestibular para levar a 12 municípios um curso que formasse a mão-de-obra inicial que tornasse a inclusão digital uma realidade em nosso Estado. A proposta do curso de Tecnologia em Análise e Desenvolvimento de Sistemas oferecido pela UEA vislumbra criar mão-de-obra qualificada em um número significa- tivo de localidades do Estado, cabendo às pessoas beneficiadas com essa iniciativa a tarefa de irradiar o uso de tecnologias de informática, abrindo caminhos novos e suscitando novos empregos para a população local, consolidando, assim, o exercício da cidadania. Prof.a Dr.a Marilene Corrêa da Silva Freitas Reitora da Universidade do Estado do Amazonas 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 7 Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 8 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 8 Sumário SINOPSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11 CAPÍTULO 1 - FUNÇÃO E PROCEDIMENTO . . . . . . . . . . . . . . . . . . . . . . . . .13 1.1 FUNÇÕES E PROCEDIMENTOS EM C . . . . . . . . . . . . . . . . . . . . . . . . . . .13 1.2 ESTRUTURA DAS FUNÇÕES EM C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13 1.2.1 DECLARANDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14 1.3 FUNÇÃO SEM PASSAGEM DE PARÂMETRO . . . . . . . . . . . . . . . . . . . . . . . .15 1.3.1 SEM RETORNO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15 1.3.2 COM RETORNO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21 1.4 FUNÇÃO COM PASSAGEM DE PARÂMETRO . . . . . . . . . . . . . . . . . . . . . . . .22 1.5 FUNÇÃO RECURSIVA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .29 CAPÍTULO 2 - VETORES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .37 2.1 INTRODUÇÃO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .37 2.2 VETORES EM C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .37 2.2.1 DECLARANDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .37 2.2.2 ATRIBUINDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39 2.2.3 CARREGANDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .41 2.2.4 LENDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .43 2.2.5 MOSTRANDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .43 2.3 APLICAÇÕES COM STRINGS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .48 2.4 APLICANDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .55 CAPÍTULO 3 - MATRIZES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .77 3.1 INTRODUÇÃO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .77 3.2 MATRIZES EM C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .77 3.2.1 DECLARANDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .77 3.2.2 ATRIBUINDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .80 3.2.3 CARREGANDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .81 3.2.4 LENDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .82 3.2.5 MOSTRANDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .83 3.3 APLICANDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .84 CAPÍTULO 4 - REGISTROS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .113 4.1 INTRODUÇÃO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .113 4.2 REGISTROS EM C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .114 4.2.1 DECLARANDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .114 4.2.2 ATRIBUINDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .115 4.2.3 CARREGANDOE LENDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .116 4.2.4 MOSTRANDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .117 4.3 APLICANDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .118 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 9 CAPÍTULO 5 - ARQUIVO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .131 5.1 INTRODUÇÃO À PONTEIROS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .131 5.1.1 EXEMPLOS DE PONTEIRO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .132 5.1.2 ARITMÉTICA DE PONTEIROS . . . . . . . . . . . . . . . . . . . . . . . . . . . . .133 5.2 INTRODUÇÃO À ARQUIVOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .136 5.3 ARQUIVO SEQÜENCIAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .136 5.3.1 MANIPULANDO ARQUIVO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .136 5.4 APLICANDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .141 5.5 ARQUIVO DE ACESSO ALEATÓRIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . .144 5.5.1 CRIANDO UM ARQUIVO DE ACESSO ALEATÓRIO . . . . . . . . . . . . . . . . .144 BIBLIOGRAFIA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .151 ANEXO – EXERCÍCIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .153 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 10 Sinopse CAPÍTULO 1 Neste capítulo será abordado o conceito de FUNÇÃO, sintaxe, importância e aplicação na modularização de programas. As aplicações mostradas nos exemplos trabalham funções sem e com passagem de parâmetros por valor e por referência. CAPÍTULO 2 Neste capítulo será abordada a estrutura de dados homogênea VETOR, conceitos, sintaxe e manipulações com a estrutura. As aplicações mostradas nos exemplos trabalham com funções vistas no capitulo anterior. CAPÍTULO 3 Neste capítulo será abordada a estrutura de dados homogênea MATRIZ, conceitos, sintaxe e aplicações. Os exemplos abordados trabalham com funções vistas no Capítulo1. CAPÍTULO 4 Neste capítulo será abordada a estrutura de dados heterogênea REGISTRO, conceitos, sintaxe e aplicações. Os exemplos abordados trabalham com a definição de novos tipos de variáveis a partir da declaração de registros. Será visto também a declaração da estrutura registro formada por variáveis do tipo VETOR, assim como campos formados por variáveis de tipos criados pelo próprio programador. CAPÍTULO 5 Neste capítulo será abordada a estrutura de dados heterogênea ARQUIVO, conceitos, sintaxe e aplicações. Os exemplos abordados trabalham com a utilização de registros para a sua manipulação. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 11 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 11 Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 12 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 12 CAPÍTULO 1 Função e Procedimento 1.1 FUNÇÕES E PROCEDIMENTOS EM C As funções são utilizadas para transformar problemas complexos em problemas mais simples através da subdivisão do problema. Funções apropriadas podem freqüentemente esconder detalhes de operação de partes de programa que não necessitam conhecê-las, esclarecendo o todo, e facilitando mudanças. Diversas funções são fornecidas com os compiladores, e estão pre- sentes na norma ANSI, como funções matemáticas (seno, cosseno, potência, etc.), funções de entrada e saída (scanf( ), printf( ), etc.) entre outras. Um programa em C deve possuir sempre a função main( ) no seu código independentemente, do número e da variedade de funções que o programa contenha. Uma boa parte dos compiladores C permite declarar a função main( ) sem o uso do tipo void, porém há outros compiladores que exigem esta característica. A função main() usada com o void é para dizer que ela não retor- na nenhum tipo de valor. A última linha do programa, return(0); indi- ca o número inteiro que está sendo retornado pela função, no caso o número 0. 1.2 ESTRUTURA DAS FUNÇÕES EM C A estrutura de uma função em C é bastante semelhante à da função main( ). A única diferença é que main() possui um nome espe- cial.Todas as funções em C começam com um nome seguido de parên- teses (que pode envolver ou não uma lista de argumentos). Uma lista de argumentos são valores que podem ser passados para a função. As funções podem ser definidas antes ou depois do programa principal. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 13 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 13 1.2.1 DECLARAÇÃO A lista_de_parâmetros, também é chamada de lista_de_argu- mentos, é opcional. Onde: Tabela 1.1 – Definição de termos da sintaxe de uma função em C. tipo_da_função <nome da função (lista_de_parâmetros)> { declaração de variáveis; comandos; } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 14 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 14 1.3 FUNÇÃO SEM PASSAGEM DE PARÂMETRO 1.3.1- SEM RETORNO Quando uma função não retorna um valor para a função que a chamou ela é declarada como void. Exemplo 1.1 - Função sem retorno. Programa 1.1 Problema: Faça um programa que leia dois valores e faça uma função para calcular a soma desses valores. Resolução (Programa 1.1): Passo1– Criar a função calculasoma que fará a soma de dois valores; Passo2– Bloco principal: pedir dois valores e fazer a chamada da função para realizar a soma desses valores. #include <stdio.h> void mensagem () // Função simples: só imprime Olá! { printf (“Olá! “); } void main (void) { mensagem(); // Chamada a função printf (“Alunos do Curso TADS!\n”); printf (“\n\n”); return(0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 15 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 15 Programa 1.1 - Função que soma dois números definindo a função no início. // Utilizando a definição da função no início do programa #include <stdio.h> float num1, num2; // Exemplo de função sem retorno void calculasoma ( ) { float soma=0.0; soma=num1+num2; printf(“O valor da soma dos dois números é:%3.2f”,soma); } void main(void) { printf(“Digite um primeiro valor:\n”); scanf(“%f”,&num1); printf(“Digite um segundo valor:\n”); scanf(“%f”,&num2); calculasoma( ); return(0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 16 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 16 Programa 1.2 Problema: Faça um programa que leia dois valores e faça uma função para calcular a soma desses valores fazendo a definição após o programa principal. Resolução (Programa 1.2): Passo1– Criar a função calculasoma que fará a soma de dois valores. Passo2– Bloco principal: pedir dois valores e fazer a chamada da função para realizar a soma desses valores; Programa 1.2 - Função que soma dois números definindo a função no final. //Utilizando a definição da função no final do programa #include <stdio.h> float num1, num2; void calculasoma( ); // protótipo da função void main(void) { printf(“Digite um primeiro valor:\n”); scanf(“%f”,&num1); printf(“Digite um segundo valor:\n”); scanf(“%f”,&num2); calculasoma(); return(0); } void calculasoma( ) { float soma=0.0; soma=num1+num2; printf(“O valor da soma dos dois números é:%3.2f”,soma); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 17 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 17Programa 1.3 Problema: Faça um programa para calcular as quatro operações aritméticas a partir de um menu onde o usuário digita dois valores e escolhe a operação. Resolução (Programa 1.3): Passo1– Criar a função pega_valor que pegará 2 números; Passo2– Criar a função exibe_resultado que exibirá o resultado do cálculo pedido pelo usuário; Passo3– Criar a função soma que realizará a soma dos 2 valores; Passo4- Criar a função subtracao que realizará a subtração dos 2 valores; Passo5- Criar a função multiplicacao que realizará a multipli- cação dos 2 valores; Passo6- Criar a função divisao que realizará a divisão dos 2 valores; Passo7- Bloco principal: o menu que escolherá uma das 4 operações matemáticas. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 18 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 18 #include<stdio.h> float valor1,valor2,result; void pega_valor() { printf(“Entre com o 1 valor: “); scanf(“%f”,&valor1); printf(“Entre com o 2 valor: “); scanf(“%f”,&valor2); return(0); } void exibe_resultado() { printf(“\nO resultado eh: %2.2f”,result); return(0); } void soma( ) { printf(“Rotina de Soma\n\n”); pega_valor(); result = valor1 + valor2; exibe_resultado(); return (0); } void subtracao() { printf(“Rotina de Subtracao\n\n”); pega_valor(); result = valor1 - valor2; exibe_resultado(); return (0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 19 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 19 void multiplicacao() { printf(“Rotina de Multiplicacao\n\n”); pega_valor(); result = valor1 * valor2; exibe_resultado(); return (0); } void divisao() { printf(“Rotina de Divisao\n\n”); pega_valor(); if(valor2!=0) { result = valor1 / valor2; exibe_resultado(); } return (0); } void main(void) { int opcao = 0; while (opcao != 5) { printf(“\nMenu Principal\n\n\n”); printf(“1 - Soma\n”); printf(“2 - Subracao\n”); printf(“3 - Multiplicacao\n”); printf(“4 - Divisao\n”); printf(“5 - Fim\n\n\n”); printf(“Escolha sua opcao: “); scanf(“%d”,&opcao); Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 20 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 20 Programa 1.3 - Calculadora com as 4 operações básicas. 1.3.2 - COM RETORNO Programa 1.4 Problema: Faça um programa para calcular a diferença entre dois horários, onde serão fornecidos somente as horas e minutos. Resolução (Programa 1.4): Passo1– Criar a função minutos que calcula a diferença das horas em minutos; Passo2– Bloco principal: entrada das horas e chamada da função minutos. if (opcao != 5) { switch(opcao) { case 1: soma(); break; case 2: subtracao(); break; case 3: multiplicacao(); break; case 4: divisao(); break; default: printf(“Opcção Inválida - Tente Novamente!”); } } } return (0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 21 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 21 Programa 1.4 - Calcular a diferença entre as horas e retorna em minutos. 1.4. FUNÇÃO COM PASSAGEM DE PARÂMETRO A passagem de parâmetros para uma função deve ser realizada colocando-os dentro de parênteses, separados por vírgulas, imediata- mente após o nome da função. Quando se faz a chamada de uma função, o número e o tipo dos parâmetros enviados devem ser coinci- dentes com os parâmetros presentes no cabeçalho da função. Formas existentes de passar parâmetros em uma função: Passagem por valor: quando a função é chamada, o parâmetro passado por valor é copiado, ou seja, o valor da variável utilizada como parâmetro não é alterado. Passagem por referência: quando a função é chamada, o endereço do parâmetro passado por referência é atribuído à um ponteiro, ou seja, qualquer alteração no conteúdo apontado será refletida no conteúdo da variável utilizada como parâmetro. #include <stdio.h> int minutos() //Retorna hora em minutos { int hora,min; scanf(“%d %d”,&hora,&min); return(hora*60+min); /*Transforma horas em minutos e soma os minutos informados*/ } void main(void) { int mins1,mins2; printf(“Digite a primeira hora(hora:min):”); mins1=minutos(); //Faz a chamada a função e retorna um valor printf(“Digite a segunda hora(hora:min):”); mins2=minutos(); |//Faz a chamada a função e retorna um valor printf(“A diferença eh %d minutos.”,mins2-mins1); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 22 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 22 O exemplo 1.2, chama a função somanum (int n) passando como parâmetro o valor num e retornando o valor da soma dos valores do intervalo. Exemplo 1.2 - Função com passagem de valor e com retorno. // Função com passagem de um parâmetro e retorno de valor #include<stdio.h> int somanum(int n)//Função que recebe um parâmetro { int soma=0,i; for(i=1;i<=n;i++) soma=soma+i; return(soma); } void main(void) { int num; printf(“Digite um valor: “); scanf(“%d”,&num); if (num >0) printf(“O valor da soma dos números de 1 ate n = %d\n\n”, somanum(num)); else printf(“Digite um valor positivo\n”); } Em C só existe passagem de parâmetros por valor. Nunca é pos- sível alterar os argumentos enviados para a função, pois sempre que uma função é invocada é criado um ambiente próprio para a sua execução, ao qual são passadas apenas cópias das var- iáveis, e na seqüência é destruído logo que a execução da função termine. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 23 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 23 O exemplo 1.3 chama a função fatorial (int n) passando como parâmetro o valor limite e chamando a função que calcula e mostra o resultado do fatorial. Exemplo 1.3 - Função com passagem de um parâmetro e com retorno. // Função com passagem de um parâmetro sem retorno de valor #include <stdio.h> int fatorial (int n) { int i, fat; fat=1; for (i=1;i<=n;i++) fat*=i; //fat*i; printf(“\n Fatorial de %d = %d\n”,n,fat); return(0); } void main (void) { int limite; printf(“\n\nCálculo de fatorial\n”); printf(“\nQual fatorial: “); scanf(“%d”,&limite); fatorial(limite); return(0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 24 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 24 O exemplo 1.4, chama a função soma_dobro (int a, int b) passando como parâmetro os valores x e y e chamando a função que calcula o dobro e retorna o valor da soma. Exemplo 1.4 - Função com passagem de dois parâmetros e com retorno. Programa 1.5 Problema: Faça um programa que leia o total de dias e crie uma função para retornar o valor total de anos. Resolução (Programa 1.5): Passo1– Criar a função Dano para receber o total de dias e retornar o total em anos; Passo2– Bloco principal: solicita o número de dias e chama a função Dano que calcula o total em anos, passando o número de dias e os dias do ano (valor constante) por parâmetro; // Função com passagem de dois parâmetros com retorno de valor #include <stdio.h> int soma_dobro(int a,int b) { int soma; a=2*a; b=2*b; soma=a+b; return(soma); } void main(void) { int x,y,res; printf(“Digite o primeiro número:”); scanf(“%d”,&x); printf(“Digite o segundo número:”); scanf(“%d”,&y); res=soma_dobro(x,y); printf(“\n A soma do dobro dos números eh:%d”,res); return(0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 25 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 25 Programa 1.5 – Calcula o total de anos de acordo com a quantidade de dias. // Funçãocom passagem de dois parâmetros com retorno de valor #include <stdio.h> #define DIASANO 365.25 int Dano(float d, float a) { return(d/a); } int main (void) { // Declaração de Variáveis float Dias,Anos; // Entrada de Dados printf (“Entre com o número de dias: “); scanf (“%f”,&Dias); // Conversão Dias->Anos Anos = Dano(Dias,DIASANO); printf (“\n\n A Quantidade de Anos eh.%.2f\n”, Anos); printf (“\n\n”); return (0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 26 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 26 Programa 1.6 Problema: Criar uma função para receber três valores reais passados por parâmetro, multiplicar e mostrar o resultado. Resolução (Programa 1.6): Passo1– Criar a função mult que calcula e mostra o produto de três valores; Passo2– Bloco principal: Atribuir valores às três variáveis e chamar a função mult, enviando os valores por parâmetro. Programa 1.6 – Função para multiplicação de três valores. Na Linguagem C, para trabalharmos com passagem de parâmetros por referência, fazemos o uso do tipo de variável (ponteiros) que terá uma abordagem introdutória no capítulo 5. O exemplo 1.5 chama a função troca (int *a, int *b) passando como parâmetro dois valores inteiros n e k e chamando a função que troca os valores enviados por parâmetro. // Função com passagem de três parâmetros sem retorno de valor #include <stdio.h> mult(float a,float b,float c) { printf(“%2.2f”,a*b*c); } void main(void) { float x,y; x = 23.5; y = 12.9; mult(x,y,3.5); return(0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 27 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 27 Exemplo 1.5- Função com passagem de dois parâmetros por referência. // Função com passagem de dois parâmetros por referência #include <stdio.h> // Passagem de parâmetro por referência int troca (int *a, int *b) // Definição de ponteiros que receberão os valores { int x; // Variável auxiliar x = *a; *a=*b; *b=x; return (0); } // Programa principal void main(void) { int n,k; // Entrada de dados printf(“\n\nDigite dois valores inteiros\n”); scanf(“%d %d”,&n,&k); printf(“Antes da troca n=%d e k=%d\n”,n,k); troca(&n,&k); printf(“Depois da troca n=%d e k=%d \n”,n,k); return(0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 28 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 28 1.5 FUNÇÃO RECURSIVA Geralmente, os programas que analisamos são estruturados como funções chamadas entre si de uma maneira disciplinada e hierárquica. Para alguns tipos de problemas, é útil ter funções que chamem a si mesmas. Uma função recursiva é uma função que chama a si mesma, dire- tamente ou indiretamente, o exemplo 1.6 demonstra o cálculo de um fatorial, usando recursividade. Exemplo 1.6 - Função recursiva. #include <stdio.h> long fatorial (long numero) { if (numero <=1) return (1); else return (numero * fatorial (numero -1)); } void main (void) { int i; for (i = 1; i <= 10; i++) printf (“%2d! = %1d\n”, i, fatorial(i)); return (0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 29 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 29 Programa 1.8 Problema: Escrever um programa que leia as medidas dos três lados a,b, e c de um paralelepípedo, calcule e escreva o valor de sua diagonal. Resolução (Programa 1.8): Passo1– Criar a função hipotenusa que calcula a distância; Passo2– Bloco principal: atribui valores às três variáveis e chama a função hipotenusa recursivamente, enviando os valores por parâmetro. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 30 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 30 Programa 1.8 – Função para o cálculo do paralelepípedo. // Função com passagem de dois parâmetros com retorno de valor #include <stdio.h> #include <math.h> float a,b,c,D; float hipotenusa (float a,float b) { return(sqrt(a*a + b*b); } void main (void) { printf(“Entre com A: “); scanf(“%f”,&a); printf(“Entre com B: “); scanf(“%f”,&b); printf(“Entre com C: “); scanf(“%f”,&c); D = hipotenusa(hipotenusa(a,b),c); printf(“Diagonal %f”,D); return (0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 31 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 31 Programa 1.9 Problema: Dado o número de discos n e o nome das torres de origem, desti- no e auxiliar, resolver o problema das Torres de Hanói para n discos. Resolução (problema 1.9) Mover n discos de ORIGEM para DESTINO, é o mesmo que: Passo1- mover n-1 discos de ORIGEM para AUXILIAR, usando DES- TINO como auxiliar; Passo2- mover disco n de ORIGEM para DESTINO; Passo3- mover n-1 discos de AUXILIAR para DESTINO, usando origem como auxiliar; Em nenhum dos passos acima, as regras do jogo foram quebradas. Falta a regra de parada que ocorre quando n é 1. Neste caso, basta mover o disco 1 de ORIGEM para DESTINO. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 32 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 32 Programa 1.9 – Função para uso da Torre de Hanói . #include <stdio.h> void writemove(int k, char origem[], char destino[]) { printf(“\n move disco %3d da torre %10s para a torre %10s”, k, origem, destino); } void hanoi(int n, char a[], char b[], char c[]) { if (n == 1) writemove(1, a, b); else { hanoi(n - 1, a, c, b); writemove(n, a, b); hanoi(n - 1, c, b, a); } } int main() { int n; char origem[10], destino[10], auxiliar[10]; printf(“Entre com o numero de discos:”); scanf(“%d”, &n); printf(“Entre com os nomes dos discos (origem destino auxiliar):”); scanf(“%s%s%s”, origem, destino, auxiliar); // Chama a função para movimentar os discos hanoi(n, origem, destino, auxiliar); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 33 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 33 Atividades 1.1- Escrever uma função para fazer um algoritmo que transforme segundos em horas, minutos e segundos. Ex.: 11030 = 3h 3min 50seg 1.2- Escrever uma função que recebe dois números inteiros, positivo, e determine o produto dos mesmos, utilizando o seguinte méto- do de multiplicação. ! Dividir, sucessivamente, o primeiro número por 2, até que se obtenha 1 como quociente; ! Paralelamente, dobrar, sucessivamente, o segundo número; ! Somar os números da segunda coluna que tenham um número ímpar na primeira coluna. O total obtido é o produto procurado. Ex.: 1.3- Construir uma função que retorne o resto de uma divisão entre dois números inteiros. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 34 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 34 1.4- Fazer um programa em “C” que solicita o total gasto pelo cliente de uma loja, imprime as opções de pagamento, solicita a opção desejada e imprime o valor total das prestações (se houverem). 1) Opção: a vista com 10% de desconto; 2) Opção: em duas vezes (preço da etiqueta); 3) Opção: de 3 até 10 vezes com 3% de juros ao mês (somente para compras acima de R$ 100,00). OBS: Fazer uma função que imprime as opções solicita a opção desejada e retorna a opção escolhida. No bloco principal, testar a opção escolhida e ativar a função correspondente (uma função para cada opção). 1.5- Fazer um programa, para cada um dos itens abaixo, para criar a função main( ) que teste cada uma das funções: a) Fazer uma função para mostrar na tela a seguinte saída: *************************** * FELIZ ANIVERSÁRIO* *************************** b) Criar uma função para converter a temperatura de Fahrenheit para Celsius. A temperatura em °F é fornecida como entrada e passada como parâmetro para a função que retorna a temperatu- ra em °C, que deve ser mostrada no programa principal. C= ( F- 32)*5/9 c) Elaborar uma função para ler a base e a altura de um retângu- lo, calcular e retornar a sua área. Na função principal é apresen- tado o valor da área. Area=base*altura 1.6- Escrever uma função que recebe o valor de três parâmetros do tipo char (fornecidos como entrada) e mostre estes valores em ordem crescente. Por exemplo, se ch1, ch2 e ch3 são variáveis do tipo char com valores ‘B’, ‘A’,’C’, respectivamente, serão apre- sentados os valores : ‘A’, ‘B’ , ‘C’. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 35 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 35 1.7- Fazer um função que receba como parâmetro o preço atual de uma mercadoria e o reajuste a ser aplicado e retorne o novo preço da mercadoria com reajuste. Escreva a função main( ) para solicitar os parâmetros e testar a função criada, mostrando o preço da mercadoria depois do aumento, bem como o percentu- al aplicado. 1.8 – Criar um programa para ler dois números e chamar uma função que mostrar três mensagens: se os valores recebidos são iguais ou diferentes; e se o 1.º valor é par ou ímpar; assim como o 2.°. O programa será finalizado quando for digitado um valor negati- vo para o primeiro número. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 36 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 36 CAPÍTULO 2 Vetores 2.1 INTRODUÇÃO Vetores são variáveis capazes de armazenar vários elementos, onde cada elemento tem a sua identificação caracterizada pelo mesmo nome. Este nome atribuído ao vetor é diferenciado por um índice. Um vetor é também conhecido como array, e podem armazenar uma quantidade de elementos de um mesmo tipo de dados. Em uma mesma estrutura de dados de um determinado programa pode-se ter vários vetores declarados, cada um armazenando valores de tipos distintos e possuindo uma quantidade diferente de elementos a serem armazenados. As variáveis índices a serem criadas em C, utilizadas para identi- ficar a posição que será armazenado o elemento a ser inserido no vetor tem início sempre com o valor zero (0) e finaliza até o tamanho do vetor subtraído de uma (1) unidade. 2.2 VETORES EM C 2.2.1 DECLARANDO As variáveis do tipo vetor são identificadas pela existência de colchetes [], após o nome da variável no momento da declaração, onde dentro do colchete encontra-se a quantidade de posições necessárias para o armazenamento de elementos. Dica: Para cada vetor criado especifica-se quantidade e tipo de dado que será armazenado e onde seus valores estarão consecutivamente inseridos. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 37 04_LabLogProgIIBook.qxp 6/5/2008 20:53 Page 37 Sintaxe: Tipo de dado <nome do vetor [índice]>; Onde: Tabela 2.1 – Definição de termos da sintaxe vetor em C. Exemplos: int vet1 [20],i; ou char vet2[30]; int i; Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 38 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 38 2.2.2 ATRIBUINDO Atribuição de um valor a um elemento, em uma determinada posição do vetor: Sintaxe: nome_do_vetor [índice] = valor ; Exemplo: 1. vet1 [i] = 10; Atribuição do elemento 10 na primeira posição do vetor. Índice igual a 0 (zero). 2. vet1 [2] = 10; Atribuição do elemento 10 na terceira posição do vetor. Índice igual a 2 (dois). 3. char vet2 [ ] = “Maues”; Atribuição da string ‘Maues’ no vetor recebendo cada caracter em uma posição. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 39 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 39 O exemplo 2.1 mostra um vetor de tamanho 5 onde os valores são atribuídos a cada uma das posições do vetor. Exemplo 2.1 – Atribuição de elementos no vetor com número. O exemplo 2.2 mostra um vetor de caracter onde os valores são atribuídos na declaração. Exemplo 2.2 – Atribuição de elementos no vetor com caracter. #include <stdio.h> // Programa atribuir elemento void main (void) { char vet1[ ]= “Coari”; return (0) } #include <stdio.h> // Programa atribuir elementos ao vetor void main (void) { int vet[5]; vet[0]=10; vet[1]=20; vet[2]=30; vet[3]=40; vet[4]=50; return (0) } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 40 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 40 2.2.3 CARREGANDO Para carregar valores no vetor o usuário deverá informar o ele- mento a ser inserido. O mesmo será lido e armazenado, seqüencial- mente, no vetor especificado. Na linguagem C é importante ressaltar que o armazenamento de uma cadeia de caracteres, como por exemplo: o nome de uma pessoa é declarado como char (tipo caracter). E cada elemento do nome, ou seja, cada letra é armazenado em uma posição do vetor. Lembrando que é necessário definir uma posição a mais para armazenar a marca de finalização de cadeia (\0). O exemplo 2.3, mostra o vetor a ser carregado que chama-se vetor1 e possui 10 posições. A variável i é a variável índice que con- trola a posição exata que o elemento será armazenado. Exemplo 2.3 – Carregando elementos no vetor. #include <stdio.h> //Programa carregar vetor void main (void) { int vetor1[10]; int i; for (i=0;i<10;i++) { printf(“\n VETOR 1 - POSIÇÃO[%d]:”, i); scanf(“%d”,&vetor1[i]); } return (0) } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 41 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 41 O vetor a ser carregado poderá armazenar até no máximo cinco elementos (capacidade máxima), porém armazenará apenas as infor- mações de dois usuários, como delimitado no laço de repetição. A variável inteira cont é do tipo índice pois é responsável pelo controle do armazenamento dos elementos em suas respectivas posições. Exemplo 2.4 – Atribuição de elementos no vetor com caracter. #include <stdio.h> void main(void) { int cont, id[5]; float alt[5]; char nome[30][5]; char sex[1][5]; // Carregando as informações no vetor for (cont=0;cont<2;cont++) { printf(“\n Informe o seu nome: \n”); scanf(“%s”,nome[cont]); printf(“\n Informe a sua idade: \n”); scanf(“%d”,&id[cont]); printf(“\n Informe a sua altura: \n”); scanf(“%f”,&alt[cont]); printf(“\n Informe o seu sexo:[F/M] \n”); scanf(“%s”,sex[cont]); } } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 42 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 42 2.2.4 LENDO Sintaxe: scanf (“%tipo”,&vetor[índice]); Exemplo: scanf (“%d”,&vet[i]); ou scanf(“%c”,&vet[i]); 2.2.5 MOSTRANDO Ao carregar ou atribuir valores ao vetor, pode-se realizar a sua impressão, ou seja, mostrar na tela os valores armazenados no vetor. E suas respectivas posições se necessário. Para mostrar os elementos inseridos em um vetor, precisa-se uti- lizar uma estrutura de repetição para que seja lido cada um dos ele- mentos, sequencialmente e exibidos na tela. Sintaxe: printf (“mensagem e código de formatação”, nome da variável[índice]); ou printf (“código de formatação”, nome da variável[índice]); Exemplo: printf (“O valor armazenado na variável é %tipo”,vetor[i] ); ou printf (“%tipo”,vetor[i] ); Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 43 04_LabLogProgIIBook.qxp 6/5/200820:54 Page 43 Veja a tabela de formatação de tipo. Tabela 2.2 - Código de formatação Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 44 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 44 O exemplo 2.5 mostra os valores inteiros atribuídos, inicialmente, no vetor em suas respectivas posições. Exemplo 2.5 – Valores atribuídos diretamente no vetor. #include <stdio.h> // Atribuir elementos ao vetor int main () { int vet[5]; int i; vet[0]=10; vet[1]=20; vet[2]=30; vet[3]=40; vet[4]=50; // Mostrar os elementos atribuídos ao vetor for (i=0;i<5;i++) printf (“\n Os valores armazenados no VETOR 1 - POSIÇÃO[%d] eh: [%d] \n”, i, vet[i]); return (0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 45 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 45 O exemplo 2.6 carrega em um vetor valores solicitados do usuário e imprime os resultados na tela. Logo, os valores contidos no vetor são exibidos, bem como a respectiva posição que se encontram. Exemplo 2.6 – Atribuição de elementos no vetor com caracter. // Programa carregar e mostrar valores do vetor #include <stdio.h> void main (void) { int vet[5]; int i; for (i=0;i<5;i++) { printf(“\n Informe o valor a ser armazenado no VETOR: “); scanf(“%d”,&vet[i]); } for (i=0;i<5;i++) printf(“\n Os valores armazenados no VETOR 1 - POSIÇÃO[%d] eh: [%d] \n”, i, vet[i]); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 46 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 46 O exemplo 2.7 solicita dados do usuário, armazena em um vetor de 5 posições e mostra os dados armazenados no vetor na tela. Exemplo 2.7 – Mostrando dados de um vetor. #include <stdio.h> void main(void) { int cont, id[5]; float alt[5]; char nome[5][30]; char sex[5][2]; // Carregando as informaçõeS no vetor for (cont=0;cont<5;cont++) { printf(“\n Informe o seu nome: \n”); scanf(“%s”,nome[cont]); printf(“\n Informe a sua idade: \n”); scanf(“%d”,&id[cont]); printf(“\n Informe a sua altura: \n”); scanf(“%f”,&alt[cont]); printf(“\n Informe o seu sexo:[F/M] \n”); scanf(“%s”,sex[cont]); } //Mostrar os valores inseridos no vetor for (cont=0;cont<5;cont++) { printf(“\n \n Seu nome eh:%s\n”,nome[cont]); printf(“\n Sua idade eh:%d \n”,id[cont]); printf(“\n Sua altura eh:%2.2f\n”, alt[cont]); printf(“\n Seu sexo eh:%s \n”,sex[cont]); } return(0) } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 47 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 47 2.3 APLICAÇÕES COM STRINGS De acordo com os conceitos vistos anteriormente, será mostrado como resolver alguns problemas utilizando estruturas de dados com- postas homogêneas do tipo vetor em linguagem de programação C, utilizando o ambiente do Eclipse. A prática, ou seja, a construção de programas que visam solu- cionar problemas nos quais as estruturas homogêneas tornam-se necessárias tende a contribuir para a melhor assimilação do conteúdo. Para trabalhar com strings em Linguagem C não possuímos o tipo string e sim, o tipo char, que quando não utilizado com um tamanho específico, possibilita a leitura de apenas um caractere no teclado. Sintaxe: char <nome_da_string [tamanho]>; Pode-se citar alguns tipos de strings em linguagem C: gets, strcpy, strcat, strlen e strcmp. A biblioteca padrão em C possui diversas funções que manipulam strings. Tais funções são úteis, pois não se pode, por exemplo, copiar o conteúdo de uma variável do tipo string para outra variável do mesmo tipo, sem utilizar umas das funções correspondentes, uma vez que não é possível fazer atribuição diretamente. nome1= nome2; //Não é aceito, desta forma. STRINGS em linguagem C são vetores de char (caracteres). Sendo que o tamanho da string deve incluir no final ‘\0’. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 48 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 48 O exemplo 2.8, mostra o uso da função strcpy que possibilita copiar os caracteres de uma string para outra variável do tipo string. Exemplo 2.8 – Copiando uma string para uma variável do tipo string. As funções apresentadas nestas seções estão no arquivo cabeçalho <string.h>. #include <stdio.h> #include <string.h> void main (void) { char nome1[20],nome2[20]; //Leitura nome1 que será copiada para nome2 printf (“Digite um nome: “); gets (nome1); strcpy (nome2,nome1); //Copia nome1 em nome2 //Continuação do programa } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 49 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 49 A tabela 2.3, mostra algumas funções básicas para manipulação de strings, seus conceitos e sintaxe na linguagem C: Tabela 2.3 – Funções de strings. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 50 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 50 A seguir Programas utilizando as funções da Tabela 2.3. O exemplo 2.9 mostra como a função gets() trabalha. Exemplo 2.9 – Função gets(). O exemplo 2.10, mostra como a função strcpy() trabalha. Exemplo 2.10 – Função strcpy(). #include <stdio.h> #include <string.h> void main (void) { char nome1[30],nome2[30],nome3[30]; printf (“Entre com uma string: “); gets (nome1); //Copia nome1 em nome2 strcpy (nome2,nome1); // Copia “Você digitou o nome: “ em nome3 strcpy (nome3,”Você digitou o nome: “); printf (“\n\n%s%s”,nome3,nome2); return(0); } #include <stdio.h> void main (void) { char nome[30]; printf (“Digite o seu nome: “); gets (nome); printf (“\n\n Bom dia %s”, nome); return(0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 51 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 51 O exemplo 2.11, mostra coma a função strcat() trabalha. Exemplo 2.11 – Função strcat(). #include <stdio.h> #include <string.h> void main (void) { char nome1[30],nome2[30]; printf (“Entre com uma string: “); gets (nome1); strcpy (nome2,”Você digitou o nome:”); strcat (nome2,nome1); // Nome2 armazenará “Você digitou o nome: + o conteúdo de nome1” printf (“\n\n%s”,nome2); return(0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 52 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 52 O exemplo 2.12, mostra como a função strlen() trabalha. Exemplo 2.12 – Função strlen(). #include <stdio.h> #include <string.h> void main (void) { int tam; char nome[30]; printf (“Entre com um nome: “); gets (nome); tam = strlen (nome); printf (“\n\n O nome que você digitou tem tamanho %d”,tam); return(0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 53 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 53 O Exemplo 2.13, mostra como a função strcmp() trabalha: Exemplo 2.13 - função strcmp() Obs: Se as duas forem idênticas a função retorna zero, se elas forem diferentes a função retorna diferente de zero. #include <stdio.h> #include <string.h> void main (void) { char nome1[30],nome2[30]; printf (“Entre com um nome: “); gets (nome1); // ou fgets(nome1,30,stdin) printf (“\n\n Entre com outro nome: “); gets (nome2); // ou fgets(nome2,30,stdin) if (strcmp(nome1,nome2)== 0) printf (“\n\n As duas strings são iguais.”); else printf (“\n\n As duas strings são diferentes.”); return(0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 54 04_LabLogProgIIBook.qxp6/5/2008 20:54 Page 54 2.4 APLICANDO Programa 2.1 Problema: Dado um vetor com 4 posições, construa um programa que atribua à posição 2 do vetor o valor 10 e preencha as outras posições com valores fornecidos pelo usuário. Resolução (Programa 2.1): Passo1– Atribuir o valor 10 à segunda posição do vetor; Passo2– Ler três números inteiros; Passo3– Armazenar no vetor; Passo4– Mostrar: posição e valor armazenado. Programa 2.1 - Atribuir, armazenar e mostrar valores. #include <stdio.h> int main(void) { int vet[4],i=0; while(i<4) { if (i==1) vet[1]=10; else { printf(“\n Informe um valor inteiro: \n “); scanf(“%d”,&vet[i]); } i=i+1; } for(i=0;i<4;i++) { printf(“\n O valor armazenado é: %d posição: %d do vetor\n”,vet[i],i); } return(0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 55 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 55 Programa 2.2 Problema: Construa um programa que receba 4 números e mostre a seguinte saída: Informe o 1 número 3 Informe o 2 número 4 Informe o 3 número 5 Informe o 4 número 2 Os números digitados foram: 3 + 4 + 5 + 2 = 14 Resolução (Programa 2.2): Passo1– Criar um vetor de tamanho 4; Passo2– Atribuir ou ler os valores acima e armazenar seqüencial- mente no vetor; Passo3– Somar os valores armazenados no vetor; Passo4– Mostrar: valores armazenados e o total da soma destes. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 56 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 56 Programa 2.2. Atribuir, somar e mostrar valores. Programa 2.3 Problema: Construa um programa que carregue um vetor de tamanho 5 com números reais e crie uma função que retorne esses números ordena- dos de forma crescente. Resolução (Programa 2.3): Passo1– Criar a função crescente por parâmetro, onde será pas- sado neste parâmetro o vetor, que irá ordenar crescentemente os valores reias e exibir a ordenação. Passo2– Bloco principal: carregar o vetor de tamanho 5 e chamar a função crescente. #include<stdio.h> int main(void) { int vet[4],i,soma=0; for(i=0;i<4;i++) { printf(“\n Informe o %d nùmero: \n”,i+1); scanf(“%d”,&vet[i]); } for(i=0;i<4;i++) soma = soma + vet[i]; printf(“\n \n Os números digitados foram: \n”); printf(“\n %d + %d + %d + %d = %d \n \n”,vet[0],vet[1],vet[2],vet[3],soma); return(0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 57 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 57 Programa 2.3 – Mostrar os elementos do vetor ordenados. #include <stdio.h> int i; float vet[4]; crescente (float vet1[4]) { int i,j; float aux; for (i=0;i<4;i++) for (j=0;j<3;j++) if (vet1[j] > vet1[j+1]) { aux=vet1[j]; vet1[j]=vet1[j+1]; vet1[j+1]=aux; } printf(“\n Vetor ordenado de forma Crescente \n”); for (i=0;i<4;i++) printf(“\n %2.2f”,vet1[i]); } main(void) { for(i=0;i<4;i++) { printf(“\n Informe o %d número: \n”,i+1); scanf(“%f”,&vet[i]); } crescente(vet); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 58 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 58 Programa 2.4 Problema: Construa um programa que carregue um vetor de caracteres que receba as siglas dos 12 municípios onde ocorrem as aulas de Tecnologia em Análise e Desenvolvimento de Sistemas- TADS, ordenando o vetor de forma crescente. Entre com os dados conforme a tabela a seguir: Resolução (Programa 2.4): Passo1– Carregar um vetor de tamanho 12 de caracter; Passo2– Ordenar o vetor de forma crescente; Passo3– Mostrar os municípios em ordem crescente e suas respec- tivas posições. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 59 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 59 Programa 2.4 – Mostrar o nome dos municípios em ordem crescente. #include <stdio.h> #include <string.h> main(void) { char aux[30], vet[30][12]; int i,j; for (i=0;i<12;i++) { printf(“\n Digite o %d Município:”, i+1); gets(vet[i]); } for (i=0;i<12;i++) { for (j=0;j<11;j++) { if (strcmp(vet[j],vet[j+1]) > 0) { strcpy(aux,vet[j]); strcpy(vet[j],vet[j+1]); strcpy(vet[j+1],aux); } } } printf(“\n Vetor ordenado de forma Crescente \n”); for (i=0;i<12;i++) { printf(“\n %s”,vet[i]); } return(0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 60 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 60 Programa 2.5 Problema: Construa um programa que carregue dois vetores com 4 elementos inteiros e positivos e crie uma função que calcule e mostre o vetor união dos dois primeiros. Resolução (Programa 2.5): Passo1– Carregar dois vetores de tamanho 4 com números inteiros e positivos; Passo2– Criar a função uniao para unificar os dois vetores passa- dos por parâmetro; Passo3– Bloco principal: carrega os dois vetores de quatro posições (vet1 e vet2) em seguida, chama a função uniao e mostra os elementos dos vetores unificados em um terceiro vetor (vet3) de 8 posições. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 61 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 61 #include <stdio.h> //Função União - Elementos dos Vetores void uniao(int a[], int b[], int u[]) { int i; for (i=0;i<8;i++) u[i] = -1; for (i=0;i<4;i++) { u[i] = a[i]; u[i+4] = b[i]; } } //Bloco Principal int main(void) { int x, vet1[4], vet2[4], vet3[8]; //Carregando o Vetor 1 for (x=0;x<4;x++) { do { printf(“\n Digite o %d elemento de A \n”, x+1); scanf(“%d”,&vet1[x]); } while (vet1[x]<0); } printf(“\n\n”); Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 62 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 62 Programa 2.5 – Mostrar os elementos do vetor união. //Carregando o Vetor 2 for (x=0;x<4;x++) { do { printf(“\n Digite o %d elemento de B \n”, x+1); scanf(“%d”,&vet2[x]); } while (vet2[x]<0); } //Chamando a função e passando o vetor por parâmetros uniao(vet1,vet2,vet3); // Mostrando o Vetor União x=0; while (x<8) { printf(“\n”); printf(“Vetor União => %d”,vet3[x]); x++; } return(0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 63 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 63 Programa 2.6 Problema: Construa um programa que carregue um vetor de tamanho 5 com números inteiros e passe os valores por parâmetro para que a função retorne e mostre qual é o maior e o menor elemento deles. Resolução (Programa 2.6): Passo1– Carregar dois vetores de tamanho 5 com números inteiros; Passo2– Criar a função maior_menor para verificar qual é o maior e o menor número armazenado no vetor; Passo3– Bloco principal: carrega o vetor com 5 elementos inteiros e chama a função maior_menor que armazenará o maior e o menor elemento inteiro e exibirá para o usuário. #include <stdio.h> void maior_menor(int vet[5]) { int i, maior=0, menor=0; for(i=0;i<5;i++) if (i==0) { maior = vet[i]; menor = vet[i]; } else { if (vet[i] > maior) maior = vet[i]; if (vet[i] < menor) menor = vet[i]; } printf(“ \n O maior número digitado foi: %d”, maior); printf(“ \n O menor número digitado foi: %d”, menor); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 64 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 64 Programa 2.6 – Maior e menor valor void main(void) { int i,vet[5];for(i=0;i<5;i++) { printf(“Carregando o elemento Vetor[%d]: “,i+1); scanf(“%d”,&vet[i]); } maior_menor(vet); return(0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 65 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 65 Programa 2.7 Problema: Construa um programa que preencha um vetor com 10 números inteiros, verifique e mostre os números superiores a cinqüenta e suas respectivas posições. O programa deverá mostrar mensagem se não existir nenhum número nessa condição. Resolução (Programa 2.7): Passo1– Carregar um vetor com dez números inteiros; Passo2– Verifique se existem números superiores a 50; Passo3– Caso não existam mostre uma mensagem; Passo4– Mostrar o valor e a sua respectiva posição. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 66 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 66 Programa 2.7 – Mostrar números superiores a 50. #include <stdio.h> main(void) { int vet[10], i, achou; for (i=0; i<10;i++) { printf(“Digite o %d número: “,i+1); scanf(“%d”,&vet[i]); } achou = 0; for (i=0; i<10;i++) { if (vet[i] > 50) { printf(“\n Número maior que 50 ==> %d encon- trado na posição:[%d]”, vet[i],i); achou = 1; } } if (achou == 0) printf(“\n Não existem números superiores a 50 no vetor”); return(0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 67 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 67 Programa 2.8 Problema: Construa um programa que receba 7 números inteiros e mostre: a) Os números pares digitados; b) A soma dos números pares digitados; c) Os números ímpares digitados; d) A quantidade de números ímpares digitados. Resolução (Programa 2.8): Passo1– Carregar um vetor com sete números inteiros; Passo2– Verifique os números pares digitados; Passo3– Somar os números pares; Passo4– Verifique os números ímpares digitados; Passo5– Verifique a quantidade de números ímpares; Passo6– Mostre os valores. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 68 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 68 #include <stdio.h> int main(void) { int num[7], i, soma, qtde, achou; for (i=0;i<7;i++) { printf(“\n Digite o %d elemento \n”, i+1); scanf(“%d”,&num[i]); } soma = 0; achou = 0; printf(“\n Os números pares são: \n”); for (i=0;i<7;i++) { if (num[i]%2 == 0) { achou = 1; printf(“\n %d na posição ==> %d \n”,num[i],i); soma = soma + num[i]; } } if (achou == 0) { printf(“\n Nenhum número par foi digitado \n”); } else { printf(“\n A Soma dos pares = %d \n”,soma); } qtde = 0; achou = 0; Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 69 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 69 Programa 2.8 – Mostrar soma e números pares, quantidade e números ímpares. Programa 2.9 Problema: Construa um programa que ao carregar um vetor com 10 números inteiros já os armazene de forma decrescente. Resolução (Programa 2.9): Passo1– Carregar um vetor com dez números inteiros; Passo2– Ordenar o vetor de forma decrescente; Passo3– Mostrar o vetor ordenado de forma decrescente. printf(“\n\n Os números ímpares são: \n”); for (i=0;i<7;i++) { if (num[i]%2 != 0) {achou = 1; printf(“\n %d na posição %d \n”, num[i], i); qtde = qtde + 1; } } if (achou == 0) printf(“\n Nenhum número ímpar foi digitado \n”); else printf(“\n Quantidade dos ímpares = %d \n” , qtde); return(0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 70 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 70 Programa 2.9 – Ordenação de um vetor de forma decrescente #include <stdio.h> int main(void) { int vet[10], i, j, aux; for (i=0;i<10;i++) { printf(“\nDigite o %d elemento do vetor:”, i+1); scanf(“%d”,&vet[i]); } for (i=0;i<10;i++) { for (j=0;j<9;j++) { if (vet[j] < vet[j+1]) { aux = vet[j]; vet[j] = vet[j+1]; vet[j+1] = aux; } } } printf(“\n Vetor ordenado de forma Decrescente \n”); for (i=0;i<10;i++) { printf(“\n %d”,vet[i]); } return(0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 71 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 71 Programa 2.10 Problema: Construa um programa que preencha um primeiro vetor com dez números inteiros e um segundo vetor com cinco números inteiros. O programa deverá mostrar uma lista dos números do primeiro vetor com seus respectivos divisores armazenados no segundo vetor, bem como as suas respectivas posições. Exemplo de Saída do Programa: Exemplo: resto(5/5) = 0 Resolução (Programa 2.10): Passo1– Carregar um vetor com dez números inteiros; Passo2– Carregar um vetor com cinco números inteiros; Passo3– Verificar por quais números os elementos do vetor1 são divisíveis com os elementos do vetor 2; Passo4– Mostrar uma lista com os números do vetor1 e seus respectivos divisores do vetor2 e suas respectivas posições. Obs: Para saber se um número é divisível por outro deve-se testar o resto. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 72 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 72 Programa 2.10 – Listar valores divisores. #include <stdio.h> int main(void) { int vet1[10], vet2[5], i, j, achou; // Carregando Vetores for (i=0;i<10;i++) { printf(“\n Digite o %d número do vetor 1: \n”, i+1); scanf(“%d”,&vet1[i]); } for (i=0;i<5;i++) { printf(“\n Digite o %d número do vetor 2: \n”, i+1); scanf(“%d”,&vet2[i]); } //Verificar se um número é divisível por outro, testar o resto. for (i=0;i<10;i++) { achou = 0; printf(“\n Número: %d \n”, vet1[i]); for (j=0;j<5;j++) { if (vet1[i] % vet2[j] == 0) { printf(“\n Divisível por %d na posição %d \n”,vet2[j],j); achou = 1; } } if (achou == 0) printf(“\n Não possui divisores no 2 vetor \n”); } return(0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 73 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 73 Atividades 2.1- Construa um programa que carregue dois vetores de 4 elementos cada. Mostre o vetor resultante da intercalação desses dois vetores. 2.2- Construa um programa que permita criar um vetor de 40 posições para cada uma das variáveis definidas abaixo: a) Aluno, Nota1,Nota2, Nota3, Nota4. Para cada entrada então, calcular a média aritmética de cada aluno, armazenando-a no vetor média. No final do processamen- to, imprima todos os nomes de alunos e suas respectivas médias para todos os alunos que estiverem na situação de APROVADOS, de acordo com o seguinte critério: 2.3- Construa um programa que armazene 5 nomes próprios. Mostre os nomes em ordem alfabética. 2.4- Construa um programa que carregue um vetor com seis elemen- tos inteiros. Calcule e mostre: a) Todos os números pares; b) A quantidade de números pares; c) Todos os números ímpares; d) A quantidade de números ímpares. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 74 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 74 2.5– Construa um programa que preencha um vetor com 7 números inteiros. Calcule e mostre: a) Os números múltiplos de 2; b) Os números múltiplos de 3; c) Os números múltiplos de 2 e 3. 2.6- Construa um programa que receba o nome de 8 produtos e seus respectivos preços. Calcule e mostre: a) A quantidade de produtos com preço inferior a R$ 30,00; b) O nome dos produtos com preço entre R$ 30,00 e R$80,00; c) A média dos preços dos produtos com preço superior a R$100,00. 2.7- Construa um programa que leia dois vetores de tamanho 8 e faça a multiplicação dos elementos de mesmo índice, colocando o resultado em um terceiro vetor. Mostre o vetor resultante. 2.8- Construa um programa que leia um vetor de tamanho 12 de números inteiros. Crie um vetor resultante composto pelos números primos do vetor carregado. Mostre o vetor resultante. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 75 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 75 Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 76 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 76 CAPÍTULO 3 Matrizes 3.1 INTRODUÇÃO Matriz são variáveis capazes de armazenar vários elementos onde cada elemento tem a sua identificação caracterizada pelo nome, sendo as variáveis índices, as que definem sua localização dentro da estrutura. A variável do tipo matriz é formada por linhas e colunas. A linguagem C permite a criação e declaração de matrizes unidi- mensionais (vetores), bidimensionais e multidimensionais. O padrão ANSI prevê até 12 dimensões. Entretanto, o limite de dimensões fica por conta da quantidade de recurso disponível ao com- pilador. Apesar disso, as matrizes mais utilizadas possuem duas dimen- sões. Para cada dimensão deve ser utilizado um índice. [ASCENCIO 07]. Em uma mesma estrutura de dados de um determinado programa, podemos ter vetores e matrizes declarados, e cada um armazenando valores e quantidades distintas, de acordo com a problemática descri- ta. 3.2 MATRIZ EM C 3.2.1 DECLARANDO A matriz em C deve ser declarada para que o compilador conheça a sua dimensão e reserve espaço de memória suficiente para armazená-la. Dica: Para cada matriz criada, especifica-se quantidade e tipo de dado que será armazenado e onde seus valores estarão consecutiva- mente, inseridos. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 77 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 77 As variáveis do tipo matriz são identificadas pela existência de um, dois, três ou mais colchetes [], dependendo da dimensão da matriz. Sintaxe: Tipo_de_dado Nome_variável [dimensao1] [dimensao2] [...] [dimensaoN]; Onde: Tabela 3.1 – Definição de termos da sintaxe matriz em C. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 78 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 78 Exemplos: float mat[4][6]; Variável Índice: Em C as variáveis índices começam sempre em 0 (zero). No exem- plo acima de declaração de matriz, temos uma matriz “mat” bidimen- sional, contendo 4 linhas (0 a 3) e 6 colunas(0 a 5) cada, capazes de armazenar números reais. O modelo a seguir demonstra a declaração descrita do exemplo acima. mat //variáveis índices i, j : inteiro; char mat1[4][3]; No exemplo acima de declaração de matriz temos uma matriz “mat1” bidimensional, contendo 4 linhas (0 a 3) e 3 colunas (0 a 2) cada, capazes de armazenar caracteres. O modelo a seguir demonstra a declaração descrita no exemplo2 acima. //variáveis índices x, y : inteiro; Matriz bidimensional: duas variáveis índices, cada uma respon- sável por controlar uma dimensão. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 79 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 79 Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 80 mat No exemplo abaixo, na declaração de matriz, temos uma matriz “mat2” tridimensional, contendo 2 linhas (0 a 1), 4 colunas(0 a 3) e profundidade 3 (0 a 2), capazes de armazenar números inteiros. int mat2[2][4][3]; //Variáveis índices (3 – uma para cada dimensão) x, y, z : inteiro; mat2 3.2.2 ATRIBUINDO A atribuição de valores em uma matriz requer a identificação única da dimensão onde os elementos serão inseridos, isso ocorre através da manipulação de seus índices. Os exemplos a seguir expres- sam o conceito de atribuição. 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 80 Exemplos: mat[2][4]=6 Atribui o valor 6 à posição identificada pelos índices 2 (3ª linha) e 4 (5ª coluna). mat1[3][2]=7 Atribui o valor 7 à posição identificada pelos índices 3 (4ª linha) e 2 (3ª coluna). mat2 [0][3][1] = 12 Atribui o valor 12 à posição identificada pelos índices 0 (1ª linha), 3 (4ª coluna) e 1 (2ª profundidade). No exemplo 3.1, mostra a definição de uma matriz 2x2 e atribui valores a cada uma das posições da matriz. Exemplo 3.1 – Atribuindo valores diretamente na matriz. 3.2.3 CARREGANDO Para carregar valores em uma matriz o usuário deverá informar o elemento a ser inserido; o mesmo será lido e armazenado, sequencial- mente, na matriz percorrendo linha a linha e coluna a coluna. #include <stdio.h> #include <stdlib.h> // Programa atribuir elementos a matriz main () { int mat[2][2]; mat[0][0]= 10; mat[0][1]= 20; mat[1][0]= 30; mat[1][1]= 40; return (0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 81 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 81 Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 82 Preencher ou carregar uma matriz com elementos significa per- correr todos os seus índices, atribuindo-lhes um valor, que pode ser fornecido pelo usuário via teclado atribuído ou gerado pelo programa. No exemplo 3.2, a matriz bidimensional 3x3 que se chama “mat1” deverá ser preenchida ou carregada. As variáveis i e j controlam a posição exata que o elemento será armazenado. Exemplo 3.2 – Carregando valores em uma matriz. 3.2.4 LENDO Sintaxe: scanf (“%tipo”, &nome_matriz[dimensao1] [dimensao2] [dimensaoN]); Exemplos: scanf (“%d”,&mat[i] [j]); ou scanf (“%d”,&mat[x] [y] [z]); #include <stdio.h> #include <stdlib.h> // Programa atribuir elementos a matriz main (void) { int mat[3][3],i,j; for (i=0;i<3;i++) for (j=0;j<3;j++) { printf(“\n CARREGANDO A MATRIZ 3X3 - LINHA[%d]COLUNA[%d]:”,i,j); scanf(“%d”,&mat[i][j]); } return (0); } 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 82 3.2.5 MOSTRANDO Depois de carregar ou atribuir valores em uma matriz então, pode-se realizar a sua impressão, ou seja, mostrar na tela os valores armazenados na matriz e suas respectivas posições, se necessário. Para mostrar os elementos inseridos em uma matriz é preciso uti- lizar uma estrutura de repetição para ler cada um dos elementos, sequencialmente, e exibidos na tela. Sintaxe: printf (“mensagem e código de formatação”, [dimensao1] [dimensao2] [...][dimensaoN]); ou printf (“mensagem e código de formatação”, [dimensao1] [dimensao2] [...][dimensaoN]); Exemplos: printf (“%d”,mat[i] [j] ); ou printf (“%f”,mat[x] [y] [z] ); O exemplo 3.3, mostra os valores inteiros atribuídos, inicial- mente, na matriz em suas respectivas posições. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 83 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 83 Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 84 Exemplo 3.3 – Atribuição diretamente na matriz e exibição do mesmo. 3.3 APLICANDO De acordo com os conceitos vistos anteriormente, vamos resolver alguns problemas utilizando estruturas de dados compostas homogêneas do tipo matriz, em linguagem de programação C e uti- lizando o Eclipse. A prática é uma das técnicas essenciais para a assimilação da lógica, os exemplos a seguir visam enriquecer o embasamento teórico. Programa 3.1 Problema: Construa um programa que carregue uma matriz 2x2 (mat), cal- cule e mostre a matrizresultante do produto dos elementos de mat pelo seu maior elemento. Resolução (Programa 3.1): #include <stdio.h> #include <stdlib.h> //Programa atribuir elementos a matriz main (void) { int mat[2][2] ,i ,j; mat[0][0]= 10; mat[0][1]= 20; mat[1][0]= 30; mat[1][1]= 40; for (i=0;i<2;i++) { for (j=0;j<2;j++) printf(“ \t [%d] \t “,mat[i][j]); } return (0); } 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 84 Passo1– Carregar uma matriz mat 2x2; Passo2– Verificar o maior elemento armazenado na matriz; Passo3– Fazer o produto do maior elemento com os elementos da matriz mat; Passo4– Mostrar a matriz resultante. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 85 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 85 Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 86 Programa 3.1. Mostrar a matriz resultante. #include <stdio.h> void main(void) { int mat[2][2], mat_res[2][2], i, j, maior; for (i=0;i<2;i++) for (j=0;j<2;j++) { printf(“\n Digite o elemento da linha [%d] e coluna [%d]: \n”,i+1,j+1); scanf(“%d”,&mat[i][j]); } maior = mat[0][0]; for (i=0;i<2;i++) for (j=0;j<2;j++) { if (mat[i][j] > maior) maior = mat[i][j]; } for (i=0;i<2;i++) for (j=0;j<2;j++) mat_res[i][j] = maior * mat[i][j]; printf(“\n Imprimindo a matriz resultante \n”); for (i=0;i<2;i++) for (j=0;j<2;j++) { printf(“ \t [%d] \t”,mat_res[i][j]); } return (0); } 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 86 Programa 3.2 Problema: Construa um programa que carregue uma matriz 4x3 (mat) com as notas de quatro alunos em três avaliações. O programa deverá mostrar um relatório com o número de alunos (número da linha) e a avaliação em que cada aluno obteve menor nota. Ao final do relatório deverá mostrar quantos alunos tiveram menor nota em cada uma das avaliações: AV1, AV2 e AV3. Resolução (Programa 3.2): Passo1– Carregar uma matriz 4x3 (mat), com as notas de 4 alunos em três avaliações; Passo2– Verificar a quantidade de alunos e a avaliação em que o mesmo obteve a menor nota; Passo3– Mostrar quantidade de alunos que obtiveram menor nota e em que avaliações. Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 87 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 87 Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 88 #include <stdio.h> void main(void) { float notas[4][3], menor=0; int q1, q2, q3, prova_menor, i, j; for (i=0;i<4;i++) { for (j=0;j<3;j++) { printf(“\n Digite a %d nota do aluno [%d] \n”, j+1, i+1); scanf(“%d”,¬as[i][j]); } } q1 = 0; q2 = 0; q3 = 0; for (i=0;i<4;i++) { printf(“\n Aluno numero [%d]: \n “,i+1); menor = notas[i][0]; prova_menor = 0; for (j=0;j<3;j++) { if (notas[i][j] < menor) { menor = notas[i][j]; prova_menor = j; } } printf(“\n A menor nota do aluno %d foi na prova : %d \n”, i+1 ,prova_menor+1); if (prova_menor == 0) q1 = q1 + 1; if (prova_menor == 1) q2 = q2 + 1; if (prova_menor == 2) q3 = q3 + 1; } 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 88 Programa 3.2. Mostrar a menor nota tirada nas avaliações. Programa 3.3 Problema: Fazer um programa que preencha um vetor de 12 posições com números inteiros, em seguida, insira esses valores em uma matriz 3x4 e exiba a matriz preenchida. Resolução (Programa 3.3): Passo1– Preencher o vetor com 12 números inteiros; Passo2– Preencher a matriz 3x4 com os valores do vetor; Passo3– Exibir a matriz 3x4. printf(“\n Quantidade de alunos com menor nota na prova 1 = %d \n”,q1); printf(“\n Quantidade de alunos com menor nota na prova 2 = %d \n”,q2); printf(“\n Quantidade de alunos com menor nota na prova 3 = %d \n”,q3); return (0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 89 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 89 Programa 3.3. Preencher uma matriz a partir de um vetor. #include <stdio.h> void main(void) { int vet[12], mat[3][4], i, j, lin, col; for (i=0;i<12;i++) { printf(“\n Digite [%d]-elemento: “,i+1); scanf(“%d”,&vet[i]); } lin = 0; col = 0; for (i=0;i<12;i++) { mat[lin][col] = vet[i]; col++; if (col > 3) { col = 0; lin++; } } printf(“\n Matriz 3x4 Preenchida \n”); for (i=0;i<3;i++) { for (j=0;j<4;j++) { printf(“\n Linha[%d]- Coluna[%d] => %d \n”,i, j, mat[i][j]); } } return (0); } Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 90 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 90 Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 91 Programa 3.4 Problema: Construa um programa que carregue uma matriz bidimensional 2x3. Calcule: a) A soma os elementos de cada linha da matriz; b) O produto da soma por cada elemento da matriz e mostre o resultante. Utilize funções para organizar o código. Resolução (Programa 3.4): Passo1– Criar a função carregar que irá carregar os elementos na matriz; Passo2– Criar a função soma_ele que somará os elementos de cada linha; Passo3– Criar a função prod que calculará o produto da soma de cada elemento da matriz; Passo4– Criar a função mostrar que mostrará a matriz resultante; Passo5- Bloco principal: chamada das funções. #include <stdio.h> // Variáveis globais float mat[2][3], soma[2]; int i, j; int carregar() { printf(“\n Digite o elemento:”); for (i=0;i<2;i++) { for (j=0;j<3;j++) { printf(“\n linha %d com a coluna %d => “,i,j); scanf(“%f”,&mat[i][j]); } } } 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 91 Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 92 Programa 3.4. Soma e produto de elementos. int soma_ele() { // Soma dos Elementos da Matriz for (i=0;i<2;i++) { soma[i] = 0; for (j=0;j<3;j++) soma[i] = soma[i] + mat[i][j]; } } float prod() { // Produto da Matriz com a soma dos elementos-linhas for (i=0;i<2;i++) { for (j=0;j<3;j++) mat[i][j] = mat[i][j] * soma[i]; } } int mostrar() { printf(“\n Imprimindo a matriz resultante”); for (i=0;i<2;i++) { printf( “\n Linha [%d] => \n”, i); for (j=0;j<3;j++) printf(“\n %2.0f \n”,mat[i][j]); } } void main(void) { // Chamando as funções carregar(); soma_ele(); prod(); mostrar(); return(0); } 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 92 Tecologia em Ánalise e Desenvolvimento de Sistemas Laboratório de Lógica de Programação II 93 Programa 3.5 Problema: Construa um programa que carregue uma matriz A de ordem 4x5 e uma matriz B de ordem 5x2. O programa deverá também calcular e mostrar a matriz resultante do produto matricial das duas matrizes anteriores, armazenado-o em uma terceira matriz C de ordem 4x2. Resolução (Programa 3.5): Passo1– Criar a função carregar_matrizes, para carregar a matriz A(4x5) e matriz B(5x2); Passo2– Criar a função mat_res, para calcular o produto das duas matrizes e armazenar em uma terceira matriz; Passo3– Criar a função exibir, para mostrar a matriz resultante; Passo4– Bloco principal: chamada de funções. 04_LabLogProgIIBook.qxp 6/5/2008 20:54 Page 93 #include <stdio.h> #include <stdlib.h> #define min1 4 #define min2 5 #define min3 2 int a[min1][min2], b[min2][min3], c[min1][min3], i, j, k, soma, mult; int carregar_matrizes(void) { printf( “\n Digitando os elementos da matriz A \n”); for (i=0;i<min1;i++) { for (j=0;j<min2;j++) { printf(“\n Digite o elemento [%d]-[%d]=> “, i, j); scanf(“%d”,&a[i][j]); } } printf(“\n Digitando os elementos da matriz B \n”); for (i=0;i<min2;i++)
Compartilhar