segunda-feira, 1 de fevereiro de 2010

Matriz:

Antes de começarmos com matriz, que tal uma revisão de matemática sobre matrizes?
Sim, matemática novamente :)

Essa aula, vocês aprenderão "sozinhos", peço que, leiam e aprendam apenas 3 operações, somar, subtrair e multiplicar matrizes.
Além de souber o que é uma matriz quadrada e como achar a transposta de uma matriz!
Vou disponibilizar 2 sites onde vocês podem retirar todas essas informações entre várias outras.

colégio web: matriz
brasil escola: matriz


Bom estudo pessoal!

Exercícios resolvidos de vetor:

1) Dada uma sequeência de n elementos, imprimi-la em ordem inversa.
2) Dada uma sequência de n elementos, imprimi-la em ordem decrescente.
3) Dizemos que uma sequência de n elementos, com n par, se as seguintes somas são iguais:

a soma do maior elemento com o menor
a soma do segundo maior elemento com o segundo menor
a soma do terceiro maior elemento com o terceiro menor ...

ex: 2 12 3 6 16 15 é uma sequência balanceada, pois 16+2=15+3=12+6
Dados n (n par) e uma sequência de n elementos, verificar se essa sequência é balanceada.



1)

#include<stdio.h>

int main(void)
{
int vet[100],cont,n;
printf("digite o numero de termos da sequencia: ");
scanf("%d",&n);

for(cont=0; cont=0 ;cont--)
printf("%d\n",vet[cont]);

getchar();
getchar();
}

2)


#include<stdio.h>

int main(void)
{
int a[50],i,n,j,troca;
printf("digite o numero de termos da sequencia: ");
scanf("%d",&n);

for(i=0; i<=n-1 ;i++){
printf("digite um termo da sequencia: ");
scanf("%d",&a[i]);
}
for(i=0; i<=n-1 ;i++){
for(j=i+1; j<=n-1; j++){
if(a[i]>a[j]){
troca=a[j];
a[j]=a[i];
a[i]=troca;
}
}
}

for(i=0; i<=n-1 ;i++)
printf("%d",a[i]);

getchar();
getchar();
}


3)

#include<stdio.h>

int main(void)
{
int a[50],i,n,j,troca,soma,somant,k;
printf("digite o numero de termos da sequencia: ");
scanf("%d",&n);

for(i=0; i<=n-1 ;i++){
printf("digite um termo da sequencia: ");
scanf("%d",&a[i]);
}
for(i=0; i<=n-1 ;i++){
for(j=i+1; j<=n-1; j++){
if(a[i]>a[j]){
troca=a[j];
a[j]=a[i];
a[i]=troca;
}
}
}
k=n-1;
soma=a[0]+a[k];
for(i=1;i<= (n/2)-1 ;i++){
k--;
somant=a[i]+a[k];
if(soma!=somant)
i=2*n;

soma=somant;
}

if(i==2*n+1)
printf("nao eh balanceada");
else
printf("eh balanceada");

getchar();
getchar();
}


Tentem entender a lógica desses problemas, será de grande ajuda para passarmos para o próximo assunto (matriz)! Daqui a pouco eu já posto a aula de matrizes, see yah!

Vetores em C: (continuação)

Bom, vamos continuar com vetor?

Vamos a um exemplo de questão:

1)Faça um programa que leia n notas utilizando vetor e imprima a média dessas notas.

Oras, como vamos fazer se não sabemos quantas notas sao?
Simples, imagine que você tem que calcular a média de uma sala de aula normal, quantos alunos você preve que terá nessa sala?
50 é uma quantidade razoável, não?
Então, declaramos o vetor com 50 termos, lemos n e mandamos ler as notas até um número anterior a n (como todos aprenderam na aula passada, a posição do vetor começa pela posição zero, logo, a última posição de um vetor de 50 termos, será a posição 49!


2) Dada uma sequeência de n elementos, imprimi-la em ordem inversa.
3) Dada uma sequência de n elementos, imprimi-la em ordem decrescente.
4) Dizemos que uma sequência de n elementos, com n par, se as seguintes somas são iguais:

a soma do maior elemento com o menor
a soma do segundo maior elemento com o segundo menor
a soma do terceiro maior elemento com o terceiro menor ...

ex: 2 12 3 6 16 15 é uma sequência balanceada, pois 16+2=15+3=12+6
Dados n (n par) e uma sequência de n elementos, verificar se essa sequência é balanceada.


