domingo, 30 de novembro de 2008

Correção de Exercício - Estruturas

Correção

1) Resposta:

#include
#include


struct restaurante
{ float preco;
char nome[20],endereco[40];
} ;

int main ()
{
restaurante a[10];
float soma=0,media;

printf(" 1. Crie uma estrutura para descrever restaurantes. Os membros dessa estrutura devem armazenar: o nome, o endereço, preço da comida por kilo. Crie uma matriz de 10 restaurantes e calcule e exiba a média de preço da comida por kilo e liste na tela quais restaurantes tem o preço da comida menor ou igual a média.\n\n");

for(int i=0;i<2;i++)
{ printf("\n_______________________RESTAURANTE %d_____________________\n",i+1);
printf(" Por favor digite o nome do restaurante %d: ",i+1);
scanf("%s",&a[i].nome);
printf(" Por favor digite endereco do restaurante: ");
scanf("%s",&a[i].endereco);
printf(" Por favor digite preco por kilo do restaurante : R$");
scanf("%f",&a[i].preco);
soma=soma+a[i].preco;
printf("\n---------------------------------------------------------\n");
}
media=soma/2;
printf("\n Media de preco por kilo dos 10 restaurantes: %0.2f\n",media);
printf("\n_____RESTAURANTES COM PRECO MENOR OU IGUAL A MEDIA_______\n");
for(int i=0;i<2;i++)
{ if(a[i].preco<=media)
{ printf("\n-----------------------RESTAURANTE %d---------------------\n",i+1);
printf(" Restaurante: %s ",a[i].nome);
printf(" Endereco: %s ",a[i].endereco);
printf(" Preco por kilo: %0.2f ",a[i].preco);
}
}
printf("\n_________________________________________________________\n");

system("pause");
return 0;
}

2) Resposta:


Correção de Exercício - Condição e repetição I

Correção

1) Resposta:

#include
#include
#include

int main (void)
{
float nfilhos,codigo,ganho,beneficio;


printf(" 1.1 - Para se calcular o salario de beneficio de um casal de um pais na Europa, precisa-se do codigo do casal, ganho anual e numero de filhos.\n");

int i=1;
while(i<=1000)
{ printf("\n\n Por favor digite o codigo do casal.\n");
scanf("%f",&codigo);
if(codigo==-1)
{i=1001;
}
else
{ printf(" \n Por favor digite o ganho anual do casal .\n");
scanf("%f",&ganho);
printf(" \n Por favor digite o numero de filhos do casal.\n");
scanf("%f",&nfilhos);

if(nfilhos==0)
{ printf(" O casal nao possui o salario beneficio pois nao possui filhos. \n\n");
}
else
{ if(ganho<3000)
{ beneficio=nfilhos*(0.20*ganho);
printf(" O salario beneficio e de %0.2f. \n\n",beneficio);
}
if((ganho>=3000)&&(ganho<6000))
{ beneficio=nfilhos*(0.15*ganho);
printf(" O salario beneficio e de %0.2f. \n\n",beneficio);
}
if(ganho>=6000)
{ beneficio=nfilhos*(0.10*ganho);
printf(" O salario beneficio e de %0.2f. \n\n",beneficio);
}
} }
}
i++;



system("pause");
return 0;

}


2) Resposta:

#include
#include
#include

int main (void)
{
int quadrado,cubo,i=1,divisiveis;
printf(" 1.2- CUBO E QUADRADOS DOS NUMEROS 1 A 20: \n\n");

i=1;
while(i<=20)//para calcular o quadrado e o cubo de cada numero respectivamente
{ quadrado=i*i;
cubo=i*i*i;
printf(" Quadrado de %d = %d, Cubo de %d = %d \n",i,quadrado,i,cubo);
i++;

}

printf("\n\n Numeros divisiveis de 1 a 20 por 5 sao: \n");
for(i=1;i<=20;i++)// para calcular os numeros divisiveis por 5
{ divisiveis=i%5;
if(divisiveis==0)
{ printf(" %d \n",i);
}
}


system("pause");
return 0;

}


3) Resposta:

#include
#include
#include

int main (void)
{
int i;
float quantidadeprodutos,soma,quantidade[50],preco[50],total[50];
char nome[50][20];

printf(" 1.3- Por favor digite quantos produtos deseja registrar.\n ");
scanf(" %f",&quantidadeprodutos);
printf(" \n");
soma=0;

i=1;
while(i<=quantidadeprodutos)
{
printf(" --------------------------------------- \n");
printf(" Produto %d \n",i);
printf("\n Por favor digite o nome do referido produto.\n ");
scanf("%s",&nome[i]);
printf(" \n Por favor digite a quantidade de produtos disponiveis.\n ");
scanf(" %f",&quantidade[i]);
printf(" \n Por favor digite o preco unitario do produto.\n ");
scanf(" %f",&preco[i]);
total[i]=quantidade[i]*preco[i];
soma=soma+total[i];
i++;
}
printf(" --------------------------------------- \n");
printf("\n\n NOME QUANTIDADE PRECO UNITARIO TOTAL \n");
printf(" _____________________________________________________\n");
for(i=1;i<=quantidadeprodutos;i++)
{ printf( "\n%10s %10.2f %15.2f %16.2f \n",nome[i],quantidade[i],preco[i],total[i]);

}
printf(" _____________________________________________________\n");
printf(" TOTAL\n");
printf(" %0.2f \n\n",soma);


system("pause");
return 0;

}


4) Resposta:

#include
#include
#include

int main (void)
{
int i,filial,codigo,mcodigo;
char cidade[10],mcidade[10];
float faturado,maior=-1;

printf(" 1.4- Por favor digite o numero de filiais de uma empresa qualquer.\n ");
scanf("%d",&filial);

i=1;
while(i<=filial)
{
printf(" _____________________________________\n");
printf(" FILIAL DE NUMERO: %d \n",i);
printf(" Por favor digite o codigo da filial %d .\n ",i);
scanf("%d",&codigo);
printf("\n Por favor digite a cidade em que esta localizada a filial.\n");
scanf("%s",&cidade);
printf("\n Por favor digite o valor faturado pela filial.\n");
scanf("%f",&faturado);

if(faturado>maior)
{ maior=faturado;
mcodigo=codigo;
strcpy (mcidade,cidade);
}
i++;
}
printf(" \n______________________________________________________________________________\n");
printf(" \n A filial de codigo %d da cidade de %s tem o maior valor faturado (%0.1f).\n",mcodigo,mcidade,maior);
printf(" ______________________________________________________________________________\n\n");
system("pause");
return 0;

}


5) Resposta:

#include
#include
#include

int main (void)
{
int i,encerrar;
float rendimento,aliquota,valordeduzir,impostorenda;
char nome[10];

i=1;
while(i<=100)
{ printf("__________________________________________________\n");
printf(" Por favor gidite o nome de um funcionario.\n");
scanf("%s",&nome);
printf("\n Por favor digite o rendimento deste funcionario. \n");
scanf("%f",&rendimento);

if(rendimento<=900.00)
{aliquota=0;
valordeduzir=0;
}

if((rendimento>900.00)&&(rendimento<=1800.00))
{aliquota=0.15;
valordeduzir=135.00;
}
if(rendimento>1800.00)
{aliquota=0.25;
valordeduzir=315;
}
impostorenda=(rendimento*aliquota)-valordeduzir;

printf("\n\n________________________________\n");
printf(" FUNCIONARIO: %s \n",nome);
printf(" IMPOSTO DEVIDO: %0.2f \n",impostorenda);
printf("________________________________\n\n");

printf(" Caso deseje encerrar digite 1, caso ao contrario digite 2.\n");
scanf("%d",&encerrar);
if(encerrar==1)
{i=1000;}

i++;
}
system("pause");
return 0;

}


6) Resposta:

#include
#include
#include

