https://wiki.sj.ifsc.edu.br/api.php?action=feedcontributions&user=186.222.18.224&feedformat=atomMediaWiki do Campus São José - Contribuições do(a) usuário(a) [pt-br]2024-03-28T20:17:26ZContribuições do(a) usuário(a)MediaWiki 1.35.9https://wiki.sj.ifsc.edu.br/index.php?title=AULA_18_-_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=79102AULA 18 - Programação 1 - Engenharia2014-10-28T23:59:49Z<p>186.222.18.224: </p>
<hr />
<div>Exercícios Adicionais ponteiros<br />
<br />
1.Implementar um programa para ler dados para dentro das variáveis x e y e somar o conteúdo das mesmas colocando o resultado em x SEM<br />
referenciar estas variáveis no scanf ou na expressão de soma.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float x,y;<br />
}<br />
</syntaxhighlight><br />
<br />
2.Implementar uma função que compara duas strings passadas como parâmetro. A função retorna 0 se as strings forem iguais e 1 se diferentes.<br />
Usar ponteiros.<br />
<br />
3.Implementar uma função que recebe como parâmetro o endereço de duas variáveis float que contêm a parte real e imaginária de um número complexo no formato polar (ângulo em radianos). A função deve converter do formato polar retangular colocando a coordenada x no primeira variável cujo endereço foi fornecido como parâmetro e a coordenada y na segunda variável.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
void converte_polar_retang(float *parte1, float parte2)<br />
{<br />
}<br />
<br />
main()<br />
{<br />
float num1=1.5, num2=10.6;<br />
<br />
/*chamar a função aqui */<br />
<br />
/* imprimir os valores de num1 e num2 aqui */<br />
}<br />
</syntaxhighlight> <br />
<br />
4.Implemantar uma funçao que recebe como parâmetro o endereço de duas variáveis do tipo char e<br />
após a chamada da função os valores das variáveis devem estar maiúsculos(caso elas contenham letras minúsculas).<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
char alfa='a', beta='b';<br />
<br />
capitaliza(&alfa, &beta);<br />
<br />
/* aqui os valores de alfa e beta deverão ser A e B */<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
5.Implementar uma função que recebe uma string contendo uma cadeia de caracteres com dígitos numéricos e retorna o valor inteiro da string. Usar ponteiros.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int a_toi(char *p)<br />
{<br />
}<br />
<br />
main()<br />
{<br />
char *p="123";<br />
int x;<br />
<br />
x = a_toi(p);<br />
<br />
/* neste ponto x deve conter 123 */<br />
}<br />
</syntaxhighlight></div>186.222.18.224https://wiki.sj.ifsc.edu.br/index.php?title=AULA_18_-_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=79101AULA 18 - Programação 1 - Engenharia2014-10-28T23:59:27Z<p>186.222.18.224: Criou página com '{{collapse top | Aula dia 23/05/2014}} Exercícios Adicionais ponteiros 1.Implementar um programa para ler dados para dentro das variáveis x e y e somar o conteúdo das mesma...'</p>
<hr />
<div>{{collapse top | Aula dia 23/05/2014}}<br />
<br />
<br />
Exercícios Adicionais ponteiros<br />
<br />
1.Implementar um programa para ler dados para dentro das variáveis x e y e somar o conteúdo das mesmas colocando o resultado em x SEM<br />
referenciar estas variáveis no scanf ou na expressão de soma.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float x,y;<br />
}<br />
</syntaxhighlight><br />
<br />
2.Implementar uma função que compara duas strings passadas como parâmetro. A função retorna 0 se as strings forem iguais e 1 se diferentes.<br />
Usar ponteiros.<br />
<br />
3.Implementar uma função que recebe como parâmetro o endereço de duas variáveis float que contêm a parte real e imaginária de um número complexo no formato polar (ângulo em radianos). A função deve converter do formato polar retangular colocando a coordenada x no primeira variável cujo endereço foi fornecido como parâmetro e a coordenada y na segunda variável.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
void converte_polar_retang(float *parte1, float parte2)<br />
{<br />
}<br />
<br />
main()<br />
{<br />
float num1=1.5, num2=10.6;<br />
<br />
/*chamar a função aqui */<br />
<br />
/* imprimir os valores de num1 e num2 aqui */<br />
}<br />
</syntaxhighlight> <br />
<br />
4.Implemantar uma funçao que recebe como parâmetro o endereço de duas variáveis do tipo char e<br />
após a chamada da função os valores das variáveis devem estar maiúsculos(caso elas contenham letras minúsculas).<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
char alfa='a', beta='b';<br />
<br />
capitaliza(&alfa, &beta);<br />
<br />
/* aqui os valores de alfa e beta deverão ser A e B */<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
5.Implementar uma função que recebe uma string contendo uma cadeia de caracteres com dígitos numéricos e retorna o valor inteiro da string. Usar ponteiros.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int a_toi(char *p)<br />
{<br />
}<br />
<br />
main()<br />
{<br />
char *p="123";<br />
int x;<br />
<br />
x = a_toi(p);<br />
<br />
/* neste ponto x deve conter 123 */<br />
}<br />
</syntaxhighlight></div>186.222.18.224https://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2014-2_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=79100PRG1-2014-2 Programação 1 - Engenharia2014-10-28T23:59:13Z<p>186.222.18.224: </p>
<hr />
<div><blockquote style="background: #adff2f; border: 1px solid black; padding: 1em;"><br />
=Plano de Ensino=<br />
<br />
[http://wiki.sj.ifsc.edu.br/index.php/PRG1-EngTel_(Plano_de_Ensino) Plano de Ensino da Disciplina]<br />
<br />
</blockquote><br />
<br />
=Aulas=<br />
<br />
{{collapse top| AULA 1 - [[AULA 1 - Programação 1 - Engenharia | Dia 30/7/14 - Aula Inaugural]]}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top| AULA 2 - [[AULA 1 - Programação 1 - Engenharia | Dia 31/7/14 - Aula Inaugural (cont)]]}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top| AULA 3 - [[AULA 2 - Programação 1 - Engenharia | Dia 6/8/14 - Lógica de Programação: Expressões - Estruturas de Decisão]]}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top| AULA 4 - [[AULA 3 - Programação 1 - Engenharia | Dia 7/8/14 - Lógica de Programação: Estruturas de Repetição/Subprogramas]]}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top| AULA 5 - [[AULA 4 - Programação 1 - Engenharia | Dia 13/8/14 -Introdução a Programação C]]}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 - [[AULA 5 - Programação 1 - Engenharia | Dia 14/8/14 -Estruturas de Decisão]]}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7- [[AULA 6 - Programação 1 - Engenharia | Dia 20/8/14 -Estruturas de Repetição no C]]}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 - [[AULA 7 - Programação 1 - Engenharia | Dia 21/8/14 -Estruturas de Repetição no C]]}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 9 - [[AULA 8 - Programação 1 - Engenharia | Dia 27/8/14 -Funções no C]]}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 10 - [[Lista Exercícios 1 - Programação 1 - Engenharia | Dia 28/8/14]]}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 11 - Avaliação 1}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 12 - [[AULA 9 - Programação 1 - Engenharia | Dia 10/9/14 - Vetores no C]]}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 13 - [[AULA 10 - Programação 1 - Engenharia | Dia 11/9/14 - Vetores no C]]}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 14 - [[AULA 11 - Programação 1 - Engenharia | Dia 16/9/14 - Exeercícios]] }}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 15 - Dia 17/9/14 - Correção Avaliação I }}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 16 - [[AULA 12 - Programação 1 - Engenharia | Dia 24/9/14 - Arranjos Multidimensionais]] }}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 17 - Dia 25914 - Exercícios }}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 18 - [[AULA 13 - Programação 1 - Engenharia | Dia 1/10/14 - Estruturas ]] }}<br />
{{collapse bottom}}<br />
<br />
{{collapse top| AULA 19 - [[Exercícios AValiação II]]}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top| AULA 20}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top| AULA 21}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top| AULA 22 - [[AULA 14 - Programação 1 - Engenharia | Dia 15/10/14 - Exercícios ]] }}<br />
{{collapse bottom}}<br />
<br />
{{collapse top| AULA 23 [[AULA 15 - Programação 1 - Engenharia | Dia 16/10/14 - Exercícios ]] }}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 24}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 25 [[AULA 17 - Programação 1 - Engenharia | Dia 23/10/14 - Ponteiros ]] }}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 26 [[AULA 18 - Programação 1 - Engenharia | Dia 29/10/14 - Exercícios sobre ponteiros]]}}<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 27}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 28}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 29}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 30}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 31}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 32}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 33}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 34}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 35}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 36}}<br />
{{collapse bottom}}<br />
<br />
AVALIAÇÂO SEGUNDA TURMA<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct tipo_local{<br />
char rua[30];<br />
int numero;<br />
char cidade[30];<br />
char estado[3]; <br />
};<br />
<br />
struct tipo_jogo {<br />
int ganhadores_sena;<br />
int ganhadores_quina;<br />
float premio_sena;<br />
float premio_quina;<br />
struct tipo_local local;<br />
int resultado[6];<br />
} Jogos[5] = <br />
{<br />
{ 1, 5, 1200000, 500000, {"Rua Pedro da Silva", 30, "Florianopolis", "SC"}, {1,2,3,4,5,6}},<br />
{ 4, 10, 1500000, 100000, {"Rua Joao da Silva", 30, "Cruz Alta", "RS"},{10,20,33,44,54,6}}, <br />
{ 3, 20, 2000000, 300000, {"Rua Maria da Silva", 30, "Curitiba", "PR"}, {1,2,3,4,5,43}},<br />
{ 2, 50, 1300000, 600000, {"Rua Jose da Silva", 30, "Tijucas", "SC"}, {1,2,3,44,5,6}},<br />
{ 10, 30, 1800000, 550000, {"Rua Ana da Silva", 30, "Itajai", "SC"}, {1,2,33,4,5,6}},<br />
};<br />
<br />
/* retorna a media dos premios da quina (prêmio por por pessoa) em todos os jogos <br />
que ocorreram em um dado estado*/<br />
<br />
float media_premio_quina(char estado[3])<br />
{<br />
}<br />
<br />
/* retorna<br />
0 se NÃO existe jogo com sena existente no vetor passado<br />
1 se existe jogo com sena<br />
*/<br />
<br />
int teste_jogo_sena(int vet[6])<br />
{<br />
}<br />
<br />
/* retorna o total de jogos na mesma cidade */<br />
int total_jogos_mesmo_local(char estado[3])<br />
{<br />
}<br />
<br />
void main()<br />
{<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<br />
<br />
AVALIAÇÂO PRIMEIRA TURMA<br />
<br />
Implementar as funções indicadas abaixo<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct tipo_local{<br />
char rua[30];<br />
int numero;<br />
char cidade[30];<br />
char estado[3]; <br />
};<br />
<br />
struct tipo_jogo {<br />
int ganhadores_sena;<br />
int ganhadores_quina;<br />
float premio_sena;<br />
float premio_quina;<br />
struct tipo_local local;<br />
int resultado[6];<br />
} Jogos[5] = <br />
{<br />
{ 1, 5, 1200000, 500000, {"Rua Pedro da Silva", 30, "Florianopolis", "SC"}, {1,2,3,4,5,6}},<br />
{ 4, 10, 1500000, 100000, {"Rua Joao da Silva", 30, "Cruz Alta", "RS"},{10,20,33,44,54,6}}, <br />
{ 3, 20, 2000000, 300000, {"Rua Maria da Silva", 30, "Curitiba", "PR"}, {1,2,3,4,5,43}},<br />
{ 2, 50, 1300000, 600000, {"Rua Jose da Silva", 30, "Tijucas", "SC"}, {1,2,3,44,5,6}},<br />
{ 10, 30, 1800000, 550000, {"Rua Ana da Silva", 30, "Itajai", "SC"}, {1,2,33,4,5,6}},<br />
};<br />
<br />
/* retorna a media dos premios da sena por pessoa em todos os jogos */<br />
<br />
float media_premio_sena()<br />
{<br />
}<br />
<br />
/* retorna<br />
0 se NÃO existe jogo existente com o vetor passado<br />
1 se existe jogo com sena<br />
*/<br />
<br />
int teste_jogo(int vet[6])<br />
{<br />
}<br />
<br />
int num_jogos_estado(char estado[3])<br />
{<br />
}<br />
<br />
void main()<br />
{<br />
}<br />
<br />
</syntaxhighlight></div>186.222.18.224https://wiki.sj.ifsc.edu.br/index.php?title=AULA_17_-_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=79099AULA 17 - Programação 1 - Engenharia2014-10-28T23:56:51Z<p>186.222.18.224: </p>
<hr />
<div>===Objetivos===<br />
<br />
*iniciação ao uso de ponteiros no C;<br />
<br />
===Referências===<br />
[http://pw1.netcom.com/~tjensen/ptr/ch1x.htm]<br />
<br />
[http://eternallyconfuzzled.com/tuts/languages/jsw_tut_pointers.aspx]<br />
<br />
[http://duramecho.com/ComputerInformation/WhyCPointers.html]<br />
<br />
[http://boredzo.org/pointers/]<br />
<br />
<br />
===Ponteiros===<br />
<br />
A memória de um computador pode ser vista como um vetor de bytes. <br />
<br />
Cada byte possui um endereço. O tamanho da memória é definido pelo tamanho do barramento de endereços usado para acessá-la.<br />
<br />
Uma variável ocupa uma área da memória. Tipicamente uma variável to tipo ''char'' se utiliza de um ''byte''. Já uma variável do tipo ''int'' pode (dependendo do sistema) usar 4 ''bytes'' contíguos. <br />
<br />
Uma variável possui um endereço e um conteúdo (dados).<br />
<br />
<br />
Uma variável ponteiro tem como conteúdo um endereço. Portanto a variável ponteiro possui um endereço e contém um endereço como conteúdo.<br />
<br />
===Ponteiro para inteiro===<br />
<br />
Observe o programa abaixo. A variável ''p'' é um ponteiro para inteiro. Isto significa que ela pode armazenar um endereço<br />
de um inteiro.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x;<br />
int *p;<br />
<br />
x=5;<br />
printf("Valor de x antes = %d\n", x);<br />
<br />
p = &x;<br />
*p=10;<br />
<br />
printf("Valor de x depois = %d\n", x);<br />
printf("Valor de p = %p\n", p);<br />
}<br />
</syntaxhighlight><br />
<br />
Observe que para se referenciar o conteúdo da posição de memória apontada por ''p'' deve-se usar o asterisco: ''*p''<br />
<br />
EXERCÍCIO 1: Considere o programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x=10;<br />
int y, *p, *w;<br />
<br />
}<br />
</syntaxhighlight><br />
Faça um código para copiar o conteúdo de x para y, sem que estas variáveis apareçam no lado esquerdo de um sinal de atribuição.<br />
<br />
EXERCÍCIO 2: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + *p2;<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 3: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2, *p3;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + w;<br />
p3 = &y;<br />
*p3 = *p3 + 10;<br />
y = *p1 + *p2 + *p3;<br />
}<br />
</syntaxhighlight><br />
<br />
===Ponteiro para ''char''===<br />
<br />
Os ponteiro para ''char'' são muito utilizados pois permitem apontar para ''strings''. A ideia é que ele aponte para o primeiro caracter da ''string''. Veja o exemplo abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p;<br />
<br />
p = &x[2];<br />
<br />
printf("x[2] = %c\n", *p);<br />
<br />
p = x;<br />
<br />
printf("string %s\n", p);<br />
<br />
while (*p!=0) {<br />
printf("Endereco %p conteúdo %c\n", p,*p);<br />
p++;<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Neste foi usado o incremento de um ponteiro, o que implica em adicionar ao endereço armazenado em ''p'' uma quantidade relativa ao tamanho do tipo apontado.<br />
No caso é 1 (tamanho de um ''char'' é um byte).<br />
<br />
EXERCÍCIO: Sem executar o programa abaixo, determine o valor de y no final do programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p, y;<br />
<br />
p = x + 2;<br />
y= *p;<br />
}<br />
</syntaxhighlight><br />
<br />
===Apontando para um vetor de inteiros===<br />
<br />
Da mesma forma que usamos um ponteiro para char para apontar uma ''string'', podemos fazer um ponteiro para ''int'' apontar para para um elemento de um vetor de inteiros.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x[10]= {0,1,2,3,4,5,6,7,8,9};<br />
int *p;<br />
int i;<br />
<br />
p = x;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf(" endereco %p e conteudo %d\n", p, *p);<br />
p++;<br />
i++; <br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
<br />
OBSERVE que p++ incrementa em 4 unidades.<br />
<br />
===Usando ponteiro na passagem de parâmetros===<br />
<br />
Observe como podemos usar ponteiros na passagem de parâmetros. <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
printf("string destino = %s\n", destino);<br />
<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
</syntaxhighlight><br />
<br />
Um ponto interessante é que ponteiros permitem, na chamada de uma função, passar valores por referência:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
void alfa(int *p)<br />
{<br />
*p=10;<br />
}<br />
<br />
main()<br />
{<br />
int x;<br />
x =5;<br />
printf("Valor de x antes da chamada de alfa = %d\n", x);<br />
alfa(&x);<br />
printf("Valor de x depois da chamada de alfa = %d\n", x);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCíCIO 1: Implementar a função ''str_cat'' que concatena duas ''strings'' usando ponteiros.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
[http://www.mtm.ufsc.br/~azeredo/cursoC/aulas/c600.html Link Aula Ponteiros UFMG]</div>186.222.18.224https://wiki.sj.ifsc.edu.br/index.php?title=AULA_17_-_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=79098AULA 17 - Programação 1 - Engenharia2014-10-28T23:51:34Z<p>186.222.18.224: /* Objetivos */</p>
<hr />
<div>===Objetivos===<br />
<br />
*iniciação ao uso de ponteiros no C;<br />
<br />
===Referências===<br />
[http://pw1.netcom.com/~tjensen/ptr/ch1x.htm]<br />
<br />
[http://eternallyconfuzzled.com/tuts/languages/jsw_tut_pointers.aspx]<br />
<br />
[http://duramecho.com/ComputerInformation/WhyCPointers.html]<br />
<br />
[http://boredzo.org/pointers/]<br />
<br />
<br />
===Ponteiros===<br />
<br />
A memória de um computador pode ser vista como um vetor de bytes. <br />
<br />
Cada byte possui um endereço. O tamanho da memória é definido pelo tamanho do barramento de endereços usado para acessá-la.<br />
<br />
Uma variável ocupa uma área da memória. Tipicamente uma variável to tipo ''char'' se utiliza de um ''byte''. Já uma variável do tipo ''int'' pode (dependendo do sistema) usar 4 ''bytes'' contíguos. <br />
<br />
Uma variável possui um endereço e um conteúdo (dados).<br />
<br />
<br />
Uma variável ponteiro tem como conteúdo um endereço. Portanto a variável ponteiro possui um endereço e contém um endereço como conteúdo.<br />
<br />
===Ponteiro para inteiro===<br />
<br />
Observe o programa abaixo. A variável ''p'' é um ponteiro para inteiro. Isto significa que ela pode armazenar um endereço<br />
de um inteiro.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x;<br />
int *p;<br />
<br />
x=5;<br />
printf("Valor de x antes = %d\n", x);<br />
<br />
p = &x;<br />
*p=10;<br />
<br />
printf("Valor de x depois = %d\n", x);<br />
printf("Valor de p = %p\n", p);<br />
}<br />
</syntaxhighlight><br />
<br />
Observe que para se referenciar o conteúdo da posição de memória apontada por ''p'' deve-se usar o asterisco: ''*p''<br />
<br />
EXERCÍCIO 1: Considere o programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x=10;<br />
int y, *p, *w;<br />
<br />
}<br />
</syntaxhighlight><br />
Faça um código para copiar o conteúdo de x para y, sem que estas variáveis apareçam no lado esquerdo de um sinal de atribuição.<br />
<br />
EXERCÍCIO 2: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + *p2;<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 3: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2, *p3;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + w;<br />
p3 = &y;<br />
*p3 = *p3 + 10;<br />
y = *p1 + *p2 + *p3;<br />
}<br />
</syntaxhighlight><br />
<br />
===Ponteiro para ''char''===<br />
<br />
Os ponteiro para ''char'' são muito utilizados pois permitem apontar para ''strings''. A ideia é que ele aponte para o primeiro caracter da ''string''. Veja o exemplo abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p;<br />
<br />
p = &x[2];<br />
<br />
printf("x[2] = %c\n", *p);<br />
<br />
p = x;<br />
<br />
printf("string %s\n", p);<br />
<br />
while (*p!=0) {<br />
printf("Endereco %p conteúdo %c\n", p,*p);<br />
p++;<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Neste foi usado o incremento de um ponteiro, o que implica em adicionar ao endereço armazenado em ''p'' uma quantidade relativa ao tamanho do tipo apontado.<br />
No caso é 1 (tamanho de um ''char'' é um byte).<br />
<br />
EXERCÍCIO: Sem executar o programa abaixo, determine o valor de y no final do programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p, y;<br />
<br />
p = x + 2;<br />
y= *p;<br />
}<br />
</syntaxhighlight><br />
<br />
===Apontando para um vetor de inteiros===<br />
<br />
Da mesma forma que usamos um ponteiro para char para apontar uma ''string'', podemos fazer um ponteiro para ''int'' apontar para para um elemento de um vetor de inteiros.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x[10]= {0,1,2,3,4,5,6,7,8,9};<br />
int *p;<br />
int i;<br />
<br />
p = x;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf(" endereco %p e conteudo %d\n", p, *p);<br />
p++;<br />
i++; <br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
<br />
OBSERVE que p++ incrementa em 4 unidades.<br />
<br />
===Usando ponteiro na passagem de parâmetros===<br />
<br />
Observe como podemos usar ponteiros na passagem de parâmetros. <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
printf("string destino = %s\n", destino);<br />
<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
</syntaxhighlight><br />
<br />
Um ponto interessante é que ponteiros permitem, na chamada de uma função, passar valores por referência:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
void alfa(int *p)<br />
{<br />
*p=10;<br />
}<br />
<br />
main()<br />
{<br />
int x;<br />
x =5;<br />
printf("Valor de x antes da chamada de alfa = %d\n", x);<br />
alfa(&x);<br />
printf("Valor de x depois da chamada de alfa = %d\n", x);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCíCIO 1: Implementar a função ''str_cat'' que concatena duas ''strings'' usando ponteiros.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
[http://www.mtm.ufsc.br/~azeredo/cursoC/aulas/c600.html Link Aula Ponteiros UFMG]<br />
<br />
{{collapse top | Aula dia 22/05/2014}}<br />
<br />
Viagem para Porto Alegre<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top | Aula dia 23/05/2014}}<br />
<br />
Viagem para Porto Alegre<br />
<br />
Exercícios Adicionais ponteiros<br />
<br />
1.Implementar um programa para ler dados para dentro das variáveis x e y e somar o conteúdo das mesmas colocando o resultado em x SEM<br />
referenciar estas variáveis no scanf ou na expressão de soma.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float x,y;<br />
}<br />
</syntaxhighlight><br />
<br />
2.Implementar uma função que compara duas strings passadas como parâmetro. A função retorna 0 se as strings forem iguais e 1 se diferentes.<br />
Usar ponteiros.<br />
<br />
3.Implementar uma função que recebe como parâmetro o endereço de duas variáveis float que contêm a parte real e imaginária de um número complexo no formato polar (ângulo em radianos). A função deve converter do formato polar retangular colocando a coordenada x no primeira variável cujo endereço foi fornecido como parâmetro e a coordenada y na segunda variável.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
void converte_polar_retang(float *parte1, float parte2)<br />
{<br />
}<br />
<br />
main()<br />
{<br />
float num1=1.5, num2=10.6;<br />
<br />
/*chamar a função aqui */<br />
<br />
/* imprimir os valores de num1 e num2 aqui */<br />
}<br />
</syntaxhighlight> <br />
<br />
4.Implemantar uma funçao que recebe como parâmetro o endereço de duas variáveis do tipo char e<br />
após a chamada da função os valores das variáveis devem estar maiúsculos(caso elas contenham letras minúsculas).<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
char alfa='a', beta='b';<br />
<br />
capitaliza(&alfa, &beta);<br />
<br />
/* aqui os valores de alfa e beta deverão ser A e B */<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
5.Implementar uma função que recebe uma string contendo uma cadeia de caracteres com dígitos numéricos e retorna o valor inteiro da string. Usar ponteiros.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int a_toi(char *p)<br />
{<br />
}<br />
<br />
main()<br />
{<br />
char *p="123";<br />
int x;<br />
<br />
x = a_toi(p);<br />
<br />
/* neste ponto x deve conter 123 */<br />
}<br />
</syntaxhighlight></div>186.222.18.224https://wiki.sj.ifsc.edu.br/index.php?title=AULA_17_-_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=79097AULA 17 - Programação 1 - Engenharia2014-10-28T23:50:39Z<p>186.222.18.224: Criou página com '===Objetivos=== ===Referências=== [http://pw1.netcom.com/~tjensen/ptr/ch1x.htm] [http://eternallyconfuzzled.com/tuts/languages/jsw_tut_pointers.aspx] [http://duramecho.com/Co...'</p>
<hr />
<div>===Objetivos===<br />
<br />
===Referências===<br />
[http://pw1.netcom.com/~tjensen/ptr/ch1x.htm]<br />
<br />
[http://eternallyconfuzzled.com/tuts/languages/jsw_tut_pointers.aspx]<br />
<br />
[http://duramecho.com/ComputerInformation/WhyCPointers.html]<br />
<br />
[http://boredzo.org/pointers/]<br />
<br />
<br />
===Ponteiros===<br />
<br />
A memória de um computador pode ser vista como um vetor de bytes. <br />
<br />
Cada byte possui um endereço. O tamanho da memória é definido pelo tamanho do barramento de endereços usado para acessá-la.<br />
<br />
Uma variável ocupa uma área da memória. Tipicamente uma variável to tipo ''char'' se utiliza de um ''byte''. Já uma variável do tipo ''int'' pode (dependendo do sistema) usar 4 ''bytes'' contíguos. <br />
<br />
Uma variável possui um endereço e um conteúdo (dados).<br />
<br />
<br />
Uma variável ponteiro tem como conteúdo um endereço. Portanto a variável ponteiro possui um endereço e contém um endereço como conteúdo.<br />
<br />
===Ponteiro para inteiro===<br />
<br />
Observe o programa abaixo. A variável ''p'' é um ponteiro para inteiro. Isto significa que ela pode armazenar um endereço<br />
de um inteiro.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x;<br />
int *p;<br />
<br />
x=5;<br />
printf("Valor de x antes = %d\n", x);<br />
<br />
p = &x;<br />
*p=10;<br />
<br />
printf("Valor de x depois = %d\n", x);<br />
printf("Valor de p = %p\n", p);<br />
}<br />
</syntaxhighlight><br />
<br />
Observe que para se referenciar o conteúdo da posição de memória apontada por ''p'' deve-se usar o asterisco: ''*p''<br />
<br />
EXERCÍCIO 1: Considere o programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x=10;<br />
int y, *p, *w;<br />
<br />
}<br />
</syntaxhighlight><br />
Faça um código para copiar o conteúdo de x para y, sem que estas variáveis apareçam no lado esquerdo de um sinal de atribuição.<br />
<br />
EXERCÍCIO 2: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + *p2;<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 3: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2, *p3;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + w;<br />
p3 = &y;<br />
*p3 = *p3 + 10;<br />
y = *p1 + *p2 + *p3;<br />
}<br />
</syntaxhighlight><br />
<br />
===Ponteiro para ''char''===<br />
<br />
Os ponteiro para ''char'' são muito utilizados pois permitem apontar para ''strings''. A ideia é que ele aponte para o primeiro caracter da ''string''. Veja o exemplo abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p;<br />
<br />
p = &x[2];<br />
<br />
printf("x[2] = %c\n", *p);<br />
<br />
p = x;<br />
<br />
printf("string %s\n", p);<br />
<br />
while (*p!=0) {<br />
printf("Endereco %p conteúdo %c\n", p,*p);<br />
p++;<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Neste foi usado o incremento de um ponteiro, o que implica em adicionar ao endereço armazenado em ''p'' uma quantidade relativa ao tamanho do tipo apontado.<br />
No caso é 1 (tamanho de um ''char'' é um byte).<br />
<br />
EXERCÍCIO: Sem executar o programa abaixo, determine o valor de y no final do programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p, y;<br />
<br />
p = x + 2;<br />
y= *p;<br />
}<br />
</syntaxhighlight><br />
<br />
===Apontando para um vetor de inteiros===<br />
<br />
Da mesma forma que usamos um ponteiro para char para apontar uma ''string'', podemos fazer um ponteiro para ''int'' apontar para para um elemento de um vetor de inteiros.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x[10]= {0,1,2,3,4,5,6,7,8,9};<br />
int *p;<br />
int i;<br />
<br />
p = x;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf(" endereco %p e conteudo %d\n", p, *p);<br />
p++;<br />
i++; <br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
<br />
OBSERVE que p++ incrementa em 4 unidades.<br />
<br />
===Usando ponteiro na passagem de parâmetros===<br />
<br />
Observe como podemos usar ponteiros na passagem de parâmetros. <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
printf("string destino = %s\n", destino);<br />
<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
</syntaxhighlight><br />
<br />
Um ponto interessante é que ponteiros permitem, na chamada de uma função, passar valores por referência:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
void alfa(int *p)<br />
{<br />
*p=10;<br />
}<br />
<br />
main()<br />
{<br />
int x;<br />
x =5;<br />
printf("Valor de x antes da chamada de alfa = %d\n", x);<br />
alfa(&x);<br />
printf("Valor de x depois da chamada de alfa = %d\n", x);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCíCIO 1: Implementar a função ''str_cat'' que concatena duas ''strings'' usando ponteiros.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
[http://www.mtm.ufsc.br/~azeredo/cursoC/aulas/c600.html Link Aula Ponteiros UFMG]<br />
<br />
{{collapse top | Aula dia 22/05/2014}}<br />
<br />
Viagem para Porto Alegre<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top | Aula dia 23/05/2014}}<br />
<br />
Viagem para Porto Alegre<br />
<br />
Exercícios Adicionais ponteiros<br />
<br />
1.Implementar um programa para ler dados para dentro das variáveis x e y e somar o conteúdo das mesmas colocando o resultado em x SEM<br />
referenciar estas variáveis no scanf ou na expressão de soma.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float x,y;<br />
}<br />
</syntaxhighlight><br />
<br />
2.Implementar uma função que compara duas strings passadas como parâmetro. A função retorna 0 se as strings forem iguais e 1 se diferentes.<br />
Usar ponteiros.<br />
<br />
3.Implementar uma função que recebe como parâmetro o endereço de duas variáveis float que contêm a parte real e imaginária de um número complexo no formato polar (ângulo em radianos). A função deve converter do formato polar retangular colocando a coordenada x no primeira variável cujo endereço foi fornecido como parâmetro e a coordenada y na segunda variável.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
void converte_polar_retang(float *parte1, float parte2)<br />
{<br />
}<br />
<br />
main()<br />
{<br />
float num1=1.5, num2=10.6;<br />
<br />
/*chamar a função aqui */<br />
<br />
/* imprimir os valores de num1 e num2 aqui */<br />
}<br />
</syntaxhighlight> <br />
<br />
4.Implemantar uma funçao que recebe como parâmetro o endereço de duas variáveis do tipo char e<br />
após a chamada da função os valores das variáveis devem estar maiúsculos(caso elas contenham letras minúsculas).<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
char alfa='a', beta='b';<br />
<br />
capitaliza(&alfa, &beta);<br />
<br />
/* aqui os valores de alfa e beta deverão ser A e B */<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
5.Implementar uma função que recebe uma string contendo uma cadeia de caracteres com dígitos numéricos e retorna o valor inteiro da string. Usar ponteiros.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int a_toi(char *p)<br />
{<br />
}<br />
<br />
main()<br />
{<br />
char *p="123";<br />
int x;<br />
<br />
x = a_toi(p);<br />
<br />
/* neste ponto x deve conter 123 */<br />
}<br />
</syntaxhighlight></div>186.222.18.224https://wiki.sj.ifsc.edu.br/index.php?title=AULA_15_-_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=79096AULA 15 - Programação 1 - Engenharia2014-10-28T23:50:21Z<p>186.222.18.224: Limpou toda a página</p>
<hr />
<div></div>186.222.18.224