• Nenhum resultado encontrado

AULA 2 – REVISÃO DO PADRÃO C ANSI – Parte 2

N/A
N/A
Protected

Academic year: 2019

Share "AULA 2 – REVISÃO DO PADRÃO C ANSI – Parte 2"

Copied!
6
0
0

Texto

(1)

REVISÃO DE C-ANSI – Parte 2

Esta aula dará continuação à revisão dos conceitos básicos do padrão C-ANSI. Na aula de hoje serão revisados conceitos sobre conversão de tipos de dados, utilização de casting e o emprego de vetores e matrizes.

C

ONVERSÃO DE

T

IPOS

Em C, podem-se utilizar vários tipos distintos de dados em uma única expressão. Desse modo, entender o processo de conversão de tipos em atribuições e expressões é fundamental.

Conversão de Tipos em Atribuições

Quando uma atribuição é realizada em C, o tipo de dado da expressão a direita da atribuição é convertido para o tipo de dado da variável a esquerda da atribuição. Se o termo a direita da atribuição for de um tipo “maior” de dado, pode ocorrer perda de informação do dado.

Por exemplo, o Programa 1 atribui a variável xum valor que excede o valor suportado por uma variável do tipo char. Nesse caso, apenas o byte menos significativo do valor decimal 346 é passado para a variável x. Logo após, é atribuído um valor não inteiro a uma variável inteira. No caso, apenas a parte inteira do número 23.56 é atribuído a variável y.

#include <stdio.h>

int main(void) {

char x = 0; int y = 0; x = 346; y = 43.56;

printf("Valor de x: %d, parte baixa de 346 vale: %d\n", x, 346&0x00FF); printf("Valor de y: %d\n", y);

system("PAUSE"); return 0;

}

Programa 1 Conversão de Tipos em Atribuições.

Quando a atribuição é entre variáveis do tipo ponto flutuante a única informação perdida é a precisão. A Tabela 1 resume as conversões de tipo em atribuições.

(2)

Conversão de Tipos em Expressões

Basicamente, quando uma expressão com vários tipos de dados é utilizada, o compilador acaba convertendo os operandos da expressão no tipo do maior operando. Esta transformação é realizada operação por operação. Observe atentamente o código que segue:

#include <stdio.h>

int main(void) {

char a = 2, b = 3, c = 100; int d = 200;

float e = 0.25, f = 0;

f = a + c/d + e*b; //cuidado... a = a + c/d + e*b;

printf("Valor final de f: %f, valor final de a: %d\n", f, a); system("PAUSE");

return 0; }

Programa 2 Conversão de Tipos em Expressões.

Na expressão f = a + c/d + e*b; o compilador avalia cada termo da soma separadamente. Assim, temos a variável a, do tipo char. Temos c/d, uma divisão de um tipo char por um tipo int, na qual a variável c é convertida no tipo int. Após têm-se e*b, onde a variável b é convertida para o tipo float. Após, o complilador avalia a soma dos termos, tendo-se uma soma de um tipo char, um tipo int e um tipo float. Todas as variáveis são transformadas em tipo float e somadas. Após, nenhuma conversão é realizada para a atribuição, já que f é do tipo float. Na expressão a = a + c/d + e*b; o resultado da expressão é convertido do tipo float para o tipo char no momento da atribuição.

Pergunta: Se o objetivo era obter o resultado exato da expressão, tal resultado está correto? Resposta: NÃO

#include <stdio.h>

. Observe que o termo c/d da expressão representa a divisão inteira de um tipo char por um tipo int. No ato da conversão de tipo, c foi convertido para int. Mesmo assim, o resultado

da divisão de dois inteiros resulta em um inteiro e a parte fracionária é perdida antes mesmo da conversão para o tipo float. Para solucionar este “problema” podem-se utilizar os chamados casts. Compile o seguinte programa:

int main(void) {

char a = 2, b = 3, c = 100; int d = 200;

float e = 0.25, f = 0;

f = a + c/d + e*b; //o problema aqui está na divisão inteira c/d printf("Valor final de f: %f \n", f);

f = a + (float)c/d + e*b; //o cast força c a ser float

printf("Valor final de f com cast: %f\n", f); //assim a divisão é exata system("PAUSE");

return 0; }

(3)