int main (void)
{
int empregados,i,carrosvendidos;
float vendas,salario,comissao,totalvendido,salariofinal[50];
char nome[50][20];

printf(" 1.6- Companhia de carros\n\n");
printf(" Digite quandos empregados a compahia possui para se calcular o salario total de cada um.\n ");
scanf("%d",&empregados);

i=1;
while(i<=empregados)
{ printf("---------------------------------------------\n ");
printf("VENDEDOR %d \n",i);
printf(" Por favor digite o nome do vendedor.\n ");
scanf("%s",&nome[i]);
printf(" Por favor digite o numero de carros vendidos.\n ");
scanf("%d",&carrosvendidos);
printf(" Por favor digite o valor total de vendas.\n ");
scanf("%f",&vendas);

salario=800;
comissao=100*carrosvendidos;
totalvendido=vendas*0.1;
salariofinal[i]=salario+comissao+totalvendido;

i++;
}
printf("_________________________________________\n");
printf(" VENDEDOR SALARIO\n\n");
for(i=1;i<=empregados;i++)
{ printf("%15s %20.2f \n",nome[i],salariofinal[i]);
}
printf("_________________________________________\n\n");
system("pause");
return 0;
}

Correção de Exercício - Condição e repetição II



Correção

1) reposta:

#include
#include

int main (void)
{
int i,N1[2],maior=-1;

printf(" 2.1- Por favor digite 3 numeros para verificar qual dos mesmos e o maior.\n");
scanf("%d%d%d",&N1[0],&N1[1],&N1[2]);

for(i=0;i<=2;i++) { if(N1[i]>maior)
{maior=N1[i];
}
}

printf("\n O maior valor digitado foi %d.\n\n",maior);

system("pause");
return 0;
}


2) Resposta:

#include
#include

int main (void)
{
int numero,resto,continuar,i;
printf(" 2.2 ");

for(i=1;i<=100;i++) { printf("\n\n Por favor digite um numero inteiro para verificar se o mesmo e par ou impar.\n "); scanf("%d",&numero); resto=numero%2;// Para um numero ser par o resto de uma divisao por 2 deve ser igual a 0 if(resto==0) { printf(" O numero %d e PAR. \n\n",numero); } else { printf(" O numero %d e IMPAR. \n\n",numero); } printf(" Para encerrar digite 1 caso ao contrario digite 2.\n"); scanf("%d",&continuar); if(continuar==1) { i=100; } } system("pause"); return 0; }


3) Resposta:
#include
#include

int main (void)
{
int a,b,resultado;

printf(" 2.3 VAMOS FAZER O COMPUTADOR CALCULAR!!! \n");
printf(" Digite 2 valores para a e b,respectivamente, para se aplicar na seguinte expressao:R=a+(b*b)+2*a. \n");
scanf("%d%d",&a,&b);
resultado=a+(b*b)+(2*a);
printf(" VALOR DE A=%d, VALOR DE B=%d, RESULTADO=%d \n\n",a,b,resultado);



system("pause");
return 0;
}


4) Resoposta:

#include
#include

int main (void)
{
int i=1,X,Y,A,sequencia=1;
printf(" 2.4- Por favor digite 2 numeros inteiros correspondentes as variaveis X e Y respectivamente.\n");
printf(" Sendo que Y coresponde ao numero de termos de uma sequencia.\n");
scanf(" %d%d",&X,&Y);

i=1;
while
{ A=3
Y=X*A
A+=2;

sequencia=sequencia*X;
}

system("pause");
return 0;
}


5) Resposta:

#include
#include

int main (void)
{
int i=1,A,B;
float soma=0;
printf(" 2.5- Sequencia= \n");

soma=0;
A=2;
for(i=1;i<=50;i++) { B=A*A; soma=soma+(A/B); printf("%d/%d \n",A,B); A+=2; } printf(" = %f \n",soma); system("pause"); return 0;

}








Lista de Exercícios – Condição e Repetição II

Exercicío

1. Implemente um programa, utilizando a Linguagem C, que leia três números inteiros e ache o maior entre os valores lidos. Escreva na tela o maior número lido.
2. Implemente um programa, utilizando a Linguagem C, que leia um número inteiro e verifique se ele á par ou ímpar. Escreva na tela o número lido e o resultado (par ou ímpar).
3. Implementar um programa, utilizando a Linguagem C, que leia os valores das variáveis a e b (números reais), calcule o resultado da expressão, apresentada abaixo, e escreva o resultado final.

Resultado = a + (b * b ) + 2 * a
4. Implemente um programa, utilizando a linguagem C, que leia dois valores inteiros X e Y e calcule a seguinte seqüência:
5. Elabore um programa que solicite ao usuário três números inteiros a, b e c, onde a é, obrigatóriamente, maior que 1. Seu programa deve somar todos os inteiros entre b e c que sejam divisíveis por a.

Lista de Exercícios – Condição e Repetição I

Exercicío

1. Fazer um programa que calcule e exiba na tela o salário benefício de cada casal. O programa termina quando código do casal for igual a -1. Fazer crítica no número de filhos permitindo apenas números positivos.

2. Fazer um programa que mostre na tela uma tabela dos quadrados e dos cubos dos números no intervalo de 1 a 20. Exibir também quais destes números são múltiplos de 5.

3. Dados: a quantidade e o preço unitário de 5 produtos, desenvolver um programa que calcule e exiba o total de cada produto = quantidade * preço unitário e o total geral da nota = somatória de todos os totais. Fazer crítica onde necessário. O programa deverá exibir na tela o seguinte formato:

QUANTIDADE PREÇO UNITÁRIO TOTAL
____________________________________________________________________
999 9999.99 9999.99
999 9999.99 9999.99
.. .... .....
____________________________________________________________________
TOTAL GERAL 99999.99

4. Uma empresa tem várias filiais espalhadas pelo Brasil. Para cada filial são mantidas as seguintes informações: código da filial, cidade e valor faturado. Fazer um programa que calcule e exiba na tela o código e a cidade da filial que tem o maior valor faturado. O programa termina quando código da filial for igual a zero. Fazer crítica onde necessário.
OBS: Supor que não existem faturamentos iguais.

5. Dados: o nome e o rendimento de um funcionário de uma empresa calcular o imposto de renda devido sabendo-se que imposto de renda = rendimento * alíquota - valor a deduzir e considerando a tabela abaixo:

Rendimento Alíquota Valor a Deduzir
até 900.00 0 0
acima de 900.00 até 1800.00 0.15 135.00
acima de 1800.00 0.25 315.00

6. Uma companhia de carros usados paga a seus empregados uma salário de R$800.00 por mês mais uma comissão de R$100.00 por carro vendido e mais 1% do valor total da venda. Todo mês é feita a entrada dos dados para cada vendedor contendo: o nome, o número de carros vendidos e o valor total das vedas. Desenvolver um programa para calcular e mostrar o salário de cada vendedor. Repetir o processo para 10 funcionários.

sábado, 29 de novembro de 2008

Lista de Exercícios IV - Funções


Exercício

1. Escreva uma função que receba como parâmetros um número real e um número inteiro e retorne o valor do real elevado ao inteiro.

2. Escreva um procedimento que receba como parâmetros três vetores de 10 elementos e altere o conteúdo do terceiro vetor, atribuindo-lhe o valor da soma dos outros dois.

3. Escreva um programa que leia do teclado dois vetores de 10 elementos e, utilizando o procedimento do exercício anterior, escreva na tela o valor da soma entre eles.


4. Escreva uma função que receba como parâmetro uma matriz bidimensional 5x5 e retorne o valor da soma dos elementos da diagonal principal.

5. Escreva um procedimento que receba como parâmetros uma matriz bidimensional 5x5 e um vetor de 5 elementos e armazene no vetor os elementos da diagonal principal da matriz.

6. Escreva um procedimento que receba como parâmetros um vetor de 5 elementos e um número real, e altere o conteúdo do vetor, dividindo seus elementos pelo número real.

7. Escreva um programa que leia do teclado uma matriz bidimensional 5x5 e, utilizando a função do exercício 4 e os procedimentos dos exercícios 5 e 6, mostre na tela os valores dos elementos da diagonal principal divididos pelo valor da soma da diagonal.

