Académique Documents
Professionnel Documents
Culture Documents
Matrizes
Matrizes so agregados de dados dentro de uma mesma varivel. Diferente de outros tipos de agregados de dados (que sero mostrados adiante), matrizes so agregados de dados homogneos no sentido de que os dados tm mesmo tipo de contedo, ou seja, uma matriz pode conter somente dados numricos ou somente strings, mas no os dois simultaneamente. Na literatura de informtica, matrizes so, tambm, conhecidas por vrios outros nomes como, por exemplo, variveis composta homognea, variveis subscritas, variveis indexadas, arranjos, arrays, etc... O Scilab pode manipular uma matriz da mesma forma que uma linguagem de programao tradicional (isto , como um simples agregado de dados). No entanto, o Scilab tambm pode manipular matrizes de outra forma: exatamente como se fossem as matrizes da matemtica. Desta forma, o Scilab pode calcular o determinante ou a inversa de uma matriz bem como realizar operaes como multiplicao e soma matricial. Esta ltima forma de manipular matrizes no ser vista neste captulo. Ao contrrio, neste captulo, as matrizes sero manipuladas como simples agregados de dados do ponto de vista de uma linguagem de programao tradicional (na qual as operaes matriciais so realizadas elemento por elemento).
4.1
Matrizes Unidimensionais
Matrizes unidimensionais so chamados de vetores. Em um vetor possvel armazenar vrios itens em uma nica varivel. Na Figura 4.1 mostrada uma varivel nota contendo as notas de alunos. Os itens contidos em um vetor so chamados de elementos do vetor. Portanto, o vetor nota possui dez elementos. Seus elementos podem ser acessados individualmente. Por exemplo, nota(4) refere-se ao quarto elemento do vetor nota. O valor entre os parnteses de nota(4) chamado de ndice ou subscrito e usado para individualizar um elemento do vetor. Vetores podem ser criados no Scilab usando os colchetes [ e ]. Os elementos de um vetor so envolvidos por colchetes e so separados espaos (ou uma vrgula). Exemplo,
-->nota = [8.1 5.2 9.2 7.2 6.5 5.2 8.5 9.5 6.5 10.0];
36
37
Uma aplicao natural de vetores armazenar variveis indexadas da matemtica. Por exemplo, as variveis indexadas x1 = 2, x2 = 4, x3 = 2 e x4 = 3 so armazenadas no Scilab como:
-->x(1) = 2; -->x(2) = 4; -->x(3) = 2; -->x(4) = 3;
ou equivalentemente como
-->x = [2 4 2 3];
38
-->(x(1)+x(3))/x(2) ans = 1.
4.1.1
Os elementos de um vetor podem ser acessados de vrias maneiras. Por exemplo, considere as variveis:
a = [2 4 5 1 3]; i = 2;
Ento tem-se:
a(i+2) a(a(4))
a(a(3))+a(2*i)
nota = [8.1 5.2 9.2 7.2 6.5 5.2 8.5 9.5 6.5 10.0]; soma = 0; for i=1:10 soma = soma + nota(i); end printf("Mdia das notas = %g\n",soma/10);
Comentrio. Para somar os elementos do vetor, cada elemento foi acessado individualmente e adicionado, um por vez, em um acumulador soma, atravs do lao for...end (linhas 3 a 5). Exerccio resolvido 4.1.2. Ler dois vetores A e B de 10 elementos. Construir um vetor C tal que cada elemento de C seja o dobro da soma entre os elementos correspondentes de A com B. Escrever o vetor C.
1 2 3 4 5 6 7 for i=1:10 a(i) = input("Digite um valor"); end for i=1:10 b(i) = input("Digite um valor"); end for i=1:10 // Leitura de A e B
39
8 9 10 11 12
// Calculo de C // Escreve de C
Comentrio. O lao for...end, das linhas 1 a 3, faz a leitura de um elemento do vetor a de cada vez. A leitura controlado pelo ndice que faz com que cada leitura seja armazenado em um elemento diferente do vetor a. No lao for...end das linhas 7 a 9, o clculo de cada elemento do vetor c controlado pelo ndice que faz com que seja somando os elementos correspondentes de a e b. Exerccio resolvido 4.1.3. Ler dois vetores A e B de 10 elementos. Construir um vetor C tal que o elemento de ndice mpar de C seja igual ao elemento correspondente de A, caso contrrio, seja igual ao elemento correspondente de B. Por exemplo, c[1]==a[1], c[3]==a[3], . . .. Mas, c[2]==b[2], b[4]==a[4], . . .. Escrever o vetor C.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 for i=1:10 // Leitura de A e B a(i) = input("Digite um valor"); end for i=1:10 b(i) = input("Digite um valor"); end for i=1:10 if modulo(i,2)<>0 // Testa se o ndice i mpar. c(i) = a(i); // Se for mpar c(i) recebe o valor de a(i) else c(i) = b(i); // Se for par c(i) recebe o valor de b(i) end end for i=1:10 // Escreve o vetor C printf("%g ",c(i)); end
Comentrio. A funo modulo (resto de uma diviso) verica se o ndice do vetor C impar ou par porque se resto da diviso entre um nmero qualquer e dois diferente de zero ento ele mpar (no divisvel por dois).
4.1.2
Vetores de String
O vetor mes foi construdo de tal modo que h uma correspondncia entre o nmero do ms e o ndice do elemento. Por exemplo, o ms de nmero 11 (novembro) acessado pelo elemento mes(11). Este fato usado para resolver o exerccio a seguir. Exerccio resolvido 4.1.4. Elaborar um programa que leia o dia, o nmero de ms e o ano e escreva a dada no formato D de MMM de AAAA(ou D de MMM de AA). Por exemplo, se o dia 31, o ms 12 e o ano 2003, ento o programa dever escrever 1 de dez de 2003.
40
Soluo:
1 2 3 4 5 mes = ["jan" "fev" "mar" "abr" "jun" "jul" "ago" "set" "nov" "dez"]; dia = input("Digite o dia"); nunmes = input("Digite o numero do mes"); ano = input("Digite o ano"); printf("%g de %s de %g\n",dia,mes(nunmes),ano); Resultado Digite o Digite o Digite o 2 de abr dia-->2 numero do mes-->4 ano-->2003 de 2003
Comentrio. Porque a varivel nunmes contm o nmero do ms, o comando printf capaz de escrever o nome do ms atravs do elemento mes(nunmes).
Exerccios
O que este programa escreve?
1 2 3 4 5 6 7 8 poema(1) = uma rosa; poema(2) = ; for a=1:3 for b=1:2 printf("%s ",poema(b)); end end printf(%s,poema(1));
4.1.3
Estudo de Caso
Esta seo ilustra a facilidade que as matrizes oferecem a programao de computadores. Primeiramente, ser mostrado a soluo de um problema sem o uso de vetores visando apontar as diculdades deste procedimento. Em seguida, o mesmo problema ser resolvido com o uso de vetores. Considere o problema: Suponha uma turma com quatro alunos. Elaborar um programa que leia as quatro notas dos alunos e seus respectivos nomes e escreva apenas os nomes com a nota acima da mdia. Neste sentido, uma possvel soluo (sem vetores) seria a seguinte:1
1
Comumente o clculo da mdia das notas pode ser efetuado pelo seguinte trecho de programa: soma = 0; for i = 1:4 nota = input("Digite a nota"); soma = soma + nota; end media = soma/4;
Esta abordagem no resolve o problema proposto porque precisamos comparar se cada nota digitada maior que a mdia. Mas vale notar que as notas j foram perdidas no momento que calculado a mdia na ltima linha (exceto a ltima nota que no foi perdida porque est armazenada na varivel nota). Deste modo, no podemos comparar as mdia com as notas (que foram perdidas). Portanto, a m de evitar a perda das notas, necessrio armazenar cada nota digitada em uma varivel diferente.
41
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
aluno1 = input("Nome do aluno","s"); nota1 = input("Nota"); aluno2 = input("Nome do aluno","s"); nota2 = input("Nota"); aluno3 = input("Nome do aluno","s"); nota3 = input("Nota"); aluno4 = input("Nome do aluno","s"); nota4 = input("Nota"); media = (nota1+nota2+nota3+nota4)/4; if nota1 >= media printf("%s\n",aluno1); end if nota2 >= media printf("%s\n",aluno2); end if nota3 >= media printf("%s\n",aluno3); end if nota4 >= media printf("%s\n",aluno4); end
Suponha que, ao invs de uma turma com quatro alunos, houvessem uma turma com cinco alunos, ento teramos: Suponha uma turma com cinco alunos. Elaborar um programa que leia as cinco notas dos alunos e seus respectivos nomes e escreva apenas os nomes com a nota acima da mdia. A soluo deste problema seria similar ao programa anterior, apenas acrescentando algumas linhas (e.g., para ler a quinta nota). A soluo seria:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 aluno1 = input("Nome do aluno","s"); nota1 = input("Nota"); aluno2 = input("Nome do aluno","s"); nota2 = input("Nota"); aluno3 = input("Nome do aluno","s"); nota3 = input("Nota"); aluno4 = input("Nome do aluno","s"); nota4 = input("Nota"); aluno5 = input("Nome do aluno","s"); nota5 = input("Nota"); media = (nota1+nota2+nota3+nota4+nota5)/5; printf("Relao de alunos acima da mdia\n"); if nota1 >= media printf("%s\n",aluno1); end if nota2 >= media printf("%s\n",aluno2); end if nota3 >= media printf("%s\n",aluno3);
42
21 22 23 24 25 26 27
end if nota4 >= media printf("%s\n",aluno4); end if nota5 >= media printf("%s\n",aluno5); end
Novamente, suponha que, ao invs de uma turma com cinco alunos, houvessem uma turma com dez alunos. Neste caso, um programa, para ler 10 notas, iria crescer bastante em tamanho (em relao programa anterior) porque seria preciso ler 10 variveis para as notas (i.e., nota1, nota2, . . ., nota10) e 10 para os nomes de alunos, totalizando 20 variveis. Do mesmo modo, para uma turma com 20 alunos, seria preciso ler 40 variveis, sendo as 20 notas e os 20 nomes dos alunos. Considere a situao que fosse preciso ler as notas de todas as turmas de um colgio com 10000 alunos. Ou seja, Suponha uma colgio com 10000 alunos. Elaborar um programa que leia as 10000 notas dos alunos e seus respectivos nomes e escreva apenas os nomes com a nota acima da mdia. Este programa assume proporo gigantesca porque preciso ler 20000 variveis (10000 para as notas e 10000 para os nomes de aluno) tornando-o impraticvel de ser programado (do modo como foi feito antes). Note que as variveis, nota1, nota2, nota3, . . . podem ser substitudas por os elementos de um vetor, por exemplo, nota(1), nota(2), nota(3), . . .. Neste caso, cada elemento do vetor nota seria lida, uma de cada vez, por um lao for...end atravs dos seus ndices. Vejamos a soluo usando vetores.
1 2 3 4 5 6 7 8 9 10 11 12 soma = 0; // acumulador das notas for i = 1:10000 aluno(i) = input("Digite o nome do aluno","s"); nota(i) = input("Nota"); soma = soma + nota(i); end media = soma/10000; // calculo da media for i = 1:10000 if nota(i) >= media printf("%s\n",aluno(i)); end end
Comentrio. No lao for...end das linhas 3 a 6, as notas e os nomes de aluno so lido um de cada vez. O acumulador soma, dentro do lao, soma todas as notas (uma por vez). Os nomes dos alunos com nota acima da mdia so escritos no segundo lao for...end nas linha 8 a 12. Cada nota comparada, uma de cada vez, com a mdia e caso a nota de ndice i passe no teste, o correspondente nome do aluno de ndice i escrito.
43
A concluso que o uso de vetores permite ler e armazenar grande quantidade de notas (e nomes) em um simples lao for...end reduzindo, deste modo, o tamanho de um programa cuja elaborao sem o uso de vetores se torna impraticvel.
4.1.4
-->length(a) ans = 5.
4.2
Ordenao de Vetores
A ordenao de elementos de um conjunto fundamental no dia a dia. Um exemplo bem comum so as listas telefnicas cuja ordenao em ordem alfabtica possibilita rapidamente encontrar um nmero de telefone. Um outro exemplo a ordenao de livros por autor ou por assunto em uma grande biblioteca. Por isso a ordenao uma atividade constantemente solicitada em programao. Provavelmente, o algoritmo de ordenao mais conhecido da computao chama-se o algoritmo da bolha. A idia do algoritmo da bolha passar por todo o vetor comparando cada elemento com o elemento seguinte (i.e., a(i) com a(i+1)) e troca-los caso estes dois elementos no estejam na ordem apropriada. Por diversas vezes, o algoritmo repete a passada at o vetor car completamente ordenado. Vejamos como funciona este algoritmo para ordenar o a = [5 4 3 2 6]. A) Vetor inicial desordenado: a = [5 4 3 2 6] Passo A.1 Comparar a(1) e a(2). Se a(1) > a(2), troque os dois elementos. a = [4 5 3 2 6] Houve troca do nmero 4 com o nmero 5. Passo A.2 Comparar a(2) e a(3). Se a(2) > a(3), troque os dois elementos. a = [4 3 5 2 6] Houve troca do nmero 5 com o nmero 3. Passo A.3 Comparar a(3) e a(4). Se a(3) > a(4), troque os dois elementos. a = [4 3 2 5 6] Houve troca. Passo A.4 Comparar a(4) e a(5). Se a(4) > a(5), troque os dois elementos. a = [4 3 2 5 6] No houve troca porque a(4) no maior que a(5). B) Repetio a iterao (porque o vetor ainda no est ordenado):
44
Passo B.1 Comparar a[1] e a[2]. Se a[1] > a[2], troque os dois elementos. a = [3 4 2 5 6] Houve troca do nmero 4 com o nmero 3. Passo B.2 Comparar a[2] e a[3]. Se a[2] > a[3], troque os dois elementos. a = [3 2 4 5 6] Houve troca do nmero 4 com o nmero 2. Passo B.3 Comparar a[3] e a[4]. Se a[3] > a[4], troque os dois elementos. a = [3 2 4 5 6] No houve troca. Passo B.4 Comparar a[4] e a[5]. Se a[4] > a[5], troque os dois elementos. a = [3 2 4 5 6] Novamente no houve troca. C) Repetio a iterao (porque o vetor no est ordenado) Passo C.1 Comparar a[1] e a[2]. Se a[1] > a[2], troque os dois elementos. a = [2 3 4 5 6] Houve troca do nmero 3 com o nmero 2. Passo C.2 Comparar a[2] e a[3]. Se a[2] > a[3], troque os dois elementos. a = [2 3 4 5 6] No houve troca. Passo C.3 Comparar a[3] e a[4]. Se a[3] > a[4], troque os dois elementos. a = [2 3 4 5 6] No houve troca. Passo C.4 Comparar a[4] e a[5]. Se a[4] > a[5], troque os dois elementos. a = [2 3 4 5 6] No houve troca. D) Repetio a iterao. (a) Passo D.1 Comparar a[1] e a[2]. Se a[1] > a[2], troque os dois elementos. a = [2 3 4 5 6] No houve troca. (b) Passo D.2 Comparar a[2] e a[3]. Se a[2] > a[3], troque os dois elementos. a = [2 3 4 5 6] No houve troca. (c) Passo D.3 Comparar a[3] e a[4]. Se a[3] > a[4], troque os dois elementos. a = [2 3 4 5 6] No houve troca. (d) Passo D.4 Comparar a[4] e a[5]. Se a[4] > a[5], troque os elementos. a = [2 3 4 5 6] No houve troca.
45
E) Se no houve troca na ltima iterao ento pare porque o vetor j est ordenado. O seguinte trecho de programa implementa o algoritmo da bolha para ordenar a vetor a (supondo que o vetor a j foi lido e est na memria).
1 2 3 4 5 6 7 8 9 10 11 12 13 n = length(a); HouveTroca = %t; while HouveTroca HouveTroca = %f; for i = 1:(n-1) if a(i) > a(i+1) temp = a(i); a(i) = a(i+1); a(i+1) = temp; HouveTroca = %t; end end end // Obtem o tamanho do vetor
// Houve troca
Comentrio. A varivel booleana HouveTroca indica se houve troca ou no aps a ltima passada pelo vetor. A varivel HouveTroca assume o valor falso na linha 4, e se dentro do lao interno for...end no houver troca ento a varivel HouveTroca continuar com valor falso (isto far com que o lao while...end encerre a execuo do programa). Caso contrrio, a varivel HouveTroca assume o valor verdadeiro na linha 10) (isto far com que o lao while...end execute nova iterao). A troca de um elemento com o elemento seguinte (i.e., a(i) com a(i+1)) realizado pelo trecho:
temp = a(i); a(i) = a(i+1); a(i+1) = temp;
A varivel temp uma varivel temporria usada apenas para guardar o valor de a(i) antes que o mesmo seja perdido na atribuio a(i) = a(i+1). Exerccio 4.2.1. Modique trecho de programa que contm algoritmo da bolha para colocar o vetor em ordem decrescente (troque o operador > por < na linha 6). Use esta modicao para elaborar um programa para ler um vetor com 5 elementos, coloca-lo em ordem decrescente e escreve-lo.
4.3
Matrizes Bidimensionais
Matrizes bidimensionais necessitam de dois ndices para individualizar os elementos. Na Figura 4.3 mostrada uma matriz. Matrizes so construdas envolvendo seus elementos em colchetes. Cada linha da matriz separada por um ponto e vrgula e cada elemento de uma linha separado por um espao (ou vrgula). Por exemplo, a seguinte matriz da matemtica, 2 3 4 A= 4 5 2 poderia ser construda no Scilab pelo comando:
46
3 1 2 4 5 5 8 6 8 10 11 5 9 1 5 7 2 3 8 8
47
d) Calcular a soma dos quadrados dos elementos da segunda linha de A e escrever o resultado.
a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8]; soma = 0; for i=1:4 soma = soma + a(2,i)^2; end printf("soma = %g\n",soma);
48
h) Escrever a matriz A.
a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8]; for i=1:5 for j=1:4 printf("%3.0f ",a(i,j)); end printf("\n"); end
i) Ler uma matriz B de mesma dimenso que A. Efetuar a soma matricial A + B e armazenar o resultado na matriz C.
a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8]; for i=1:5 for j=1:4 b(i,j) = input("Digite um nmero"); end end for i=1:5 for j=1:4 c(i,j) = a(i,j) + b(i,j); end end
j) Ler uma matriz B de mesma dimenso que A. Escrever IGUAIS se A for uma matriz igual B. Caso contrrio, escrever DIFERENTES.
a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8]; for i=1:5 for j=1:4 b(i,j) = input("Digite um nmero"); end end iguais = %t; for i=1:5 for j=1:4 if a(i,j) <> b(i,j) iguais = %f; end end end if iguais printf("Iguais\n"); else printf("Diferentes\n"); end
Exerccio 4.3.2. Elabore um programa para ler a matriz A, trocar a segunda linha com terceira linha e escrever a matriz A.
49
4.3.1
A funo size() retorna um vetor com as duas dimenses de uma matriz. Por exemplo, considere a matriz:
-->a = [1 2 3 4 5; 3 4 5 6 5] a = ! ! 1. 3. 2. 4. 3. 5. 4. 6. 5. ! 5. !
A funo size() retorna um vetor de dois elementos com nmero de linhas e colunas da matriz. Por exemplo:
-->size(a) ans = ! 2. 5. !
Outro exemplo:
-->[l c] = size(a) c = 5. = 2.
A funo size(x,1) (ou size(x,"r")) retorna somente nmero de linhas da matriz. Por exemplo,
size(a,1) size(a,"r") // retorna 2 // retorna 2
A funo size(x,2) (ou size(x,"c")) retorne somente nmero de colunas da matriz. Por exemplo,
size(a,2) // retorna 5
Considere o vetor:
b = [3 1 2 4] // O Scilab considera b tanto // um vetor com 4 elementos como // tambm uma matriz 1x4. // retorna 4
size(b,"c")
50
4.4
Os nmeros aleatrios gerados por rand so nmeros fracionrios no intervalo [0, 1]. No entanto, o problema pede para gerar nmeros inteiros aleatoriamente entre 1 e 6 de modo a simular o lanamento de um dado. Isto pode ser obtido com o seguinte procedimento. Primeiro, multiplica-se rand por 6 para gerar nmeros no intervalo [0, 6]. Por exemplo:
-->6*rand()
Em seguida, usa-se a funo fix() para gerar apenas nmeros inteiros entre 0 e 5 (inclusive). Por exemplo,
-->fix(6*rand())
Por m, adiciona-se o valor 1 na expresso anterior para gerar nmeros inteiros entre 1 e 6.
-->fix(6*rand())+1)
e obtm-se, deste modo, nmeros inteiros aleatrios entre 1 e 6 na qual simula o lanamento de um dado como requerido. Ser utilizado, tambm, um vetor f que armazena a freqncia de cada dado. Por exemplo, o elemento f(1) armazena a freqncia do dado 1, o elemento f(2) armazena a freqncia do dado 2, e assim por diante. Soluo:
1 2 3 4 for i = 1:6 f(i) = 0; end for i=1:100
51
5 6 7 8 9 10 11
r = fix(6*rand())+1; f(r) = f(r)+1; end for i=1:6 f(i) = f(i)/100; printf("freqncia do end
// divide o vetor f por 100 para obter a frequencia. dado %1.0f = %5.2f\%\n",i,f(i));
Matemtica 6,5 8,0 7,5 6,1 5,1 4,1 9,1 8,8 9,5 8,2
Portugus 7,1 8,3 8,1 5,2 6,1 5,5 8,9 8,5 9,3 8,5
Digitao 7,5 7,2 8,3 6,0 6,5 5,4 9,4 9,0 9,1 7,8
52
6.5; ... 5.4; ... 9.4; ... 9.0; ... 9.1; ... 7.8];
b) Calcule a mdia de cada candidato, armazene em um vetor media e escreva-o. Neste programa e nos seguintes assumido que o cdigo acima j est includo no programa.
1 2 3 4 5 6 7 8 9 10 11 12 [m,n]=size(nota); for i=1:m soma = 0; for j=1:n soma = soma+nota(i,j); end media(i)=soma/3; end printf("Nome Media\n"); // linha de cabeario for i=1:m printf("%-10s %3.1f\n",nome(i),media(i)); end Resultado Nome Ana Carlos Francisco Jos Magali Marcos Maria Marta Paulo Pedro Media 7.0 7.8 8.0 5.8 5.9 5.0 9.1 8.8 9.3 8.2
d) Elabore um programa para escrever um relatrio dos candidatos em ordem de classicao dos candidados.
53
O soluo desta questo mostrado no programa listado abaixo. Na primeira parte do programa (linhas 1-8), calcula-se a mdia da mesma maneira que no item(b) deste exerccio. Na segunda parte do programa (linhas 10-25) feita a ordenao dos vetores com o algoritmo da bolha. O vetor ordenado o vetor media, mas note que para cada dois elementos trocados do vetor do media tambm trocado os respectivos elementos do vetor nome para acompanhar a mesma ordem do vetor media. Na ltima parte do programa (linha 27-30) impresso o relatrio dos candidatos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 [m,n]=size(nota); for i=1:m // Computa as medias dos alunos soma = 0; for j=1:n soma = soma+nota(i,j); end media(i)=soma/3; end // ordenao e troca dos elementos HouveTroca = %t; while HouveTroca HouveTroca = %f; for i = 1:(m-1) if media(i) < media(i+1) temp = media(i); // troca o elemento media i com i+1 media(i) = media(i+1); media(i+1) = temp; temp = nome(i); // troca o elemento nome2 i com i+1 nome(i) = nome(i+1); nome(i+1) = temp; HouveTroca = %t; // Houve troca end end end printf(" Nome Media\n"); // linha de cabeario for i=1:m printf("%2.0f- %-10s %3.1f\n",i,nome2(i),media(i)); end Resultado 12345678910Nome Paulo Maria Marta Pedro Francisco Carlos Ana Magali Jos Marcos Media 9.3 9.1 8.8 8.2 8.0 7.8 7.0 5.9 5.8 5.0