Lembre-se que usar cast força que uma determinada expressão ou variável seja avaliada como o determinado tipo de dado, explicitado pelo nome do tipo entre parênteses antes da variável ou expressão.

M

ATRIZES E

S

TRINGS

Em C-ANSI uma matriz é um conjunto de dados relacionados, representados por um mesmo nome. O tipo mais simples de matriz é a chamada matriz unidimensional (ou vetor).

Matriz Unidimensional

Uma matriz unidimensional é uma matriz com apenas uma dimensão. A forma geral de declarar uma matriz unidimensional é:

tipo nome_da_matriz[tamanho_da_matriz];

Assim, quando escrevemos int aux[10]; estamos criando um vetor com dez elementos do tipo inteiro.

É muito importante lembrar que C não realiza verificação de limites. Isso torna o programa mais eficaz, porém o torna mais vulnerável a erros de execução, pois cabe ao programador realizar a verificação de limites. Por exemplo, seria possível compilar o programa com o comando aux[20] = 10; sem que o Dev indicasse erro algum, mesmo tendo excedido os limites do vetor aux. Isso pode acarretar sérios problemas.

Outro aspecto interessante é que as matrizes são contíguas, i.e., elas ocupam um bloco de memória contíguo quando declaradas.

A inicialização de matrizes é feita seguindo o exemplo a seguir:

int vet[8] = { 0, 1, 1, 2, 3, 5, 8, 13 };

Vale lembrar que os índices em C começam em 0. Assim sendo, o último termo da matriz vet deve ser indexada com o índice 7. Isto é muito importante para evitar que haja violação dos limites de uma matriz.

Strings

Um tipo especial de matriz unidimensional é um vetor de caracteres. Em C, quando um vetor de caracteres possui um terminador nulo ‘\0’ tal vetor pode ser considerado uma string.

Ou seja, a declaração:

char vet[8] = { ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘\0’ };

Equivale a declarar uma constante string equivalente:

(4)

Estude o Programa 4.

#include <stdio.h>

int main(void) {

char vet[8] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', '\0' };

char vet2[8] = "abcdefg"; //atribuo uma string a um vetor de caracteres int i;

for (i = 0; i < 8; printf("%c",vet[i]),i++); putchar('\n');

printf("%s\n",vet); puts(vet);

puts(vet2); system("PAUSE"); return 0;

}

Programa 4 string.

Matrizes Multidimensionais

Em C pode-se criar matrizes com quantas dimensões forem necessárias, bastando adicionar, para tanto, quantas dimensões forem necessárias utilizando colchetes para delimitar o tamanho da matriz. A forma básica para se declarar uma matriz de qualquer tamanho é:

tipo nome_da_matriz[tam_da_1ª_dim][tam_da_2ª_dim](...)[tam_da_nª_dim];

Comumente é utilizada uma matriz de duas dimensões, sendo um exemplo de declaração para uma matriz deste tipo: float mat[3][6]; Esta declaração cria uma matriz da forma da Tabela 2.

Tabela 2 Exemplo de matriz com duas dimensões de três linhas e seis colunas.

[i][j] 0 1 2 3 4 5

0 mat[0][0] mat[0][1] mat[0][2] mat[0][3] mat[0][4] mat[0][5]

1 mat[1][0] mat[1][1] mat[1][2] mat[1][3] mat[1][4] mat[1][5]

2 mat[2][0] mat[2][1] mat[2][2] mat[2][3] mat[2][4] mat[2][5]

Passando Matrizes para Funções

É interessante lembrarmos que ao passarmos uma matriz para uma função estamos na verdade passando um ponteiro para uma determinada posição da matriz (falaremos sobre ponteiros nas próximas aulas). Por hora, vamos nos lembrar de que quando declaramos um tipo matriz como argumento de uma função não é necessário informar todas as dimensões da matriz (lembre-se que C não realiza verificação de limites).

(5)

#include <stdio.h>

int f1(int a[]) { return a[4]; } //chamada com vetor sem tamanho

int f2(int a[10]) { return a[4]; } //chamada com vetor com tamanho especificado int f3(int *a){ return *(a+4); } //chamada com ponteiro

int main(void) {

int vet[10] = {12,123,04,21,65,53,35,85,45,34};

printf("%5d",f1(&vet[0])),printf("%5d",f1(vet)),printf("%5d\n",f1(&vet[0])); system("PAUSE");

return 0; }