8. Escreva um procedimento que receba como parâmetros um vetor de reais e um inteiro que contem a quantidade de elementos do vetor, e altere o conteúdo do vetor, colocando seus elementos em ordem ascendente.


9). Escreva uma função que recebe um número inteiro e retorna TRUE se ele for par, e FALSE se ele for impar.

10. Escreva um programa que leia uma sequencia de 20 números inteiros e, utilizando a função do exercício anterior, mostre na tela quantos dos valores lidos eram pares.

11. Escreva um procedimento que receba uma string e converta os seus caracteres minúsculos em maiúsculos.


12. Escreva uma função que receba duas strings e, utilizando o procedimento do exercício anterior, retorne TRUE caso elas contenham a mesma palavra (independentemente de terem sido digitadas em maiúsculo ou minúsculo), e FALSE caso contrário.

13. Escreva um programa que solicite do usuário que digite nomes de alunos para formar uma relação de 20 nomes e, à medida em que eles vão sendo digitados, utilizando a função do exercício anterior, informe caso o nome já esteja na relação.

Lista de Exercícios III - Funções

Exercício
1. Escreva uma função que receba como parâmetros um número real e um número inteiro e retorne o valor do real elevado ao inteiro.
2. Escreva uma função que recebe um número inteiro e retorna TRUE se ele for par, e FALSE se ele for impar.
3. Escreva um programa que leia uma seqüência de 20 números inteiros e, desenvolva uma função que mostre na tela quantos dos valores lidos eram pares.
4. Desenvolver uma função que calcule a soma de uma progressão aritmética de n termos, sendo lidos o primeiro termo e a razão
5. Um número inteiro positivo é triangular se é produto de três números naturais consecutivos. Implementar uma função para verificar se um número inteiro positivo é triangular.
6. Implemente uma função iterativa para imprimir os n primeiros termos da seqüência de Fibonacci, que é dada pela seguinte fórmula:
F0= 0
F1= 1
Fn= Fn-2+Fn-1
7. Implemente um algoritmo que leia um número inteiro X. Crie uma função para determinar se o número lido é primo ou não. O protótipo da função deve ser int Primo ( int X ), onde a função retorna o valor 1 se o número X for primo e o valor 0 se o número X não for primo. (OBS. Um número é primo quando só é divisível por 1 e por ele mesmo.)

Lista de Exercícios II - Funções

Exercicio
1. Implemente um programa, utilizando Linguagem C, que leia três números reais. Crie uma função que determine se os três números lidos formam um triângulo ou não. A função deve ter o seguinte protótipo int Triangulo ( float lado1, float lado2, float lado3 ), onde o valor de retorno tem o seguinte significado:
· 0: não forma triângulo;
· 1: triângulo escaleno;
· 2: triângulo isósceles;
· 3: triângulo equilátero.
2. Implemente um programa, utilizando a Linguagem C, que leia um VetorA de N números reais, sendo que N < = a 100 e um número real K e construa e imprima outro VetorB, cujos elementos são os respectivos elementos de VetorA multiplicados por K. Exemplo: VetorA = {1, 2, 3}, K = 3, VetorB = {3, 6, 9}.
3. Implemente um programa, utilizando Linguagem C, que leia um número inteiro X. Crie uma função para determinar se o número lido é primo ou não. O protótipo da função deve ser int Primo ( int X ), onde a função retorna o valor 1 se o número X for primo e o valor 0 se o número X não for primo. (OBS. Um número é primo quando só é divisível por 1 e por ele mesmo.)
4. Implemente um programa, utilizando Linguagem C, que leia uma matriz de 5 linhas e 5 colunas de números inteiros. Crie uma função para trocar todos os elementos da diagonal principal por um valor Y, digitado pelo usuário.
5. Implemente um programa, utilizando Linguagem C, que leia dois vetores, Vetor A e Vetor B, de 100 números reais cada um. Monte um menu para que o usuário escolha uma das opções abaixo:

1. Calcular o MAIOR elemento do Vetor A;
2. Calcular o MENOR elemento do Vetor B;
3. Calcular a SOMA e a MÉDIA dos elementos do Vetor A;
4. Calcular a SOMA e a MÉDIA dos elementos do Vetor B;
5. Montar o Vetor C, que é a soma dos vetores A e B e escrever os elementos do Vetor C;
6. Escrever os elementos do Vetor A;
7. Escrever os elementos do Vetor B;
8. SAIR do Programa.
A leitura dos elementos dos vetores A e B deverá ser realizada por uma função chamada LerVetor ( ).

O programa só termina quando o usuário escolher a opção SAIR.

O programa deverá utilizar os conceitos de função e passagem de parâmetro. Deverão ser implementadas 7 funções: uma função para ler os elementos de um vetor, uma função para calcular o maior elemento de um vetor, uma função para calcular o menor elemento do um vetor, uma função para calcular a soma dos elementos de um vetor, uma função para calcular a media dos elementos de um vetor, uma função para somar dois vetores e uma função para escrever os elementos do vetor.

O comando SHITCH... CASE deverá ser utilizado, obrigatoriamente, para tratar a escolha do usuário.
6. Implemente um programa, utilizando a Linguagem C, que leia dois números inteiros a e b, e chame uma função void Troca ( int *a, Int *b ) que troque os valores de a e b.

Lista de Exercícios I - Funções


Exercício
1. Faça uma função que recebe por parâmetro o raio de uma esfera e calcula o seu volume (v = 4/3 .R3).
2. Escreva uma função que recebe as 3 notas de um aluno por parâmetro e uma letra. Se a letra for A a função calcula a média aritmética das notas do aluno, se for P, a sua média ponderada (pesos: 5, 3 e 2) e se for H, a sua média harmônica. A média calculada também deve retornar por parâmetro.
3. Faça uma função que recebe por parâmetro um valor inteiro e positivo e retorna o valor lógico Verdadeiro caso o valor seja primo e Falso em caso contrário.
4. Faça uma função que recebe por parâmetro os valores necessário para o cálculo da fórmula de baskara e retorna, também por parâmetro, as suas raízes, caso seja possível calcular.
5. . Faça uma função que recebe por parâmetro o tempo de duração de uma fábrica expressa em segundos e retorna também por parâmetro esse tempo em horas, minutos e segundos.
6. . Faça uma função que recebe a idade de uma pessoa em anos, meses e dias e retorna essa idade expressa em dias.
7. Faça uma função que verifique se um valor é perfeito ou não. Um valor é dito perfeito quando ele é igual a soma dos seus divisores excetuando ele próprio. (Ex: 6 é perfeito, 6 = 1 + 2 + 3, que são seus divisores). A função deve retornar um valor booleano.
8. Faça uma função que recebe um valor inteiro e verifica se o valor é positivo ou negativo. A função deve retornar um valor booleano.
9. . Faça uma função que recebe um valor inteiro e verifica se o valor é par ou ímpar. A função deve retornar um valor booleano.
10. faça uma função que recebe, por parâmetro, a altura (alt) e o sexo de uma pessoa e retorna o seu peso ideal. Para homens, calcular o peso ideal usando a fórmula peso ideal = 72.7 x alt - 58 e ,para mulheres, peso ideal = 62.1 x alt - 44.7.
11. Faça uma função que recebe 3 valores inteiros por parâmetro e retorna-os ordenados em ordem crescente.
12. Faça uma função que recebe, por parâmetro, a hora de inicio e a hora de término de um jogo, ambas subdivididas em 2 valores distintos: horas e minutos. A função deve retornar, também por parâmetro, a duração do jogo em horas e minutos, considerando que o tempo máximo de duração de um jogo é de 24 horas e que o jogo pode começar em um dia e terminar no outro

13. Escreva uma função que recebes 3 valores reais X, Y e Z e que verifique se esses valores podem ser os comprimentos dos lados de um triângulo e, neste caso, retornar qual o tipo de triângulo formado. Para que X, Y e Z formem um triângulo é necessário que a seguinte propriedade seja satisfeita: o comprimento de cada lado de um triângulo é menor do que a soma do comprimento dos outros dois lados. A função deve identificar o tipo de triângulo formado observando as seguintes definições:


