Introdução à Computação - Linguagem C: aula 06 Mauro Cesar Bernardes 04/Junho/2014
Agenda Passagem de parâmetros por valor e por referência Vetores e Matrizes
Passagem de parâmetros por valor #include <stdio.h> void troca(int a, int b); int main(){ int a=2,b=3; printf("antes de chamar a função :\na=%d\nb=%d\n",a,b); troca(a,b); printf("depois de chamar a função:\na=%d\nb=%d\n",a,b); return 0; void troca(int a, int b){ int temp; temp=a; a=b; b=temp;
Passagem de parâmetros por referência #include<stdio.h> void troca(int *a, int *b); int main(){ int a=2,b=3; printf("antes de chamar a função :\na=%d\nb=%d\n",a,b); troca(&a,&b); printf("depois de chamar a função:\na=%d\nb=%d\n",a,b); return 0; void troca(int *a, int *b){ int temp; temp=*a; *a=*b; *b=temp;
Exercício: a) Escreva uma função com o seguinte protótipo: int divide (int *m, int *n, int d); A função recebe três inteiros positivos como parâmetros, retorna 1 se d divide pelo menos um entre *m e *n ou retorna 0 caso contrário. Fora isso, se d divide *m, dividir *m por d, e o mesmo para *n. b) Escreva um programa que lê dois inteiros positivos m e n e calcula, usando a função divide, o mínimo múltiplo comum entre m e n.
int divide (int *m, int *n, int d) { int resp; if (*m % d == 0 *n % d == 0) resp = 1; else resp = 0; if (*m % d == 0) *m = *m/d; if (*n % d == 0) *n = *n/d; return(resp);
#include <stdio.h> int divide (int *m, int *n, int d); main() { int m, n, qm, qn, d, mmc; printf("digite m e n: "); scanf("%d %d", &m, &n); d = 2; mmc = 1; qm = m; qn = n; while (qm!= 1 qn!= 1) if (divide(&qm, &qn, d)) mmc = mmc * d; else d = d + 1; printf("mmc(%d, %d) = %d \n", m, n, mmc); int divide (int *m, int *n, int d){ int resp; if (*m % d == 0 *n % d == 0) resp = 1; else resp = 0; if (*m % d == 0) *m = *m/d; if (*n % d == 0) *n = *n/d; return(resp);
Vetores
Declaração de Vetores A declaração de um vetor é feita da seguinte forma: <tipo_do_vetor> <nome_do_vetor> [<tamanho_do_vetor>]; Exemplo: int v[10]; v 0 1 2 3 4 5 6 7 8 9 float x[12]; x 0 1 2 3 4 5 6 7 8 9 10 11
Declaração de Vetores Observação Importante: 1. Na declaração de vetor, o que está entre colchetes deve ser um número constante. 2. Assim, não é possível fazer algo deste tipo:... int n = 20; float x[n]; /*não é permitido declarar ou int n ; /*colocando um tamanho variável */ printf ("Entre com n>0: "); scanf ("%d", &n); float x [n];
Exemplo de Uso de Vetores #include <stdio.h> #include <stdlib.h> int main () { int v [80], i; v[3] = 4; /*casa de índice 3 do vetor v recebe o inteiro 4*/ i = 2; v[i] = 3; /*casa de índice 2 do vetor v recebe o inteiro 3*/ v[v[v[i]]] = 10; /*vc saberia dizer qual casa do vetor v recebe o inteiro 10*/ return 0; v 0 1 2 3 4 5 6 7 8 9 3 4 10... 78 79
Outro exemplo do uso de Vetores
Exemplo de Uso de Vetores #include <stdio.h> #include <stdlib.h> int main () { float x [80]; int i; for (i=0; i<80; i++) x[i] = 0; return 0; x 0 1 2 3 4 5 6 7 8 9... 78 79
Mais um exemplo do uso de Vetores
Exemplo de Uso de Vetores #include <stdio.h> #include <stdlib.h> int main () { float x[80]; int i ; O índice do vetor pode ser uma expressão aritmética! for(i=110; i<190; i++) x[i 110] = 0; return 0; x 0 1 2 3 4 5 6 7 8 9... 78 79 i
Percorrendo vetores
Leitura de um Vetor #include <stdio.h> #include <stdlib.h> int main () { float v[100]; int i, n; printf ("Entre com 0<n<=100: ") ; scanf ("%d", &n); /* percorrer o vetor v de 0 a n 1 colocando o valor lido pelo teclado */ for ( i=0; i<n ; i++) { printf ("Entre com v[%d] = ", i); scanf ("%f", &v[i]); system("pause"); return 0; v 0 1 2 3 4 5 6 7 A posição i do vetor v, ou seja, v[i], é utilizada da mesma forma que utilizamos qualquer variável até o momento. 8 9... 98 99
Impressão de um Vetor #include <stdio.h> #include <stdlib.h> int main () { float v[100]; int i, n; printf ("Entre com 0<n<=100: ") ; scanf ("%d", &n); for ( i=0; i<n ; i++) { printf ("Entre com v[%d] = ", i); scanf ("%f", &v[i]); for ( i=0; i<n ; i++) { printf ("v[%d] = %f", i, v[i]); system("pause"); return 0; A posição i do vetor v, ou seja, v[i], é impressa a cada iteração do comando for
Erros comuns Ao desenvolver seus programas com vetores, preste atenção aos seguintes detalhes: índices inválidos: tome muito cuidado, especialmente dentro de um while ou for, de não utilizar índices negativos ou maiores que o tamanho máximo do vetor. Definição do tamanho do vetor se faz na declaração do vetor. O tamanho é constante, só mudando a sua declaração é que podemos alterar o seu tamanho. Isso significa que podemos estar desperdiçando algum espaço da memória que fica no final do vetor. Não cometa o erro de ler n, onde n seria o tamanho do vetor, e tentar declarar o vetor em seguida. int n ; printf ("Entre com n>0: "); scanf ("%d", &n); int v[n];
Vetores como Parâmetros de funções
Declaração de Vetores A declaração de um vetor é feita da seguinte forma: <tipo_do_vetor> <nome_do_vetor> [<tamanho_do_vetor>]; Exemplo: #define TAM 7... int v[10]; float x[12]; int y[tam]; v x y 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 10 11 0 1 2 3 4 5 6
Vetores como Parâmetro de Funções Programa para a leitura de dados de um vetor (inteiros) #include <stdio.h> #include <stdlib.h> #define TAM 100 int main () { int vetor[tam], i; printf("forneca o numero de elementos (n<100):"); scanf("%d", &n); for (i=0; i<n ; i++) { printf ("Entre com vetor[%d] = ", i); scanf ("%d", &vetor[i]); system("pause"); return 0; 0 1 2 3 4 99 Vetor...
Vetores como Parâmetro de Funções Quando se declara uma função que tem como parâmetro um vetor, este vetor é declarado somente com abre e fecha colchetes. Exemplo: Uma função que recebe o vetor lido e retorna o valor de seu módulo #include <math.h> Declara a função apenas com abre e fecha parentes float modulo (int v[], int n) { int i, r=0; for (i=0; i<n; i++) { r = r + v[i] * v[i]; return sqrt(r); V 0 1 2 3 4
#include <stdio.h> #include <stdlib.h> #include <math.h> #define TAM 100 float modulo (int v[], int n); int main () { int vetor[tam], i,n; float m=0; printf("forneca o numero de elementos (n<100):"); scanf("%d", &n); for (i=0; i<n ; i++) { printf ("Entre com vetor[%d] = ", i); scanf ("%d", &vetor[i]); m= modulo (vetor, n); printf("modulo = %f", m); system("pause"); return 0; float modulo (int v[], int n) { int i, r=0; for (i=0; i<n; i++) { r = r + v[i] * v[i]; return sqrt (r) ; Programa completo A chamada da função é feita passando apenas com o nome do vetor. Declara a função apenas com abre e fecha parentes
Matrizes
Matrizes: Matrizes são estruturas indexadas em forma matricial (como ilustrado na figura abaixo) utilizadas para armazenar dados de um mesmo tipo: int, char, float ou double. Figura 1: Uma matriz contem elementos de um mesmo tipo, com início em (0,0).
Declaração de Matrizes: A declaração de uma matriz é feita da seguinte forma: <tipo_da_matriz> <nome_da_matriz> [<numero_de_linhas>][<numero_de_colunas>]; Exemplos: Declaração de um vetor int v[10]; v 0 1 2 3 4 5 6 7 8 9 Declaração de uma matriz int m[5][10]; m 0 1 2 0 1 2 3 4 5 6 7 8 9 3 4
Declaração de Matrizes: Declaração de uma matriz int m[5][10]; m 0 1 2 0 1 2 3 4 5 6 7 8 9 Número de linhas: 5 Número de colunas: 10 3 4 int n[4][8]; 0 0 1 2 3 4 5 6 7 Número de linhas: 4 Número de colunas: 8 n 1 2 3
Uso de Matrizes: São usados índices para acessar uma linha e uma coluna de uma matriz. Os índices são números naturais. O índice da primeira linha é sempre zero. O índice da primeira coluna é sempre zero. int n[4][8]; 5 Número de linhas: 4 n[0][0]=5; n[1][2]=3; n[3][5]=7; Número de colunas: 8 n 0 1 2 3 0 1 2 3 4 5 6 7 5 3 7
Exemplo de Uso de Matrizes: #include <stdio.h> #include <stdlib.h> int main () { int A[4][8], lin, col; A[1][2]= 4; lin= 2; col= 3; A[lin][col]=5; A[A[lin 1][col 1] 1] [A[lin][col]]= 10; printf( %d, A[3][5]); system ( pause ); return 0; int A[4][8]; Número de linhas: 4 Número de colunas: 8 A 0 1 2 3 0 1 2 3 4 5 6 7 4 5 10
Percorrendo Matrizes: /* para uma linha fixa lin */ for (col=0; col<nc; col++) { /*comandos usando a matriz A[lin][col] */ Exemplo:... cont = 0; lin = 1; /* para uma linha fixa lin */ for (col=0; col < nc ; col++) { A[lin][col] = cont ; cont++;...
Percorrendo Matrizes: Um padrão para percorrer completamente a matriz A (isto é, as nl linhas e as nc colunas) por linhas é usar dois comandos de repetição (no caso, vamos usar o comando for) com duas variáveis inteiras lin e col, uma para percorrer as linhas e a outra para percorrer as colunas da matriz A: for (lin=0; lin < nl; lin++) { for (col=0; col<nc; col++) { /*comandos usando a matriz A[lin][col]*/ Exemplo: for (lin=0; lin < nl ; lin++) { for (col=0; col < nc; col++) { A[lin][col] = 0;
#include <stdio.h> #include <stdlib.h> #define MAX_L 100 #define MAX_C 200 int main () { float A[MAX_L][MAX_C]; int lin, col, nl, nc ; printf ("Entre com 0<nL <%d: ", MAX_L); scanf ("%d", &nl); Leitura de uma Matriz: printf ("Entre com 0<nC <%d: ", MAX_C ); scanf ("%d", &nc ); /* percorrer a matriz A elemento a elemento */ /* colocando o valor lido pelo teclado */ for (lin=0; lin < nl ; lin++) { for (col=0; col < nc ; col++) { printf ("Entre com A[%d][%d] = ", lin, col); scanf ("%f", &A [lin][col]); system( pause ); return 0;
#include <stdio.h> #include <stdlib.h> #define MAX_L 100 #define MAX_C 200 int main () { float A[MAX_L][MAX_C]; int lin, col, nl, nc ; printf ("Entre com 0<nL <%d: ", MAX_L); scanf ("%d", &nl); Impressão de uma Matriz: printf ("Entre com 0<nC <%d: ", MAX_C ); scanf ("%d", &nc ); /* percorrer a matriz A elemento a elemento */ /* imprimindo o valor lido pelo teclado */ for (lin=0; lin < nl ; lin++) { for (col=0; col < nc ; col++) { printf ( %f", A[lin][col]); printf( \n ); system( pause ); return 0;
Matrizes como Parâmetros de funções
Matrizes como parâmetros de funções: A forma de declaração de uma matriz como parâmetro de função é a mesma que vimos para declarar matrizes, ou seja, indicando o nome da matriz, e entre colchetes o número de linhas e o número de colunas. Exemplo: float soma_diagonal (float B[300][300], int n) { int i; float r = 0; for (i=0; i<n; i++) { r = r + B[i][i]; return r ;
Exercício: (a) Faça uma função que recebe duas matrizes quadradas de tamanho n x n de inteiros e retorna a soma dos elementos das duas diagonais principais. float soma_diagonais(int A[TAM][TAM], int B[TAM][TAM], int n); float soma_diagonais(int A[TAM][TAM], int B[TAM][TAM], int n) { int i, soma=0; for (i=0, i<n; i++) soma = soma + A[i][i] + B[i][i]; return soma;
#include <stdio.h> #include <stdlib.h> #include <math.h> #define TAM 100 float soma_diagonais(int A[TAM][TAM], int B[TAM][TAM], int n); int main () { int MatA[TAM][TAM], MatB[TAM][TAM], lin, col, n, soma=0; printf("forneca o numero de elementos (n<100):"); scanf("%d", &n); for (lin=0; lin<n; lin++) for(col=0; col<n; col++) { printf ("Entre com Matriz A[%d, %d] = ", lin,col); scanf ("%d", &MatA[lin][col]); printf ("Entre com Matriz B[%d, %d] = ", lin,col); scanf ("%d", &MatB[lin][col]); soma = soma_diagonais(mata, MatB, n); printf("a soma dos valores das diagonais eh= %d \n", soma); system("pause"); return 0; float soma_diagonais(int A[TAM][TAM], int B[TAM][TAM], int n) { int i, soma=0; for (i=0; i<n; i++) soma = soma + A[i][i] + B[i][i]; return soma; Uma solução
Uma solução:
Exercícios: Exercícios com Matrizes http://www.ime.usp.br/~macmulti/exercicios/matrizes/index.html
4. Desenvolva um programa que leia uma matriz real A mxn e, em seguida, apresente os elementos repetidos em A. 7. 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. Exemplo: A matriz é um quadrado mágico. Dada uma matriz quadrada A nxn, verificar se A é um quadrado mágico.
4. Desenvolva um programa que leia uma matriz real A mxn e, em seguida, apresente os elementos repetidos em A. Uma proposta de solução: 1. Desenvolva uma função com o seguinte protótipo: int acha(int valor, int matriz[m][n]); A função deverá percorrer toda a matriz procurando as ocorrências de valor. Ao final deverá retornar 0 se valor está contido apenas uma vez em matriz ou o número de ocorrências se ele está contido mais de uma vez. 2. Desenvolva um programa que percorre a matriz e, para cada elemento da matriz, chama a função acha para informar quando um elemento ocorre mais de uma vez
1. Desenvolva uma função com o seguinte protótipo: int acha(int valor, int matriz[m][n]); A função deverá percorrer toda a matriz procurando as ocorrências de valor. A função deverá retornar o número de ocorrências de valor em matriz. #include <stdio.h> #define LINHAS 3 #define COLUNAS 2 int acha(int valor, int matriz[linhas][colunas]){ int l,c,achou=0; for (l=0;l<linhas;l++) for(c=0; c<colunas; c++) if (matriz[l][c]==valor) achou++; return achou;
#include <stdio.h> #define LINHAS 3 #define COLUNAS 2 int acha(int valor, int matriz[linhas][colunas]); void main() { 2. Desenvolva um programa que percorre a matriz e, para cada elemento da matriz, chama a função acha para informar quando um elemento ocorre mais de uma vez. int m[linhas][colunas], lin, col,ocorrencias; for (lin=0;lin<linhas;lin++) for(col=0; col<colunas; col++){ printf("forneca m[%d][%d]=",lin,col); scanf("%d", &m[lin][col]); for (lin=0;lin<linhas;lin++) for(col=0; col<colunas; col++){ ocorrencias= acha(m[lin][col],m); if (ocorrencias!= 1)) printf("%d ocorre %d vezes\n", m[lin][col],ocorrências);
#include <stdio.h> #define LINHAS 3 #define COLUNAS 2 int acha(int valor, int matriz[linhas][colunas]); void main() { int m[linhas][colunas], lin, col,ocorrencias; for (lin=0;lin<linhas;lin++) for(col=0; col<colunas; col++){ printf("forneca m[%d][%d]=",lin,col); scanf("%d", &m[lin][col]); for (lin=0;lin<linhas;lin++) for(col=0; col<colunas; col++){ ocorrencias= acha(m[lin][col],m); if (ocorrencias!= 1)) printf("%d ocorre %d vezes\n", m[lin][col],ocorrências); int acha(int valor, int matriz[linhas][colunas]){ int l,c,achou=-1; for (l=0;l<linhas;l++) for(c=0; c<colunas; c++) return achou; if (matriz[l][c]==valor) achou++;
PROBLEMA EXTRA Dizemos que uma matriz A nxn é um quadrado latino de ordem n se em cada linha e em cada coluna aparecem todos os inteiros 1,2,3,...,n (ou seja, cada linha e coluna é permutação dos inteiros 1,2,...,n). (a) Escreva uma função que recebe como parâmetros um inteiro n, um vetor V com n inteiros e verifica se em V ocorrem todos os inteiros de 1 a n. (b) Usando a função acima, verifique se uma dada matriz inteira A nxn é um quadrado latino de ordem n.
#include <stdio.h> #define NMAX 100 #define TRUE 1 #define FALSE 0 void lematriz (int mat[][nmax], int nlinhas, int ncolunas); void imprimematriz (int mat[][nmax], int nlinhas, int ncolunas); int estala (int v[], int n, int elemento); int elatina (int v[], int n);
void main (void){ int i, j, n, equadlatino, v[nmax], m[nmax][nmax]; printf ("Entre com a dimensao da matriz: "); scanf ("%d", &n); lematriz (m,n,n); printf("\n\nmatriz lida:\n"); imprimematriz (m,n,n); equadlatino = TRUE; /* a matriz e' um quadrado latino ate' que * se prove o contrario */ for (i = 0; i < n && equadlatino == TRUE; i++) /* verifica se a linha m[i] da matriz e' "latina" */ equadlatino = elatina(m[i], n); for (j = 0; j < n && equadlatino == TRUE; j++) { /* verifica se a coluna j da matriz m e' "latina" */ /* copia coluna j para o vetor auxiliar v */ for (i = 0; i < n; i++) v[i] = m[i][j]; equadlatino = elatina(v,n); if (equadlatino == TRUE) printf("\n\na matriz e' um quadrado latino.\n"); else printf("\n\na matriz nao e' um quadrado latino.\n");
void lematriz (int mat[][nmax], int nlinhas, int ncolunas) { int i, j; for (i = 0; i < nlinhas; i++) { /* leitura da i-esima linha */ printf("entre com os elementos da linha no. %d\n", i+1); for (j = 0; j < ncolunas; j++) scanf("%d", &mat[i][j]); /* nao esqueca o '&'! */ /* Imprime uma matriz mat de dimensao nlinhas x ncolunas */ void imprimematriz (int mat[][nmax], int nlinhas, int ncolunas) { int i, j; for (i = 0; i < nlinhas; i++) { /* imprime a i-esima linha */ for (j = 0; j < ncolunas; j++) printf("%4d", mat[i][j]); /* muda de linha */ printf("\n");
/* * Funcao que recebe como parametro um vetor v de tamanho n * e devolve TRUE (1) se o o parametro elemento pertence ao * vetor; caso contrario a funcao devolve FALSE (0). */ int estala (int v[], int n, int elemento) { int i; for (i = 0; i < n; i++) if (v[i] == elemento) return TRUE; return FALSE;
/* * Funcao que recebe como parametros um vetor v e um inteiro n * e retorna TRUE (1) se todos os inteiros entre 1 e n ocorrem * nas n primeiras posicoes do vetor v, caso contrario a * funcao retorna FALSE (0). */ int elatina (int v[], int n){ int i; for (i = 0; i < n; i++) if (estala(v,n,i+1) == FALSE) return FALSE; return TRUE;