Programação científica C++ NIELSEN CASTELO DAMASCENO Slide 6 Exercício 1 Dados dois vetores com n (n <= 50) componentes cada um, calcular e imprimir a soma deles. Exercício 2 Leia um conjunto com n (n <= 20) números e informe se existe algum elemento repetido no conjunto. Exercício 3 Leia n (n <= 30) números quaisquer e imprima-os sem repetições. Exemplo: Entrada: 1,1,3,4,3,5,-8 Saída: 1,3,4,5,-8 Exercício 4 Dadas duas seqüências com n (n <= 100) números inteiros entre 0 e 9, interpretadas como dois números inteiros de n algarismos, calcular a seqüência de números que representa a soma dos dois inteiros. Exemplo: n=8 1ª seqüência 2ª seqüência 8 2 4 3 4 2 5 1 + 3 3 7 5 2 3 3 7 = 1 1 6 1 8 6 5 8 8 Exercício 5 Faça um programa para imprimir as n (n <= 100) primeiras linhas do triângulo de Pascal usando apenas um vetor, com o valor de n fornecido pelo usuário. Triângulo de Pascal para n = 6: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 Matrizes • Em C++, as matrizes podem ser: • Unidimensionais (vetores) • Multidimensionais (duas ou mais dimensões) • As matrizes são armazenadas de forma linear int m[4][3]; Declaração de uma matriz de duas dimensões com 4 linhas e 3 colunas Memória Modelo abstrato int dados[3][3]; Armazenamento de uma matriz Os índices em C++ SEMPRE começam em 0, cuidado!!! linhas colunas Endereço Valor 100 ... 104 5 108 10 112 15 116 20 120 25 124 30 128 35 132 40 136 45 140 50 5 10 15 20 25 30 35 40 45 144 55 50 55 60 148 60 152 ... m[0][0] m[0][1] m[0][2] m[1][0] m[1][1] m[1][2] m[2][0] m[2][1] m[2][2] m[3][0] m[3][1] m[3][2] Matrizes bidimensionais • Matrizes de duas dimensões são vetores em que os elementos são outros vetores. • Os elementos de uma matriz bidimensional são acessados com indexação dupla: o primeiro índice acessa a linha e o segundo acessa a coluna. m[0][0] Acessa o elemento da primeira linha e primeira coluna m[1][2] Acessa o elemento da segunda linha e terceira coluna Matrizes e estruturas de repetição Vetores têm somente uma dimensão. Vetores utilizavam uma estrutura de repetição para percorrê-los. Matrizes bidimensionais têm duas dimensões (linha e coluna)... logo? Matrizes e estruturas de repetição Vetores têm somente uma dimensão. Vetores utilizavam uma estrutura de repetição para percorrê-los. Matrizes bidimensionais têm duas dimensões (linha e coluna)... logo? Matrizes bidimensionais precisam de duas estruturas de repetição, uma para a linha e outra para a coluna. Matrizes e estruturas de repetição Vetor int i,dados[3]; for(i=0;i<3,i++){ cin >> dados[i]; } Matrizes int i,j,dados[3][5]; for(i=0; i<3 ;i++){ for(j=0; j<5 ; j++){ cin>>[i][j]; } } • O for mais externo (onde está a variável i) é responsável pelas linhas. • O for mais interno (onde está a variável j) é responsável pelas colunas. int i,j,dados[3][3]; for(i=0; i<3; i++){ for(j=0; j<3 ; j++){ cin>>dados[i][j]; } } i=0 j=0 dados[0][0] int i,j,dados[3][3]; for(i=0; i<3; i++){ for(j=0; j<3 ; j++){ cin>>dados[i][j]; } } i=0 j=0 dados[0][0] 5 int i,j,dados[3][3]; for(i=0; i<3; i++){ for(j=0; j<3 ; j++){ cin>>dados[i][j]; } } i=0 j=1 dados[0][1] 5 8 int i,j,dados[3][3]; for(i=0; i<3; i++){ for(j=0; j<3 ; j++){ cin>>dados[i][j]; } } i=0 j=2 dados[0][2] 5 8 11 int i,j,dados[3][3]; for(i=0; i<3; i++){ for(j=0; j<3 ; j++){ cin>>dados[i][j]; } 5 } 34 i=1 j=0 dados[1][0] 8 11 int i,j,dados[3][3]; for(i=0; i<3; i++){ for(j=0; j<3 ; j++){ cin>>dados[i][j]; } 5 8 34 12 } i=1 j=1 dados[1][1] 11 int i,j,dados[3][3]; for(i=0; i<3; i++){ for(j=0; j<3 ; j++){ cin>>dados[i][j]; } 5 8 11 34 12 2 } i=1 j=2 dados[1][2] int i,j,dados[3][3]; for(i=0; i<3; i++){ for(j=0; j<3 ; j++){ cin>>dados[i][j]; } 5 8 11 34 12 2 } i=2 j=0 dados[2][0] 26 int i,j,dados[3][3]; for(i=0; i<3; i++){ for(j=0; j<3 ; j++){ cin>>dados[i][j]; } 5 8 11 34 12 2 26 77 } i=2 j=1 dados[2][1] int i,j,dados[3][3]; for(i=0; i<3; i++){ for(j=0; j<3 ; j++){ cin>>dados[i][j]; } 5 8 11 34 12 2 26 77 54 } i=2 j=2 dados[2][2] int main(){ int m[3][4], i, j; for(i=0; i<3; i++) for(j=0; j<4; j++) m[i][j] = (i*4)+j+1; for(i=0; i<3; i++) { for(j=0; j<4; j++) cout << m[i][j] << “ ”; cout << endl; } return 0; } O que imprime o programa ao lado? int main(){ int m[3][4], i, j; for(i=0; i<3; i++) for(j=0; j<4; j++) m[i][j] = (i*4)+j+1; for(i=0; i<3; i++) { for(j=0; j<4; j++) cout << m[i][j] << “ ”; cout << endl; } return 0; } O que imprime o programa ao lado? Inicialização de matrizes • As três formas a seguir podem ser usadas: int m[4][3] = {{1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}}; int m[4][3] = {1,2,3,4,5,6,7,8,9,10,11,12}; int m[ ][3] = {1,2,3,4,5,6,7,8,9,10,11,12}; O número de colunas deve ser sempre fornecido. Espaço ocupado por uma matriz bidimensional número de bytes = tamanho da 1ª dimensão * tamanho da 2ª dimensão * sizeof(tipo) int m[4][3]; A matriz m ocupa 48 bytes na memória. Matrizes multidimensionais • O número máximo de dimensões depende do compilador. • A forma geral da declaração é: tipo nome[tamanho1][tamanho2]...[tamanhoN]; int m[4][3][6][5]; A matriz m ocupa 1440 bytes. Usando matrizes de 3 dimensões int tres[3][2][4] = { { {1,2,3,4}, {5,6,7,8} }, { {7,9,3,2}, {4,6,8,3} }, { {7,2,6,3}, {0,1,9,4} } }; Como acessar o único valor zero armazenado na matriz acima? Usando matrizes de 3 dimensões int tres[3][2][4] = { { {1,2,3,4}, {5,6,7,8} }, { {7,9,3,2}, {4,6,8,3} }, { {7,2,6,3}, {0,1,9,4} } }; terceiro grupo (elemento) tres[2][1][0] primeiro dos 4 números segundo elemento do terceiro grupo Exercício Mostre em uma matriz 3x3 os 9 primeiros números pares. int i,j,matrix[3][3],cont=0; for(i=0; i<3 ; i++){ for(j=0; j<3 ; j++){ matrix[i][j] = cont; cont += 2; } } for(i=0; i<3 ; i++){ for(j=0; j<3 ; j++){ cout << matrix[i][j]<<“ ”; } cout<<endl; } Exercício Dado um número n (n<=30), o programa deverá criar uma matriz identidade para a dimensão n. int i,j,matrix[30][30],n; Cout << “Digite o valor de n”; Cin >> n; for(i=0; i<n ; i++){ for(j=0; j<n ; j++){ if(i==j){matrix[i][j]=1;} else {matrix[i][j]=0;} } } for(i=0; i<n ; i++){ for(j=0; j<n ; j++){ cout << matrix[i][j]<<“ ”; } cout<<endl; } Para casa: Em uma excursão de uma agência de viagem existem quatro ônibus (1, 2 , 3 e 4) e cada ônibus tem 16 cadeiras para passageiros. Faça um programa que realize as reservas dos passageiros baseados no número do ônibus e no número da cadeira(Considere apenas que números válidos serão inseridos). Caso o Local esteja vazio, deve ser reservado, caso esteja ocupado, exibir uma mensagem de “Cadeira Ocupada”. A cada inserção (bem sucedida ou não), o programa perguntará se usuário quer realizar uma nova reserva ou se deseja finalizar o programa. Exercício 1 Dada uma matriz bidimensional de dimensão MxN, calcular e imprimir a matriz transposta. O usuário deve fornecer os tamanhos da matriz e, em seguida, os elementos da matriz. Observação: M, N <= 30 M e N devem ser lidos. Exercício 2 Determinar se uma matriz NxN é uma matriz de permutação. Uma matriz quadrada é chamada de matriz de permutação se seus elementos são apenas 0’s e 1’s e se em cada linha e coluna da matriz existe apenas um único valor 1. Exemplo: A matriz ao lado é uma matriz de 1 0 0 0 permutação. 0 0 0 1 Observação: 0 0 1 0 N <= 30 0 1 0 0 N deve ser lido. Exercício 3 Dadas duas matrizes A (M x N) e B (K x L) reais, encontrar e escrever uma matriz C (M x L) onde C é obtida pelo produto de A por B (C = A x B). Observação: M <= 30, N <= 40, K <= 40, L <= 50 M, N, K, L devem ser lidos. EX: Exercício 4 Dizemos que uma matriz quadrada inteira é um quadrado mágico se a soma dos elementos de cada linha, a soma dos elementos de cada coluna e a soma dos elementos das diagonais principal e secundária são todas iguais. Dada uma matriz quadrada Anxn , verificar se A é um quadrado mágico é um quadrado mágico Exercício 5 (POLI 94) Os elementos aij de uma matriz inteira Anxn representam os custos de transporte da cidade i para a cidade j. Dados uma matriz de custos Anxn e n (n <= 100) itinerários, cada um com k (k <= 30) cidades, calcular o custo total para cada itinerário. Exemplo: O custo do itinerário 03133210é a03+a31+a13+a33+a32+a21+a10= 3 + 1 + 400 + 5 + 2 + 1 + 5 = 417