Triângulo Equilátero: os comprimentos dos 3 lados são iguais.

Triângulo Isósceles: os comprimentos de 2 lados são iguais.
Triângulo Escaleno: os comprimentos dos 3 lados são diferentes.

14. A prefeitura de uma cidade fez uma pesquisa entre os seus habitantes, coletando dados sobre o salário e número de filhos. Faça uma função que leia esses dados para um número não determinado de pessoas e retorne a média de salário da população, a média do número de filhos, o maior salário e o percentual de pessoas com salário até R$350,00.

15. Faça uma função que leia um número não determinado de valores positivos e retorna a média aritmética dos mesmos.

16. Faça uma função que receba um valor inteiro e positivo e calcula o seu fatorial.

17. Faça uma função que lê 50 valores inteiros e retorna o maior e o menor deles.

18. Faça uma função que recebe, por parâmetro, um valor N e calcula e escreve a taboada de 1 até N. Mostre a taboada na forma:

19. Faça uma função que recebe, por parâmetro, um valor inteiro e positivo e retorna o número de divisores desse valor.

20. Escreva uma função que recebe, por parâmetro, um valor inteiro e positivo e retorna o somatório desse valor.

21. Escreva uma função que recebe por parâmetro um valor inteiro e positivo N e retorna o valor de S.
S = 1 + ½ + 1/3 + ¼ + 1/5 + 1/N.

22. Escreva uma função que recebe por parâmetro um valor inteiro e positivo N e retorna o valor de S.
S = 1 + 1/1! + ½! + 1/3! + 1 /N!

23. Escreva uma função que recebe por parâmetro um valor inteiro e positivo N e retorna o valor de S.
S = 2/4 + 5/5 + 10/6 + 17/7 + 26/8 + ... +(n2+1)/(n+3)

24. Escreva uma função que calcule o valor do co-seno de x através de 20 termos da série seguinte:
co-seno(x) = 1 - x2 + x4 - x6 + ....
2! 4! 6!

25. Escreva uma função que recebe, por parâmetro, dois valores X e Z e calcula e retorna Xz . (sem utilizar funcoes ou operadores de potencia prontos)

Lista de Exercicío – Vetores e Matrizes