Oyasuminasai!


obs: faremos o exercício 3 e o exercício 4, no próximo post, devido a sua dificuldade.

Exercícios resolvidos de vetor:

Exercícios para fixarmos vetor:
Vamos começar de leve hoje!


#include<stdio.h>

int main(void)
{
int dado[6],n, cont,result,i;

printf("quantas vezes o dado foi lancado? ");
scanf("%d",&n);

/*vamos zerar todas as células da variável dado para podermos contar
corretamente o numero de vezes das faces obtidas */

for(i=0;i < n;i++){
printf("digite a face obtida na %d vez.",cont+1);
scanf("%d",&result);
if(result==1)
dado[0]++;
else if (result==2)
dado[1]++;
else if(result==3)
dado[2]++;
else if(result==4)
dado[3]++;
else if(result==5)
dado[4]++;
else
dado[5]++;
}
printf("%d faces um\n",dado[0]);
printf("%d faces dois\n",dado[1]);
printf("%d faces tres\n",dado[2]);
printf("%d faces quatro\n",dado[3]);
printf("%d faces cinco\n",dado[4]);
printf("%d faces seis",dado[5]);

getchar();
getchar();
}

Daqui a pouco, vou postar mais uma aula e mais exercícios, então, até daqui a pouco, ok?

Vetores:

Motivação para aprendermos vetor:

Dados 5 notas, calcular a média das notas e identificar se elas são maiores ou menor do que a média das notas:

#include<stdio.h>
int main(void)
{

float nota1,nota2,nota3,nota4,nota5,media;
media=0.0;

scanf("%f",&nota1);
scanf("%f",&nota2);
scanf("%f",&nota3);
scanf("%f",&nota4);
scanf("%f",&nota5);
media=nota1+nota2+nota3+nota4+nota5;
if(nota1>media)
printf("%f > %f",nota1,media);
if(nota2>media)
printf("%f > %f",nota2,media);
if(nota3>media)
printf("%f > %f",nota3,media);
if(nota4>media)
printf("%f > %f",nota4,media);
if(nota5>media)
printf("%f > %f",nota5,media);

getchar();
getchar();
}

Isso, de fato, é uma solução, porém, como sabemos, em uma sala de aula, não temos apenas 5 alunos, então, e se fossem 50 alunos, ou, 1000 alunos?
Meio cansativo, não?
Para solucionarmos isso, aprenderemos vetor, ou, também chamada de variável composta homogênea unidimensinal.

Um vetor, é uma estrutura de armazenamento de dados e é usada para armazenar valores do mesmo tipo.
Um vetor, possui "células" de armazenamento, por exemplo, criamos uma variável nota, essa variável nota, poderá armazenar quantos notas você quiser, isso é basicamente um vetor.
Veja um exemplo de declaração de vetor para você entender melhor:

float nota[5];

Nessa declaração, estamos reservando 5 células, ou seja, 5 números para a variável nota!
A referência de cada uma dessas células é realizada pelo nome do vetor nota e por um índice.

O índice, sempre começa do zero, ou seja, como são nesse caso, cinco células, iremos percorrer até a índice 4, pois, 0,1,2,3,4 = 5 células!

Segue basicamente essa estrutura:

0 1 2 3 4
|...|...|...|...|...|

Para referenciar o conteúdo de cada célula do vetor nota, por exemplo, queremos ler nota na célula 0, então fazemos:

scanf("%f",&nota[0]);

agora, na célula 1:

scanf("%d",&nota[1]);

Entenderam o raciocínio?

Vamos fazer aquele mesmo exercício das notas, agora com a utilização de vetor, para vermos como é muito mais fácil e prático:

#include<stdio.h>
int main(void)
{
float nota[5], media;
int cont;

media=0.0;
cont=0;

while(cont<=4){ scanf("%f",nota[cont]); media=media+nota[cont]); cont++; } /*veja, na primeira entrada do laço, cont vale 0, entao, leremos nota[0], depois, incrementamos cont e na segunda entrada do laço, leremos nota[1].. até nota[4]! */ for(cont=0; cont<=4; cont++){ if(nota[cont]>media)
printf("a nota %d eh maior que a media da sala",cont+1 );
eslse
printf("a nota %d eh menor que a media da sala",cont+1);
}
getchar();
getchar();
}
Procurem entender perfeitamente essa estrutura, mais tarde, continuaremos com exemplos sobre ela! Por hora, façam esse exercício e, como agora temos o fórum, postem no fórum seu código para ser avaliado :)
1) Dado uma sequência de 10 números inteiros, imprimi-lá em ordem inversa:

Exercícios resolvidos de séries em C:

1) Fazer um programa que calcule e escreva a soma de S:

S= 1/1 + 3/2 + 5/3 + 7/4 ... 99/50

Ah, antes disso, só vamos introduzir algo novo, quando dizemos, por exemplo:

cont=cont+1;

É a mesma coisa que dizer:

cont++;

e também

cont=cont-1;

é a mesma coisa que:

cont--;
Então, vamos nos acostumar com o simbolo ++ e --, a partir de agora.

#include<stdio.h>

int main(void)
{
int numerador,denominador;
float soma;

numerador=1;
soma=0;

for(denominador=1; denominador<=50; denominador++){
soma=soma+ (float)numerador/denominador; /*perceba a necessida do (float) */
numerador=numerador+2;
}
printf("%f",soma);
getchar();
getchar();
}

2) Fazer um programa que calcule e escreva a seguinte soma:

S= (37*38)/1 + (36*37)/2 + (35*36)/3 .... (1*2)/37

#include<stdio.h>

int main(void)
{
int numerador,denominador;
float soma;

numerador=37;
soma=0;

for(denominador=1; denominador<=37; denominador++){
soma=soma+((float)numerador*(numerador+1))/denominador;
numerador--;
}
printf("%f",soma);

getchar();
getchar();
}

Perceba a importância do parênteses nesse programa.

3) Fazer um programa que calcule e escreva o valor de S onde:

S= 1/1 - 2/4 + 3/9 - 4/16 ... -10/100

Perceba que nesse, não temos uma ordem de incremento no denominador, igual tinhamos nos anteriores e perceba também a variação do sinal!
Se olhar mais atentamente, verá que, o denominador é sempre o quadrado do numerador, então, problema resolvido!

#include<stdio.h>

int main(void)
{
int numerador;
float soma;

numerador=1;
soma=0;

while(numerador!=11){
soma=soma+(float)numerador/(numerador*numerador);
if(numerador>0){
numerador=-numerador;
numerador--;
}
else{
numerador=-numerador;
numerador++;
}
}
printf("%f",soma);

getchar();
getchar();
}


Bom, depois eu continuo com as séries, até!

Operador modificador de tipo:

Essa é uma continuação da aula de números de ponto flutuante.
Vamos a um exemplo diretamente para vocês entenderem melhor o que é um modificador de tipo!
ex:

int n,i;
float divisao;

i=5
n=9;
divisao=i/n;
printf("%f",divisao);


oras, fácil não?
o valor mostrado será 0.5555.. certo?
ERRADO!

Não é porque declaramos divisão como uma variável de número flutuante que ela armazenará valores de ponto flutuante.
Como ambas as variáveis, i e n, são variáveis inteiras, o resultado dessa operação será o valor inteiro resultado dessa operação, ou seja, no caso, o valor inteiro é zero, logo, divisão valerá 0.000..
Somente quando temos um ou ambos os operandos da operação declarados como número flutuante, essa conta será feita corretamente!
ex:

int i;
float n,soma;

i=5;
n=9.0;
divisao=i/n;
printf("%f",divisao);

Agora sim, o valor da divisão aparecerá 0.555.. pois, como uma das variáveis da operação é de ponto flutuante, a operação também se torna de ponto flutuante!

Mas, vocês poderiam perguntar, oras, porque não declaramos todas as variáveis como ponto flutuante e fim de papo?
É simples, o tamanho do programa, aumenta muito com relação a declararmos as variáveis como se fossem inteiras!
Então, foi necessária a criação do operador modificador de tipo!
Nesse nosso caso, i=5 e n=9, ou seja, ambas são inteiras, então, como vamos fazer essa operação se tornar de ponto flutuante?
Simples, vejamos o exemplo!
ex:

int n,i;
float soma;

i=5;
n=9;
soma=(float)i/n;
printf("%f",soma);

com esse (float) na frente da variável i, "transformamos" o i momentaneamente, em uma variável de ponto flutuante e, assim, conseguimos efetuar a operação e obter o resultado desejado!

ex:

Dado um inteiro positivo n, calcular e imprimir o valor da seguinte soma:

1/n + 2/(n-1) + ... n/1

qualquer dúvida, contatem-me!
konbawa!