Introdução à Computação - Linguagem C: aula 06. Mauro Cesar Bernardes 04/Junho/2014

Documentos relacionados
Figura 1: Uma matriz contem elementos de um mesmo tipo, com início em (0,0). 30 é o número de colunas!

1 Resumo: Matrizes. 2.1 Como declarar uma matriz IME/USP. Departamento de Ciência da Computação

Vetores são estruturas indexadas utilizadas para armazenar dados de um mesmo tipo: int, char, float ou double. Oexemploaseguirédeumvetordeinteiros:

Quantas variáveis para armazenar as notas e as médias são necessárias para resolver este problema?

Aula 17 Variáveis indexadas de vários índices (matrizes)

Universidade Federal de Goiás Instituto de Informática Introdução à Computação Professor: Julliano Rosa Nascimento

Estruturas de Dados Homogêneas (Vetores e Matrizes) e Ponteiros em C

CCO 016 / COM 110 Fundamentos de Programação

CURSO SUPERIOR DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS DISCIPLINA : INTRODUÇÃO À LÓGICA DE PROGRAMAÇÃO ASSUNTO: C

Aula 03 -Introdução àlinguagc Programação: Estrutura-Repetição. OPL e IC1 Prof: Anilton Joaquim da Silva

MAC2166 Introdução à Computação para Engenharia Escola Politécnica Terceira Prova 20 de junho de 2011

Funções Vetores Matrizes

Programação: Vetores

1) Operadores de auto incremento ++ e auto decremento --

Ponteiros em C. Adriano Joaquim de Oliveira Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

Programação Estruturada

Computação 2. Aula 7. Profª. Fabiany Ponteiros

Computação 2. Aula 2. Profª. Fabiany Vetores e Matrizes

Linguagem C. Funções. Prof. Maurício Dias

MC-102 Aula 14. Instituto de Computação Unicamp. 29 de Setembro de 2016

ponteiros INF Programação I Prof. Roberto Azevedo

Aula 8 Oficina de Programação Vetores. Profa. Elaine Faria UFU

SSC300- Linguagens de Programação e Aplicações Profa Vânia de Oliveira Neves. ICMC/USP São Carlos

Aula 15 Variáveis Indexadas (vetores)

Modularidade - Funções e Procedimentos

MC-102 Aula 06 Comandos Repetitivos

Algoritmos e Programação

MAC 2166 Introdução à Computação para Engenharia

PCI- Matrizes. Profa. Mercedes Gonzales Márquez

Introdução a Computação

ESTRUTURAS CONDICIONAIS. Introdução à Ciência da ComputaçãoI Simone Senger de Souza

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

MC-102 Aula 13. Instituto de Computação Unicamp. 29 de Setembro de 2016

19 Vetores, Ponteiros e Funções

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

PROGRAMAÇÃO DE COMPUTADORES V - TCC Modulo 6 : Funções Escopo de Variáveis: Globais x Locais Aura - Erick

12 - Dados Estruturados Vetores, Matrizes e Strings

MC-102 Aula 04 Expressões Relacionais, Lógicas e Comandos Condicionais

INF 1620 P1-18/09/04 Questão 1 Nome:

Linguagem de Programação I. Aula 08 Linguagem C: Arrays

MC-102 Aula 12 Matrizes e Vetores Multidimensionais

LINGUAGEM C Estrutura / Funções

Algoritmos RESUMO - LINGUAGEM C

Faculdade Anglo-Americano Curso de Ciência da Computação Linguagem de Programação. Lista de Exercícios 1

Subprogramas. Prof. Carlos Lopes

Modularidade - Fun ções e Procedimentos

Vetores e Matrizes. Conceito. Conceito. Conceito. Conceito. Conceito. Variáveis Compostas Homogêneas. Matriz

Linguagem C: Subprogramação

Revisão para Prova 2. Mirella M. Moro

Exercícios em C 1 Saulo O. D. Luiz

Ponteiros. Baseado nos slides do Prof. Mauro.

INF 1620 P1-04/10/03 Questão 1 Nome:

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

MC102 Algoritmos e Programação de Computadores

Algoritmos e Programação

Linguagem C vetores multidimensionais

Programação científica C++

ESTRUTURAS CONDICIONAIS. Baseado nos slides de autoria de Rosely Sanches e Simone Senger de Souza

1 Exercícios com ponteiros

Modulo 3: Else, Case, For...

Linguagem C (repetição)

Computação 2. Aula 5. Profª. Fabiany defines vetor, strings e matriz por parâmetros de função

Permite modularidade (dividir programa em partes): Facilita a depuração (debug) e portabilidade.

Programação 1. Atribuição, operadores aritméticos, entrada de dados. Técnico em Eletrônica Semestre 5 02

Aula 18: Funções em C

Programação II. Ponteiros. Bruno Feijó Dept. de Informática, PUC-Rio

MESMO QUE ESTAS VARIÁVEIS TENHAM NOME IDÊNTICOS

VETORES ADAPTADO DO MATERIAL DE PROF. L. A. ALVARES

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Aula 18: Vetores Introdução a Programação Túlio Toffolo & Puca Huachi

Introdução à Programação

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Computação Eletrônica. Vetores e Matrizes. Prof: Luciano Barbosa. CIn.ufpe.br

Computação Informática

Introdução à Programação

Aula 17: Ponteiros e Alocação Dinâmica em C

Matrizes. DCC 119 Algoritmos

Algoritmos e Programação

Ponteiros e Tabelas. K&R: Capítulo 5

Fundamentos de Programação

Aula 9 Oficina de Programação Matrizes. Profa. Elaine Faria UFU

Ponteiros e Alocação de Memória

ESTRUTURAS COMPOSTAS. Variáveis Compostas Unidimensionais VETOR. Baseado nos slides de Rosely Sanches e Simone Senger de Souza

Funções em Linguagem C Parte II

Aula 2 Comandos de Decisão

Aula 14: Repetição (Parte 2)

Módulo 7 Cadeias de Caracteres

INF 1620 P1-16/09/06 Questão 1 Nome:

Estrutura de dados 2. Ponteiro. Prof. Jesuliana N. Ulysses

Atividade de laboratório listas encadeadas simples

Módulo 5 Vetores e Alocação Dinâmica

MAC 2166 Introdução à Computação para Engenharia

SSC 0301 IC para Engenharia Ambiental

SSC 0301 IC para Engenharia Ambiental

Aula 12- Variáveis e valores reais

EXERCÍCIO DE SONDAGEM TURMA 01 SEMESTRE DATA: 01/11/2016. Matrícula Nome Nota

Aula 10 Oficina de Programação Matrizes. Profa. Elaine Faria UFU

Aula 06 Introdução à Programação Matrizes

Vetores(Arrays) Olimpíadas de Informática. Aulas preparatórias Introdução a Programação em C.

Curso de Introdução à Liguagem de. Grupo PET-Tele. Universidade Federal Fluminense. July 16, 2012

Transcrição:

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;