Métodos Computacionais em Física Tatiana G. Rappoport tgrappoport@if.ufrj.br 214-2
Variáveis indexadas (arrays) Diversos problemas requerem o uso de vetores ou matrizes: Um conjunto de dados do mesmo tipo associados a uma úńica grandeza. Ex.: lista de notas de uma turma, vetor posição r(x,y,z)... Em programação: Dados de um mesmo tipo associados a uma variável indexada (array). São armazenados em uma sequência consecutiva de blocos de memória, todos do mesmo tamanho. Definição de arrays: double r[3]; int gols[3]; double M[4][3];(matriz com 4 linhas e 3 colunas) Definição de arrays com inicialização: double r[3]={2.,-1,1.5}; int gols[3]={}; int M[4][3]={{1,2,3},{3,2,1},{1,3,2},{1,1,1}};
Arrays- utilização Os índices de um array de dimensão N variam de a N-1 int main()! {!! double r[3]={2.,-1,1.5}; int gols[3]={}; //todos elementos sao zero double rm[3]={1.,2.} //3o elemento zero float modulo2 =,x=; x = r[];!! r[]=3.; r[]=4.*rm[] for(i = ; i < 3; ++i) { modulo2 = modulo2 + r[i]*r[i]; }!}
Arrays Não é possível criar um array sem que seu tamanho seja especificado na compilação. Este tamanho deve ser inteiro e constante. Nãõ podemos fazer: int N = 3; int N=3; double posicao[n]; Mas podemos: const int N=3; double posicao[n]; ou #define N 3; double posicao[n];
Arrays - erros comuns v[3]= {3.,1.5,-2.}; só vale na inicialização. Se for usado no meio do programa para atribuição de valores está errado! O programa não verifica violação de dimensão de array. Resultados imprevisíveis ou segmentation fault (falha) x[3] = {1,3,5}; v = x[3]; x[] x[1] x[2] y z 1 3 5 4 2 Atribui o valor de y a v! x[4] = 7; Altera o valor de z para 7 ou dá erro.
Exemplo #define DIM 5 #include <stdio.h> int main () { int vetor1[dim], vetor2[dim], i, prod=; for (i = ; i < DIM; i++) { scanf( %d, &vetor1[i]); } for (i = ; i < DIM; i++) { scanf( %d, &vetor2[i]); } for (i = ; i < DIM; i++) { prod =prod+ vetor1[i] * vetor2[i]; } printf( O produto vale %d, prod) ; return ; }
Exercício Modifique o exemplo anterior para que além de calcular o produto escalar, também forneça o cosseno do ângulo entre dois vetores cujas componentes são lidas do teclado. Escreva um algoritmo e implemente um programa em C para calcular, dadas as componentes de um vetor, o seu módulo e seu vetor unitário. Será que você consegue fazer gráfico vetorial no gnuplot? Salve as componentes de alguns vetores num arquivo vetor.dat e tente fazer o gráfico vetorial desses vetores. Consulte o manual. Use arrays!
Algorítmo de ordenação Como trocar os valores de duas variáveis? int a = 3; int b = 2; a = b; b = a; printf ("a = %d e b = %d\n", a, b); Não!! int a = 3; int b = 2; int temp; temp = a; a = b; b = temp; printf ("a = %d e b = %d\n", a, b);
Algorítmo de ordenação Percorre-se toda a lista Compara-se um elemento da lista, E, com todos os subsequentes Quando se encontra o menor dos elementos tal que S < E, esse elemento é trocado com o elemento E. Ao se atingir o úĺtimo elemento da lista, ela está ordenada 5 4 39 44 39 4 5 44 39 4 5 44 39 4 5 44 39 4 44 5
Exercício Escreva um programa em C que implemente o algoritmo de ordenação discutido em sala. A lista de números a ser ordenada deve ser lida de um arquivo e a lista final, ja ordenada, escrita em outro. Modifique o programa de modo que ele solicite a entrada, via teclado, do nome do arquivo que contém a lista de números não ordenada. A extensão desse arquivo deve ser.entrada escreva a lista ordenada em um arquivo que deve ter o mesmo nome do arquivo de entrada mas com a extensão.saida Use arrays!
Caracteres Além de arrays de núḿeros, podemos usar arrays de caracteres tipo char, que para o C são números. Existe uma correspondência entre o valor numérico da variável e o caractere na tabela ASCII. Usamos %c para imprimir a letra: char letra; char letra; letra = a ; printf("letra = %c \n", letra); Também pode ser lido do teclado: scanf("%c", &letra);
Sequências de caracteres - strings Podemos usar arrays de caracteres para formar palavras char c[2] = { O, i }; char nome[9] = { A, n, a,, M, a, r, i, a }; Ok mas inadequado String: char nome[] = "Ana Maria"; Array de caracteres de dimensão 1. Equivale a char c[1] = { A, n, a,, M, a, r, i, a, \ }; Caracter nulo: \ indica o fim de uma string. Necessário ao usar as funções com string da biblioteca padrão. As propriedades de array valem normalmente: nome[4] retorna o quinto caracter da string nome
Funções com strings Incluir biblioteca: #include <string.h> strcpy(s2, s1); Copia a string s1 na string s2 (s2 deve ter elementos suficientes). strcat(s2, s1); Concatena (adiciona) a string s1 ao final da string s2. n = strlen(s1); retorna o número de caracteres da string s1. (dimensão - 1, não inclui o \ ) strstr(s2, s1); Testa se a string s1 está contida na s2 if( strstr(s2, s1)!= NULL){... }
Entrada e saída com strings scanf("%s",palavra); Lê uma sequência de caracteres sem brancos. Adiciona o \. Palavra deve ter dimensão suficiente. printf ("Entre com o nome do arquivo de saida\n"); scanf("%s", nomearqout ); printf("%s\n",nome); Imprime nome. Pode conter brancos. Sabe o fim da string devido ao \. printf( O arquivo de saida e %s\n, nomearqout); sprintf(str, formato, variavel); Escreve o valor de variável na string str. Adiciona o \. str deve ter dimensão suficiente. sprintf(palavras,"x = %f", x); sscanf(str, formato, &variavel); Atribui o valor da string str à variável. sscanf(".3","%f",&x) dá x =.3
Exercício Escreva um programa em C que implemente o algoritmo de ordenação discutido em sala. A lista de números a ser ordenada deve ser lida de um arquivo e a lista final, ja ordenada, escrita em outro. Modifique o programa de modo que ele solicite a entrada, via teclado, do nome do arquivo que contém a lista de números não ordenada. A extensão desse arquivo deve ser.entrada escreva a lista ordenada em um arquivo que deve ter o mesmo nome do arquivo de entrada mas com a extensão.saida Use arrays!
Histogramas Histogramas são usados para visualizar e analisar dados distribuídos em determinadas categorias ou em intervalos de uma dada variável. Permitem que se perceba o valor central (média), a faixa de variação (desvio padrão), possíveis estruturas e eventos inesperados. 3 25 2 15 1 5-3 -1.8 -.6.6 1.8 3 Intervalos
Histogramas Para construir um histograma classificamos os dados de acordo com os intervalos, calculando o núḿero N(xi) ou a frequência F(xi) = N(xi)/N de ocorrência em cada intervalo. 3 25 2 15 1 5-3 -1.8 -.6.6 1.8 3 Intervalos
Histogramas Quando queremos fazer um histograma de uma variável real, definimos uma largura do intervalo (bin), x. As quantidades N(xi) vão representar o número de ocorrências entre xi e xi+ x. N(xi) depende da largura x. 25 2 15 1 5 N(xi ) -3-1.8 xi -.6.6 1.8 3 3 25 2 15 1 5-3 -1.8 -.6.6 1.8 3 Intervalos Variavel
Histogramas - largura do intervalo A escolha da largura dos intervalos pode distorcer o comportamento dos dados que estamos analisando. 3 12 25 2 15 1 5 1 8 6 4 2-3 -1.8 -.6.6 1.8 3-3 -1.8 -.6.6 1.8 3 Intervalos Variavel 35 3 25 2 15 1 5-3 -1.8 -.6.6 1.8 3
Histogramas - largura do intervalo 5 45 4 35 3 25 2 15 1 5-3 -1.8 -.6.6 1.8 3 8 7 6 5 4 3 2 1-3 -1.8 -.6.6 1.8 3 Variavel Variavel 16 14 12 1 8 6 4 2-3 -1.8 -.6.6 1.8 3 Variavel
Histogramas - normalização Dividir o número de eventos em cada intervalo pelo número total de eventos: A altura de cada barra indica o percentual de eventos que ocorre no intervalo. A soma de todas as alturas vale 1. Mais adequado se queremos tratar a distribuição dos dados como uma distribuição de probabilidades..35.3.25.2.15.1.5-3 -1.8 -.6.6 1.8 3 5 45 4 35 3 25 2 15 1 5-3 -1.8 -.6.6 1.8 3 Variavel Variavel