Exercicio
1. Faça um programa que leia uma string qualquer e converta os caracteres lidos em letras maiúsculas e ou minúsculas invertendo a caixa delas. Exibir esta string convertida.
2. Desenvolver um programa que leia duas strings diferentes (fazer crítica) e uma linha de texto que deverá conter no máximo 50 caracteres (fazer crítica). Desenvolver um programa que resolva os seguintes ítens:
a) Qual a string de maior tamanho;
b) Copiar a string de menor tamanho na string de maior tamanho;
c) Substituir todos os espaços em branco da linha de texto por ‘*’;
d) Exibir o conteúdo de cada uma das variáveis utilizadas pelo programa.
3. Desenvolver uma programa que leia uma string qualquer e exiba o conteúdo desta string na ordem inversa.
R: /* Autor: Adriano Letta Bastos
Data: 25/08/08
Lista: 3
4. Faça um programa que:
a) leia dois vetores (matriz unidimensional) numéricos de 10 elementos cada;
b) intercale os elementos dos vetores em um terceiro vetor de 20 elementos.
c) exiba o novo vetor.
5. Faça um programa que:
a) leia os números da primeira linha de uma matriz 5x5
b) determine o valor dos demais elementos desta matriz, sabendo que os elementos das demais linhas consistem no resultado da multiplicação de cada elemento da linha anterior pelo valor 2;
c) Exiba a matriz criada.
6. Dada um matriz bidimensional contendo 4 notas de 10 alunos, elaborar um programa que calcule e exiba uma outra matriz unidimensional ( um vetor) que deverá conter a média aritmética das 4 notas de cada aluno.
7. Dados dois vetores um contendo o nome de 5 países e o outro a capital desses países, elaborar um programa que dado o nome do um país verificar se ele pertence ao vetor e em caso afirmativo exibir o nome da sua capital.
8. Implemente um programa, utilizando a Linguagem C, que leia um VetorA de N números reais, sendo que N < = a 100 e um número real K e construa e imprima outro VetorB, cujos elementos são os respectivos elementos de VetorA multiplicados por K. Exemplo: VetorA = {1, 2, 3}, K = 3, VetorB = {3, 6, 9}.
9. Implemente um programa, utilizando a Linguagem C, que leia 50 valores reias e armazene-os em um vetor. Calcule a soma e a média dos valores lidos, e o maior e o menor valor lido.
10. Implemente um programa, utilizando a Linguagem C, que leia 30 nomes e sobrenomes de pessoas. Os nomes deverão ser armazenados na variável Nome e o sobrenome na variável Sobrenome. A cada nome e sobrenome lido, verifique se as palavras possuem o mesmo tamanho.
· Se o nome e o sobrenome possuirem o mesmo tamanho, concatene as palavras e escreva mensagem mostrando o nome completo;
· Se o nome e o sobrenome possuirem tamanhos diferentes, escreva mensagem mostrando que <> e <> não possuem o mesmo tamanho.
11. Implemente um programa, utilizando a Linguagem C, que leia uma MatrizA de 7 linhas e 5 colunas, de números inteiros. Calcule a soma dos elementos de cada linha e a soma dos elementos de cada coluna. Monte a MatrizB e e escreva seus elementos, sendo que MatrizB é transposta a MatrizA.
12. Leia uma matriz quadrada 10X10, de números inteiros. Verificar quantos números da diagonal principal são ímpares, escrever quantos são ímpares e escrever, também, a soma e a média desses elementos.
13. Implemente um programa, utilizando a Linguagem C, que leia dois vetores de 1000 números reais e monte um terceiro vetor, também de 1000 números reias, que é a soma dos dois vetores lidos. (OBS. Utilize um único comando de repetição)
14. Implemente um programa, utilizando a Linguagem C, que leia uma matriz de 10 linhas e 5 colunas de números inteiros, adicione um valor X a todos os números divisíveis por 10, escreva a matriz com os novos elementos, indicando o endereço de memória em que estão armazenados cada número da matriz.
15. Implemente um programa, utilizando a Linguagem C, para ler um vetor de 200 elementos inteiros e somar “N” a todos os elementos pares do vetor.
16. Faça a implementação de um programa, utilizando a Linguagem C, para ler três palavras. Converta as palavras para serem escritas em letra maiúsculas (pesquise a função UPPER da biblioteca string.h). Compare o tamanho das palavras. Coloque as duas palavras de tamanho menor, concatenadas, na variável MENOR. Escreva o conteúdo da variável MENOR e por quais palavras são formadas.
17. Implemente um programa, utilizando a Linguagem C, que leia uma matriz quadrada 5 x 5, imprima os elementos da diagonal principal bem como a soma e a média destes elementos.
18. Implemente um programa, utilizando a Linguagem C, que leia uma matriz 10 x 5, calcule e imprima a soma dos elementos pares de cada linha e a soma dos elementos ímpares de cada coluna.
19. Implemente um programa, utilizando a Linguagem C, que leia 2 matrizes A e B de ordem 3 x 3 e 3 x 3 respectivamente. Calcule e imprima a matriz C que é a soma das matrizes.
20. Implemente um programa que declare uma matriz quadrada de 10 linhas por 10 colunas e verifique se a matriz é simétrica com relação à diagonal principal. A matriz simétrica é aquela em que todos os elementos A( i , j) = A( j , i) para quaisquer valores de i e j. Assim, A[2,1] deverá ser igual a A[1,2], e A[3,5] deverá ser igual a A[5,3] e assim por diante. Imprimir mensagem “Matriz Simétrica” ou “Matriz não Simétrica”.

Lista de Exercicíos - Ponteiros

Exercicio
1. Desenvolver um programa que leia um vetor de números inteiros contendo 10 elementos e exiba na tela todos os números armazenados nas posições pares do vetor. Usar aritmética de ponteiros.
2. Escreva um programa utilizando ponteiros que inicialise um vetor de 5 elementos com zeros e depois altere o conteúdo do vetor com valores de 2.5 em 2.5 partindo do número 10.
3. Desenvolver um programa que leia uma string qualquer e demostre quais foram as vogais encontradas na string. Usar aritmética de ponteiros.
4. Implemente um programa, utilizando a Linguagem C, que leia 3 números inteiros. Some uma unidade ao maior número lido através de apontadores e escreva seu valor e seu endereço de memória. Subtraia uma unidade do menor número lido através de apontadores e escreva seu valor e seu endereço de memória. Escreva o número de valor intermediário e seu endereço de memória utilizando apontador.

Lista de Exercicios - Estruturas

Exercicio
1. Crie uma estrutura para descrever restaurantes. Os membros dessa estrutura devem armazenar: o nome, o endereço, preço da comida por kilo. Crie uma matriz de 10 restaurantes e calcule e exiba a média de preço da comida por kilo e liste na tela quais restaurantes tem o preço da comida menor ou igual a média.
2. Definir uma estrutura para armazenar uma coleção de CDs. Os membros dessa estrutura devem conter: código do CD, Nome do Conjunto e gênero da música (R-rock, P-popular, S-samba/pagode e O-outras). Desenvolver um programa que permita ao usuário escolher um gênero de música e visualizar na tela todos os CDs do gênero escolhido armazenados na estrutura.O tamanho da estrutura poderá ser definido pelo programador.
3. Desenvolva um programa que crie uma união que leia uma string de caracteres e converta em um número inteiro. { função atoi(s) - arquivo de cabeçalho stdlib.h }
4. Crie uma estrutura para armazenar dados de fucionários: o nome e o ano de ingresso em uma empresa. Desenvolver um programa que calcule e exiba o nome e o tempo de serviço de cada funcionário cadastrado e o nome do funcionário mais antigo da empresa considerando que a empresa tem 15 funcionários. (Utilizar união e estrutura).
5. Escrever um algorítmo para ler 100 profissões (codigo e nome). Uma vez cadastradas as profissões, este algorítmo devera, dado um codigo exibir o nome da profissão correspondente. Usar registro. Usar uma função que passa como parâmetro o código e retorna o nome correspondente, se encontrar.
6. Escrever um algorítmo para ler 100 profissionais (codigo, nome, data de nascimento (dia, mês e ano), idade e altura). Uma vez cadastrados, este algorítmo devera, encontrar e imprimir o profissinal mais idoso e o mais novo, o mais alto e o mais baixo e a data de nascimento deles. Usar tipos. Usar técnicas de modularização.
7. Escrever um algorítmo para “manter em memória” as informações dos clientes (codigo, nome, endereco (rua, num, bairro e cep), idade, peso, altura, fone ). Uma vez cadastradas, as informações podem: ser consultada; sofrer alterações; e até mesmo serem excluídas. Usar tipos. Usar técnicas de modularização

8. Implementar um algoritmo capaz de armazenar dados sobre 50 pessoas inscritas num concurso de beleza, como nome, idade, medidas físicas, etc. Dica: use registros, montando uma estrutura para armazenar os dados. Escreva funções e procedimentos para:
pesquisar a existência de alguém, dado seu nome;
incluir os dados de uma candidata;
imprimir o conjunto.

9. Implementar um algoritmo capaz de controlar os dados de veículos em um estacionamento de andares. Cada veículo é identificado por um número-chave, pela placa e pelo box (número e andar) onde o veículo estará estacionado.

Lista de Exercícios – Condição e Repetição

Exercicio

1. Implemente um programa, utilizando a Linguagem C, que leia três números inteiros e ache o maior entre os valores lidos. Escreva na tela o maior número lido.

2. Implemente um programa, utilizando a Linguagem C, que leia um número inteiro e verifique se ele á par ou ímpar. Escreva na tela o número lido e o resultado (par ou ímpar).

3. Implementar um programa, utilizando a Linguagem C, que leia os valores das variáveis a e b (números reais), calcule o resultado da expressão, apresentada abaixo, e escreva o resultado final.

4. Implemente um programa, utilizando a linguagem C, que leia dois valores inteiros X e Y e calcule a seguinte seqüência:

Sequencia = X + 3X - 5X + 7X - ... , sendo que a seqüência terá Y termos.

Termo 1 = X Termo 2 = 3X Termo 3 = 5X etc.

5. Elabore um programa que solicite ao usuário três números inteiros a, b e c, onde a é, obrigatóriamente, maior que 1. Seu programa deve somar todos os inteiros entre b e c que sejam divisíveis por a.

sexta-feira, 28 de novembro de 2008

Exercíos - Estruturas

EXERCÍCIOS - "Estruturas"

1. Crie uma estrutura para descrever restaurantes. Os membros dessa estrutura devem armazenar: o nome, o endereço, preço da comida por kilo. Crie uma matriz de 10 restaurantes e calcule e exiba a média de preço da comida por kilo e liste na tela quais restaurantes tem o preço da comida menor ou igual a média.

2. Definir uma estrutura para armazenar uma coleção de CDs. Os membros dessa estrutura devem conter: código do CD, Nome do Conjunto e gênero da música (R-rock, P-popular, S-samba/pagode e O-outras). Desenvolver um programa que permita ao usuário escolher um gênero de música e visualizar na tela todos os CDs do gênero escolhido armazenados na estrutura.O tamanho da estrutura poderá ser definido pelo programador.

3. Desenvolva um programa que crie uma união que leia uma string de caracteres e converta em um número inteiro. { função atoi(s) - arquivo de cabeçalho stdlib.h }

4. Crie uma estrutura para armazenar dados de fucionários: o nome e o ano de ingresso em uma empresa. Desenvolver um programa que calcule e exiba o nome e o tempo de serviço de cada funcionário cadastrado e o nome do funcionário mais antigo da empresa considerando que a empresa tem 15 funcionários. (Utilizar união e estrutura).

5. Escrever um algorítmo para ler 100 profissões (codigo e nome). Uma vez cadastradas as profissões, este algorítmo devera, dado um codigo exibir o nome da profissão correspondente. Usar registro. Usar uma função que passa como parâmetro o código e retorna o nome correspondente, se encontrar.

6. Escrever um algorítmo para ler 100 profissionais (codigo, nome, data de nascimento (dia, mês e ano), idade e altura). Uma vez cadastrados, este algorítmo devera, encontrar e imprimir o profissinal mais idoso e o mais novo, o mais alto e o mais baixo e a data de nascimento deles. Usar tipos. Usar técnicas de modularização.

7. Escrever um algorítmo para “manter em memória” as informações dos clientes (codigo, nome, endereco (rua, num, bairro e cep), idade, peso, altura, fone ). Uma vez cadastradas, as informações podem: ser consultada; sofrer alterações; e até mesmo serem excluídas. Usar tipos. Usar técnicas de modularização.

8. Implementar um algoritmo capaz de armazenar dados sobre 50 pessoas inscritas num concurso de beleza, como nome, idade, medidas físicas, etc. Dica: use registros, montando uma estrutura para armazenar os dados. Escreva funções e procedimentos para:
* pesquisar a existência de alguém, dado seu nome;
* incluir os dados de uma candidata;
* imprimir o conjunto.

9. Implementar um algoritmo capaz de controlar os dados de veículos em um estacionamento de andares. Cada veículo é identificado por um número-chave, pela placa e pelo box (número e andar) onde o veículo estará estacionado.

Lista de Exercicio I:

Exercício I: "introdução"

  • A linguagem C é alto ou baixo nível? Qual a relação de C com outras linguagens de programação nesses termos?

  • Qual a filosofia da linguagem estruturada? Qual a vantagem? Exemplifique.
  • A linguagem C é compilada ou interpretada? Qual diferença? Qual é melhor?
  • O que é um compilador?
  • Como um programa C roda?
  • Como se compila um programa em C?
  • As letras maiúsculas e minúsculas são diferenciadas?
  • Quais os tipos de erros que existem em C e qual é o preferível ?

  • Exercicio II: "Comparação entre Linguagem"

    • screva um comando para imprimir "Olá mundo!"
    • Escreva um comando para imprimir o numero 101 de três formas diferentes.
    • Porque existem tão poucas palavras reservadas no C ?
    • O que é uma função? Cite alguma.
    • O que é uma biblioteca? Cite alguma e sua função.
    • Caso você seja programador em Basic e/ou Pascal, trace suas perspectivas em relação ao C citando seus diferenciais

    Exercicio III: "Comandos de Controle"

    • Escreva uma função que pegue dois números, ache a multiplicação entre eles e jogue na tela.

    • Escreva o mesmo programa, só que agora ele deve passar para uma variável do programa principal, que irá somar o resultado a 3 e dividir por 2.

    • Explique qual a diferença entre funções que retornam ou não valores.

    • Qual utilidade do tipo de uma função?

    • Qual tipo de função devemos utilizar quando não queremos retornar nada?
    Exercicio IV: "Printf"
    • Escreva uma função que recebe dois números inteiros e verifica se são iguais. Se forem iguais retorna "verdadeiro" (diferente de zero). Caso contrário retorna "falso" (zero).
    • Use a função do item 1) em uma programa que verifica se 10 é diferente de 5, sem alterar a função do item 1).
    • Faça um programa que some os 10 primeiros números naturais usando o comando for.
    • Faça o mesmo programa que no item 3), porém usando o comando while.
    • Faça um programa que pegue duas notas de um aluno e calcule a média deste aluno e a imprima na tela.
    • Faça um programa de matemática que pergunte somas simples e que fica em loop enquanto não acertar as perguntas, imprimindo na tela se a pessoa acertou ou não.
    Exercicio V:

    • Faça um programa que pegue duas notas de um aluno e calcule a média deste aluno e a imprima na tela.
    • Faça um programa de matemática que pergunte somas simples e que fica em loop enquanto não acertar as perguntas, imprimindo na tela se a pessoa acertou ou não.
    Exercicio VI: "Matriz"

    • Crie uma matriz 5x5 de inteiros . Acesse o elemento da linha 3 e coluna 4 e coloque numa variável chamada tmp. Ponha o valor 20 na primeira coluna e última linha.

    • Faça uma função que retorne o elemento de número 22.

    • Declare uma matriz de inteiros. A dimensão deve ser 20x40x80. Acesse o elemento de índice 2/5/10 e coloque-o numa variável chamada tmp2.

    • Faça uma função que retorne o elemento de número 1024.

    • Escreva uma função para ler um vetor de qualquer tipo e tamanho. Faça uma para imprimir também.

    • Faça uma outra função para procurar um elemento (tipo básico de dados) qualquer (a se passar posição de início de procura) e retornar a posição da primeira ocorrência.

    • Com a função acima, faça uma terceira que retorne o número de ocorrência de um elemento em vetor.

    • Escreva um programa que copie strings. O nome da função chama-se copia_string e deve receber a origem e destino. Por exemplo, copia_string(destino,origem).
    Exercicio VII: "Variavel"

  • O que é uma variável?

  • Indique como é declarado duas variáveis inteiras de nome w e z?

  • Quais das variáveis seguintes são inválidas: 3ant, %12, _vri, Ab_1v, 0abc

  • Qual diferença entre float e double?

  • Quais as possibilidade de declaração de variáveis em termos de locais em C?

  • Exercicio VII: "Função"
    • Escreva uma função que pegue dois números, ache a multiplicação entre eles e jogue na tela.

    • Escreva o mesmo programa, só que agora ele deve passar para uma variável do programa principal, que irá somar o resultado a 3 e dividir por 2.

    • Explique qual a diferença entre funções que retornam ou não valores.

    • Qual utilidade do tipo de uma função?

    • Qual tipo de função devemos utilizar quando não queremos retornar nada?
    Exercicio IX: "Verdadeiro ou falso"

    • Escreva uma função que recebe dois números inteiros e verifica se são iguais. Se forem iguais retorna "verdadeiro" (diferente de zero). Caso contrário retorna "falso" (zero).
    • Use a função do item 1) em uma programa que verifica se 10 é diferente de 5, sem alterar a função do item 1
    • Faça um programa que some os 10 primeiros números naturais usando o comando for.
    Exercicio X: "Matriz e ponteiro"

    • Escreva um programa que peça ao usuário um número que deve ser digitado do teclado. Guarde este número em uma variável. Depois faça um ponteiro apontar para a variável que guardou este número e imprima-o na tela, acessando este pela variável ponteiro.
    • Crie uma variável x do tipo caractere (char) e armazene nela um valor inicial. Crie agora uma variável ponteiro chamada ptr para apontar para x. Agora, note a diferença do ponteiro para o tipo imprimindo:
      printf("%d\n",x);
      printf("%p\n",ptr);
      Onde "%p" pede para imprimir o endereço de memória armazenado em ptr.
    • Tente usar um ponteiro como vetor sem usar a função malloc() e veja o que ocorre.

    Trabalhando com Arquivos

    Vamos falar agora propriamente dita da manipulação dos arquivos em C, leitura e escrita.

    Escrevendo em um arquivo

    Para escrevermos em um arquivo em C, utilizamos as funções fputc e putc. Eles escrevem na stream, um caracter por vez. O protótipo é idêntico:

    int fputc(int c, FILE *stream);

    As duas funções fazem exatamente a mesma coisa, só que uma, a putc(), deve ser implementada em termos de macro, para manter compatibilidade. As versões antigas utilizavam o putc(), e para manter tudo funcionando, em novas implementações se fez isso.

    Lendo um caracter de arquivo

    Igualmente, definido pelo padrão C ansi, temos as funções getc e fgetc. O protótipo é:

    int fgetc(FILE *stream);

    Igualmente a dupla fputc e putc, a putc é implementada como macro. Elas servem para ler caracteres da stream passada, que será o retorno da função. Caso chegue ao final do arquivo retornará EOF (End of File) ou erro.

    Também vale relembrar, que a função getchar() é equivalente a getc(stdin), ou seja, lê caracteres da entrada padrão. Já putchar(), é equivalente a putc(caracter, stdout), ou seja, escreve no dispositivo padrão de saída.

    As funções citadas fazem parte da stdio.h, e podem ser utilizadas de forma complementar, ou até com outras funções de streams. Essa é uma das características que tornam o C uma das linguagens mais versáteis e poderosas do mundo .

    Bem, agora falaremos de leitura de arquivos de forma mais geral, através de strings.

    Escrevendo em um arquivo linha a linha

    A função fputs() é igual a função putc, só que em vez de trabalhar caracter a caracter, ela trabalha linha a linha, geralmente uma situação de conforto para o programador. O protótipo dela segue:

    int fputs(const char *s, FILE *stream);

    Repare que passamos um ponteiro para char, onde passaremos a string (a linha) e especificamos qual stream estamos utilizando. Note que é idêntica a função puts, só que deixa especificar a stream, ao contrário da puts que utiliza stdin. protótipo: int puts(const char *s);

    Lendo arquivo linha a linha

    Você também, analogamente, pode ler arquivos linha a linha. Repare o protótipo da função:

    char *fgets(char *s, int size, FILE *stream);

    Ela retorna um ponteiro para string recebida, ela para até achar o fim da linha ou tiver alcançado o tamanho de size-1. Stream especifica de onde está sendo lido, e o retorno vai sempre para o ponteiro que está recebendo. Caso tenha sido encontrado o final de linha ou EOF, o \0 é armazenado depois do último caracter lido.

    Voltando no arquivo..

    Bem, sabemos que existe um descritor de arquivo, a tal estrutura do tipo FILE, definida no cabeçalho stdio.h. Bem, nesta descrição, quando é montada a estrutura em memória, existe um de seus campos que indica a posição onde o ponteiro está posicionado para leitura/escrita. É assim que fazemos para ler caracteres e escreve-los. Existe a função chamada fseek, que existe para reposicionar o indicador de posição do descritor de string. Isso mesmo, ela só muda para onde o ponteiro está direcionado. Você pode correr ele para o início do arquivo, final, ou uma posição definida por sua pessoa mesmo.

    O protótipo da função é: int fseek( FILE *stream, long offset, int whence);

    O que isso quer dizer? Bem, você passa qual stream está trabalhando, o descritor logicamente, passa quantos bytes deseja percorrer a partir de uma posição predeterminada. Ou seja, o campo whence, você passa onde que é a posição base para início de calculo, por exemplo, existem a possibilidade de passar as macros: SEEK_SET, SEEK_CUR e SEEK_END, que você posiciona no início do arquivo, posição corrente ou no final do arquivo. Aí você passa quantos bytes deseja trabalhar a partir dessa posição. O retorno da função é 0 caso tenha obtido sucesso e diferente caso não o tenha.

    Existem as funções ftell() (protótipo: long ftell( FILE *stream);), que retorna justamente onde está posicionado o indicador de posição da stream e a função rewind() (protótipo: void rewind( FILE *stream);) que volta ao início do arquivo, é como um (void)fseek(stream, 0L, SEEK_SET).

    Mantendo tudo sob controle

    Vamos relembrar: um arquivo em C é uma stream, um "fluxo" de dados. Como tudo em computação, uma stream possui um tamanho finito. Se efetuarmos diversas leituras nela, indo da primeira posição em frente, alcançaremos um ponto chamado EOF, que é o fim do arquivo (em inglês, End Of File). Deste ponto, só podemos retroceder; nem pense em ler mais alguma coisa do arquivo! E como sabemos que chegamos ao fim do arquivo? Simplesmente perguntando. Na biblioteca padrão temos a função feof que nos retorna se o arquivo já terminou. O protótipo dela é:

    int feof(FILE *stream)

    Ela retorna 0 se o arquivo não chegou ao fim ou 1 caso contrário (lembre que em C o valor inteiro que corresponde a uma afirmação falsa é 0 e uma afirmação verdadeira corresponde a um inteiro diferente de zero).

    Por exemplo, para determinar se chegamos ao final da stream apontada pela variável Cadastro (que já deverá ter sido aberta com fopen), podemos fazer o seguinte teste:

    if (feof(Cadastro))
    printf ("Fim do arquivo");

    Aqueles que são bons observadores, já devem ter notado que os exemplos dados na última aula já fazem uso desta função (propositalmente). Sugiro a todos que dêem mais uma olhada neles.

    Uma outra função que é útil para verificar como está uma stream é a ferror. Novamente, como tudo em computação, um acesso a uma stream pode ser efetuado com sucesso, ou pode falhar (pessimistas acham que a probabilidade de falhar é maior do que a de acertar). Para ter certeza de que eu não tenha resultados imprevistos na hora em que um acesso der errado, eu testo o indicador de erro da stream logo após tê-la acessado. Se for 0, não há erro; se for diferente de zero, "Houston, temos um problema". O protótipo de ferror é:

    int ferror(FILE *stream)

    Vamos dar uma olhada em um pedacinho de código só para fixarmos esta nova função. Neste exemplo, a stream apontada por Lista já deverá estar aberta, e Item é uma string:

    fgets(Item, 40, Lista);
    if (ferror(Lista)) {
    printf ("Apertem os cintos: ocorreu um erro no último acesso!");
    exit(1);
    }

    Note bem: o indicador de erro poderá mudar se for feito uma nova leitura ou escrita antes de testá-lo. Se quiser testar, teste logo após executar um acesso.

    Escreveu, não leu...

    Já notou que as funções fgets e fputs se parecem muito com as suas primas gets e puts, sendo que estas lêem do teclado e escrevem na tela e aquelas fazem o mesmo, só que relativamente a streams? Seria bom se nós tivéssemos algo do tipo printf e scanf para arquivos; e nós temos! Usando fprintf e fscanf nós fazemos o mesmo que já fazíamos na tela, mas agora faremos em streams. Veja como elas estão definidas nas bibliotecas padrão:

    fprintf (FILE *stream, char *formato, ...)

    fscanf (FILE *stream, char *formato, ...)

    Na prática, podemos usar estas duas funções que atuam em streams do mesmo modo como usamos suas primas, já velhas conhecidas nossas, mas acrescentando antes o ponteiro para a stream. Assim, se eu tinha um programa que lia do teclado dados digitados pelo usuário, posso fazer uma mudança para ler de um arquivo. De modo similar, isso também vale para a tela. Por exemplo, sejam dois arquivos apontados pelas variáveis Saída (aberto para escrita) e Dados (aberto para leitura):

    se eu tinha: scanf("%d",&numero);
    posso fazer: fscanf(Dados,"%d",&numero);

    se eu tinha: printf("Tenho %d unidades do produto: %s\n",quant,prod);
    posso fazer: fscanf(Saida,"Tenho %d unidades do produto: %s\n",quant,prod);

    Experimente usar isto nos programas que você já fez, só para praticar: ao invés de usar de scanf e printf, leia dados com fscanf de um arquivo e escreva-os em um outro arquivo com fprintf. O arquivo gerado poderá ser aberto inclusive em editores de texto, e você poderá ver o resultado. Mas ATENÇÃO: fprintf e fscanf devem ser aplicados a streams texto.

    Até agora, todas as funções que lêem e escrevem em um arquivo se referem a streams texto. É uma boa hora para se questionar a utilidade das tais streams binárias.

    Podemos querer ler e/ou escrever uma stream tendo controle total dos bytes dela, para, por exemplo, copiar fielmente um arquivo, sem alterar nada nele. Assim, abriremos o arquivo usando o já mencionado qualificador b. E para acessar os dados, teremos duas novas funções, fread e fwrite, definidas da seguinte forma:

    size_t fread(void *Buffer, size_t TamItem, size_t Cont, FILE *Fp)
    size_t fwrite(void *Buffer, size_t TamItem, size_t Cont, FILE *Fp)

    O tipo size_t é definido na biblioteca STDIO.H e, para simplificar, podemos dizer que eqüivale a um inteiro sem sinal (unsigned int). Lembre-se de que void* é um ponteiro qualquer, ou seja, um ponteiro sem tipo. Assim, eu posso usar um int*, char*, ...

    A função fread opera do seguinte modo: lê da stream apontada pela variável Fp tantos itens quantos forem determinados pela variável Cont (cada item tem o tamanho em bytes descrito em TamItem) e coloca os bytes lidos na região de memória apontada por Buffer. A função fwrite funciona de modo similar, porém gravando o que está na região de memória apontada por Buffer na stream Fp.

    As duas funções retornam o número de bytes efetivamente lidos ou escritos do arquivo, respectivamente.

    Para determinar o tamanho em bytes de um determinado tipo de dado que queremos ler ou gravar, é possível usar o operador sizeof. Como exemplo, podemos querer gravar na stream binária apontada pela variável Dados o valor da variável inteira X:

    fwrite(&X,sizeof(int),1,Dados);

    O tamanho de um inteiro é determinado por sizeof(int). Note que o número de bytes que foram efetivamente gravados, retornado pela função, pode ser desprezado (e geralmente o é).

    Seja a struct Pessoa definida por (lembra-se das aulas sobre struct?):

    struct Pessoa {
    char nome[40];
    int idade;
    };

    Definamos a variável Aluno do tipo struct Pessoa. Podemos ler um registro de um aluno de um arquivo com o comando:

    fread(&Aluno,sizeof(struct Pessoa),1,Dados);

    Operações com Strings

    Existem algumas funções da biblioteca padrão de C para manipular strings. Vamos a elas.

    strcmp compara duas strings e retorna se uma é maior que outra.

    resultado=strcmp(string1,string2);
    if(resultado==0) {
    printf("Duas strings são exatamente iguais!\n");
    else
    if(resultado>0) {
    printf("string1 é maior que string2!\n");
    else
    printf("string2 é maior que string1!\n");

    strlen retorna o comprimento de uma string em nº de caracteres.

    printf("Entre com seu nome: ");
    scanf("%s",nome);

    tamanho=strlen(nome);
    printf("Seu nome tem %d caracteres", tamanho);

    Existem inúmeras funções para manipulação de strings em C, das quais as mais usadas são: strcpy,strcmp,strlen,strcat.

    strcpy:

    Esta função serve para copiar uma string para outra em C. Os parâmetros desta função são a string fonte e a string destino, respectivamente. Exemplo:

    char *string_retorno;
    char string_fonte[] = "EXEMPLO DE MANIPULACAO DE STRINGS";
    char *string_destino;

    string_destino = (char *)malloc(80);

    string_retorno = strcpy(string_destino,string_fonte);

    printf("String Fonte = %s, String Retorno = %s",string_fonte,string_retorno);

    Após a execução deste pequeno trecho de programa, a saída para a tela deverá ser:

    String Fonte = EXEMPLO DE MANIPULACAO DE STRINGS, String Retorno = EXEMPLO DE MANIPULACAO DE STRINGS

    Neste exemplo, a string 'string_retorno' será um ponteiro para a variável string_destino. Esta string de retorno da função strcpy serve somente para verificar se a cópia das strings foi feita com sucesso, exemplo:

    if (strcpy(string_fonte,string_destino) == NULL)
    {
    printf("Erro ao copiar as strings\n");
    }

    strcmp:

    Esta função serve para comparar duas strings. Esta função retornará 0 (zero), se as strings forem iguais, e diferente de zero se as strings forem diferentes.

    Exemplo:
    char string1[]="STRING";
    char string2[]="STRING";
    char string3[]="sTRING";

    if (strcmp(string1,string2) == 0)
    {
    printf("As strings são iguais\n");
    }
    else
    {
    printf("As strings são diferentes\n");
    }

    if (strcmp(string1,string3) == 0)
    {
    printf("As strings são iguais\n");
    }
    else
    {
    printf("As strings são diferentes\n");
    }

    A saída deste pequeno trecho de programa deverá ser:

    As strings são iguais
    As strings são diferentes

    strlen:

    Esta função retorna o tamanho de uma string. O único parâmetro desta função é a string da qual você quer saber o tamanho. Neste exemplo, vamos resolver o problema que foi mostrado no início deste artigo:

    void on_btn_Ok_pressed (GtkButton *button, gpointer user_data)
    {
    char *texto;
    entry1 = GTK_ENTRY(lookup_widget((button),"entry1"));

    text1 = GTK_TEXT(lookup_widget((button),"box_Nome"));

    texto = (gtk_entry_get_text(entry1));
    /* gtk_text_insert(text1,NULL,NULL,NULL,texto, ????????????); */
    gtk_text_insert(text1,NULL,NULL,NULL,texto, strlen(texto));
    gtk_entry_set_text(entry1,"");

    }

    strcat:

    A função strcat faz é pegar a string fonte e concatenar no final da string destino. Exemplo:

    char *string_retorno;
    char string_final[] = "EXEMPLO DE MANIPULACAO ";
    char string_inicial[] = "DE STRINGS";
    string_retorno = strcat(string_final,string_inicial);

    printf("String Final = %s, String Inicial = %s, String Retorno = %s",string_final,string_inicial,string_retorno);

    Dessa forma a saída é: String Fonte1 = EXEMPLO DE MANIPULACAO, String Fonte2 = DE STRINGS, String Retorno = EXEMPLO DE MANIPULACAO


    Vetores, Matrizes, Ponteiros

    Vetores

    Vetores são variáveis que guardam mais de um valor. Estes valores são acessados através de índices. Estes índices sempre começam de zero. Exemplo:

    int teste[4]={ 5, 4, 3, 2 };

    Então a posição de índice zero do vetor teste contém o valor inteiro 5. Acessamos assim:
    printf("%d\n",teste[0]);
    Isto imprime na tela o número 5, que é o valor da posição zero do vetor teste.

    Para alterar um valor é a simples. Exemplo:

    int teste[2]={ 10, 20 };
    printf("%d\n",teste[1]);
    teste[1]=30;
    printf("%d\n",teste[1]);

    No primeiro printf o valor de teste[1] é 20, ele o imprime na tela. No segundo printf o valor de teste[1] é 30 (pois fizemos teste[1]=30), e o printf o imprime na tela.

    Matrizes

    Matrizes são vetores com mais de uma dimensão. Exemplo:

    int teste[5][10];

    Colocamos um valor (neste exemplo 20) na linha zero e coluna 5 assim:
    teste[0][5]=20;

    Para ler é a mesma coisa:
    printf("%d\n",teste[0][5]);
    Isto irá imprimir na tela o valor 20 que definimos acima.

    Ponteiros

    Ponteiros, como o próprio nome diz, é um tipo de variável que aponta para outra (de um tipo qualquer). Na verdade um ponteiro guarda o endereço de memória (local onde se encontra na memória) de uma variável.

    Vamos iniciar um exemplo simples para entendermos melhor. Imagine que tenho a seguinte variável:

    int teste=20;

    Sabemos que a variável teste é do tipo inteiro (int) e armazena o valor 20.

    Agora digamos que queremos uma ponteiro para a variável teste. Então criamos um ponteiro para apontar para uma variável do tipo inteira (ou seja, apontar para teste), assim:

    int teste=20;
    int *p;

    Nota: Um ponteiro é definido usando o asterisco (*) antes do nome da variável.

    Neste exemplo a variável p, por incrível que pareça, não é do tipo inteiro (int). A variável p é do tipo ponteiro, que aponta para uma variável do tipo inteiro (int).

    Agora façamos p apontar para a variável teste:

    int teste=20;
    int *p;

    p=&teste;

    Nota: O símbolo & indica o endereço de memória da variável.

    Fazendo p=&teste estamos dizendo que p irá armazenar o endereço de memória da variável teste. Ou seja, p não armazena o valor 20, mas sim o endereço de teste que, este sim, armazena o valor 20.

    Mas então como chegar ao valor 20 usando a variável p, já que este aponta para teste?

    Simples, basta fazer assim:

    int teste=20;
    int *p;

    p=&teste;
    printf("%d\n",*p);

    Nota: Para acessar o valor de uma variável apontada por um ponteiro, usa-se o asterisco (*) antes da variável ponteiro.

    Neste exemplo *p retorna 20, que é o valor de teste, variável o qual armazenamos seu endereço de memória em p. Logo o printf irá imprimir 20 na tela.

    Outro exemplo:

    char algo[5] = { 5, 4, 3, 2, 1 };
    char *c;

    c=&algo[2];

    Neste exemplo, colocamos em c o endereço do terceiro elemento de algo. Fazendo isso, dizemos automaticamente que c[0]=3, c[1]=2 e c[2]=1.

    Se tivéssemos feito c=&algo[3], então estaríamos fazendo c[0]=2 e c[1]=1.

    Quando fizemos:
    char algo[5];
    É a mesma coisa que:
    char *algo;
    Porém desta última maneira o tamanho de algo ainda não tem tamanho definido. Isto se faz com a função malloc() que veremos na próximas aulas.

    Nota: Nunca use um ponteiro como vetor a menos que você tenha definido seu tamanho. No Linux isto retornaria uma mensagem de segmentation fault pois estaria invadindo uma área de memória não reservada para o atual programa. Em outros sistemas operacionais isto é aceitável podendo travar o mesmo.

    Nota: Para matrizes de dimensão maior que um (ou seja, não vetor) não é válido dizer, por exemplo, que char teste[2][2] eqüivale à char **teste. Isto só vale para vetores.

    Outra explicação

    Se você ainda não entendeu como funcionam ponteiros imagine que variáveis são casas. As casas podem armazenar um valor, dependendo de seu tipo. Além de valores normais, uma casa destas pode armazenar um endereço de outra casa. Nesta outra casa você encontraria o valor desejado.

    Pode não estar claro aonde se utiliza ponteiros e o porque de usa-los. Entretanto acompanhe nossos artigos e você vai entender porque ponteiros são muito importantes e qual sua finalidade.