Programa 5 Indexação de matrizes em funções.

Quando se deseja trabalhar com matrizes multidimensionais indexado-as na função, todas as dimensões devem obrigatoriamente ser passadas para a função, com exceção da primeira dimensão, sendo esta opcional. Estude o Programa 6.

#include <stdio.h>

int f1(int a[][5]) { return a[1][3]; }

int main(void) {

int vet[2][5] = { 12,123,04,21,65, 53, 35,85,45,34 }; printf("%d\n", f1(vet));

system("PAUSE"); return 0;

}

Programa 6 Indexação de matrizes multidimensionais em funções.

Lendo e Escrevendo Matrizes

A leitura e escrita de matrizes usualmente são efetuadas utilizando-se loops. Estude o Programa 7.

#include <stdio.h> #define TAM 3

int main(void) {

int vet[TAM][TAM], i, j; for (i = 0; i < TAM ; i++) {

for (j = 0; j < TAM; j++) printf("Entre com indice %d,%d: ",i+1,j+1), scanf("%d",&vet[i][j]);

};

printf("Matriz Digitada:\n");

for (i = 0; i < TAM ; i++ , putchar('\n')) {

for (j = 0; j < TAM; printf("%5d",vet[i][j]), j++); }

system("PAUSE"); return 0;

}

Programa 7 Lendo e Escrevendo Matrizes Indexadas.

(6)

E

XERCÍCIOS

Suponha o divisor de tensão da Figura 1.

Figura 1 Divisor de tensão.

No divisor de tensão ao lado, a tensão de saída Vo, que equivale à queda de tensão sobre o resistor Rb, é função das resistências e da tensão de entrada Ve. A relação entre Vo e Ve é dada pela equação que segue:

 

=  +

 

b

o e

a b

R

V V

R R

Exercício 1 Considerando Ve = 10V e Ra = 10kΩ, faça um programa que calcula o valor de Vo para cada caso de Rb, onde Rb varia de 1kΩ até 20 kΩ com passos de 1kΩ. Utilize uma função para calcular a tensão de saída. A função deverá conter os parâmetros Ve, Ra e Rb como entradas. O programa deverá imprimir na tela o valor de Rb e o valor exato da tensão de saída para cada caso. O uso de matrizes é opcional. Todas as variáveis utilizadas como parâmetros da função devem ser, obrigatoriamente, do tipo int.

Exercício 2 Faça um programa que leia uma matriz quadrada de números inteiros e imprima na tela a matriz digitada, bem como a soma dos elementos de cada coluna e de cada linha. Além disso, o programa deverá imprimir a média exata (em float) de todos os valores da matriz. Utilize uma função que recebe uma matriz como parâmetro e retorna a média.

Imagem

Tabela 1  Conversão de tipos em atribuições (retirado de SCHILDT, H. C., &#34;C: Completo e Total&#34;)
Tabela 2  Exemplo de matriz com duas dimensões de três linhas e seis colunas.

Referências

Documentos relacionados

O diretor da Agência Nacional de Energia Elétrica (Aneel), Edvaldo Santana, disse ontem que o atual cenário de turbulências no setor elétrico “está caminhando para

Há amplo espaço para preocupação quanto às dificuldades para aprovação de reformas necessárias à contenção do déficit público, peça crucial para o sucesso

O que Lacan nomeou de princípio feminino pode, portanto, ser generalizado aos homens e se esclarece como o princípio de um gozo que se sustenta mais além do sentido fálico: ele

De fato, a aplicação das propriedades da regra variável aos estudos lingüísticos além da fonologia não constitui assunto tranqüilo, seja porque a variável passa a ser

Se nesse período crítico, ela encontra alguém que, ignorante e inescrupulosamente, lhe fornece exercícios respiratórios, e se ela segue as instruções fidedignamente na esperança

Portanto, todos os negócios devem ser informados de suas falhas, pois são manchas para a religião, pois não devemos ser assim neste ou naquele

O trauma deixa de ser anterior ao sujeito, como queria Freud em sua concepção do mal estar, para ser aquilo que pode surgir como efeito do furo produzido

Para o menino Momik, a constituição de sua própria memória, no que diz respeito ao trauma não vivido do holocausto e a constituição de si mesmo como judeu, se dará necessariamente