a = "abacate";//o ponteiro a ainda não aponta para algum lugar nem possuimemória alocada!



Documentos relacionados
Introdução à Programação por Bruno Jefferson, Jorge Dias, e Eduardo Santana Medeiros

Sumário. 2 Índice Remissivo 30

1.Quais serão os valores de x, y e p ao final do trecho de código abaixo? int x, y, *p;y = 0; p = &y; x = *p; x = 4; (*p)++; --x; (*p) += x;

Operaçõe õ s c om o Strings Intr oduç ão a o Ponte iros o e Funçõe õ s

Linguagens de Programação I

Métodos Computacionais. Fila

Aula 07: - Mapa de memória de um processo - Ponteiros (parte 1)

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

INF 1005 Programação I

INF 1007 Programação II

struct LISTA item quant

INF 1620 P1-10/04/02 Questão 1 Nome:

2ª Lista de Exercícios

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Fundamentos de Programação

MC102 Algoritmos e programação de computadores Aula 3: Variáveis

Linguagem C Tipos de Dados. void; escalares; sizeof Vectores; strings em C Estruturas Introdução ao pré-processador

Estruturas (Registros)

Algoritmos e Estruturas de dados

Princípios de programação em Linguagem C Cesar Tadeu Pozzer UFSM 16/08/2010

Edwar Saliba Júnior. Dicas, Comandos e Exemplos Comparativos entre Linguagem Algorítmica e Linguagem C

2. OPERADORES ALGORITMOS, FLUXOGRAMAS E PROGRAMAS FUNÇÕES... 10

Curso de C para Engenharias

MC-102 Aula 17 Strings e Matrizes

1ª versão. #include <stdio.h> #include <string.h> #include <stdlib.h> #define maxdiscos 1000

Estrutura de dados 2. Ponteiro. Prof. Jesuliana N. Ulysses

Algoritmos e Programação

Algoritmos e Programação Estruturada

INF 1005 Programação I

Estrutura da linguagem de programação C Prof. Tiago Eugenio de Melo tiago@comunidadesol.org

Linguagem C. Programação Estruturada. Fundamentos da Linguagem. Prof. Luis Nícolas de Amorim Trigo

Estruturas (registros)

Estruturas de Dados. Alguns dados não costumam ser tão simples assim... Podem ser compostos por vários dados distintos

Computação 2. Aula 5. Profª. Fabiany defines vetor, strings e matriz por parâmetros de função

Registros. Técnicas de Programação. Rafael Silva Guimarães

Linguagem C: Ponteiros - Alocação Dinâmica

MC-102 Algoritmos e Programação de Computadores

Introdução a POO. Introdução a Linguagem C++ e POO

Aula 25: Alocação Dinâmica

Linguagem C. Ponteiros. Alex Vidigal Bastos.

Alocação dinâmica de memória

Métodos Computacionais. Tipos Estruturados

José Romildo Malaquias

Prova de Programação (21090) Data: 31 de Janeiro de 2008

Tipo Abstrato de Dados

Exercício 1. Tabela 1: Cadastro de usuários, senhas e privilégios (exemplo). Login Senha Privilégio Armamento

Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação. Estruturas em C

Introdução à Programação

INF 1007 Programação II

Capítulo 2: Introdução à Linguagem C

Aula 1 Tipo Abstrato de Dados

Apontadores/ponteiros

Métodos Computacionais. Tipos Abstratos de Dados

10. Listas Encadeadas

Linguagem de Programação C

Programação Estruturada

MC-102 Aula 19 Registros

INTRODUÇÃO AO C++ SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

2 Orientação a objetos na prática

Árvores Binárias - continuação

Tipos de Dados Simples

Algoritmos de Busca em Tabelas

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

imprimir seus quadrados.

Computação I - C Prova /10/ Profs. Adriano Cruz e Valeria Bastos

INF 1007 Programação II

Aula 26: Arquivos de texto

INF 1007 Programação II

Vetores. Vetores. Figura 1 Exemplo de vetor com 10 elementos

1 Exercícios com ponteiros

Expressões. Prof. Alberto Costa Neto Linguagens de Programação. Departamento de Computação Universidade Federal de Sergipe

AULA 6. Conceitos. Melhores momentos. Conceitos. Conceitos. Conceitos. Conceitos

/*(Atenção: Em se tratando de uma lista estaticamente alocada, temos utilizado a estratégia de passa o tamanho máximo do vetor.)*/

20 Caracteres - Tipo char

9. Estruturas em C Registros

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Unidade IV: Ponteiros, Referências e Arrays

Programação de Computadores I. Ponteiros

Estrutura, União e Enumeração em C

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

Ponteiros e Tabelas. K&R: Capítulo 5

Aula 15: Repetição (Parte 3)

cast poderia ser usado também para transformar um real (float) em inteiro. A sintaxe C (float)i pode ser substituída em C++ por float(i).

LINGUAGEM C. Estrutura básica de um programa

Linguagem C Funções definidas pelo usuário. Lógica de Programação

Técnicas de Programação: ESTRUTURAS, UNIÕES E TIPOS DEE UFPB

Busca. Pesquisa sequencial

Estruturas de entrada e saída

Curso de C: uma breve introdução

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

Curso de Linguagem C

ponteiros INF Programação I Prof. Roberto Azevedo

O que é um apontador em C (type pointer in C)?

Programação: Estruturas de seleção

Módulo 8 Tipos Estruturados

Programação de Computadores I Registros na Linguagem C PROFESSORA CINTIA CAETANO

Transcrição:

GABARITO PONTEIROS 1. int x, y, *p;y = 0; p = &y;//*p = 0 x = *p;//x = 0 x = 4;//x = 4 (*p)++;//*p = 1, y = 1 --x;//x = 3 (*p) += x; //*p = 4, y = 4 Ao final, temos:x = 3, y = 4, p apontando para y (*p = 4). 2. a) void main() { int x, *p; x = 100; p = x;//p deveria receber o endereço de x, já que p é um ponteiro (e x não).ponteiros armazenam o endereço para o qual eles apontam! O código correto seria: p = &x; printf( Valor de p: %d.\n, *p); b) void troca (int *i, int *j) { int *temp; *temp = *i; *i = *j; *j = *temp; A variável temp não precisava ser um ponteiro, já que apenas precisaarmazenar um valor inteiro, sem precisar apontar para algum lugar. O código correto seria:void troca (int *i, int *j) {int temp;temp = *i;*i = *j;*j = temp; c) char *a, *b; a = "abacate";//o ponteiro a ainda não aponta para algum lugar nem possuimemória alocada! b = "uva";//o ponteiro b ainda não aponta para algum lugar nem possuimemória alocada!

if (a < b) printf ("%s vem antes de %s no dicionário", a, b); else printf ("%s vem depois de %s no dicionário", a, b); O correto seria:char a[] = "abacate", b[] = "uva";if (a[0] < b[0]) {printf ("%s vem antes de %s no dicionário", a, b);else {printf ("%s vem depois de %s no dicionário", a, b);nesse caso, verificar apenas a primeira letra das cadeias de caracteres funciona,pois temos a e u. Porém, o código acima não funcionaria para os casos manga e mamão, por exemplo. Fica como exercício para o aluno criar umafunção que faz a verificação de toda a cadeira de caracteres. 3. Se v (ou o endereço de v[0]), que representa o primeiro item do vetor está nobyte de endereço 55000, logo o índice v[3] (ou v + 3) estará no byte 55000 +8*3 = 55024. Nota: em máquinas de 32 bits, inteiros ocupam 32 bits (4bytes). 4. #include <stdio.h> #include <stdlib.h> void mm(int *v, int n, int *min, int *max) { int i;*min = v[0]; *max = v[0]; for (i = 1; i < n; i++) { if (v[i] > *max) { *max = v[i]; else if (v[i] < *min) { *min = v[i];

int main() { int n, i, *vet, minimo, maximo; printf("quantos numeros voce deseja digitar? "); scanf("%d", &n); vet = malloc(n * sizeof(int)); for (i = 0; i < n; i++) { printf("digite o numero de indice %d: ", i); scanf("%d", &vet[i]); mm(vet, n, &minimo, &maximo); printf("minimo: %d. Maximo: %d.\n", minimo, maximo); return 0; 5. Como v nos retorna o endereço do primeiro elemento de um vetor, v + 3 nos retorna o endereço do quarto elemento. Porém, v[3] nos retorna o quartoelemento! A diferença é que em um caso temos o elemento e em outro oendereço do elemento. 6. O primeiro laço for popula o vetor a com números decrescentes,começando de 98 (para o índice 0) até 0 (para o índice 98). Já o segundo,onde temos o vetor populado, troca os valores dos índices; ele é maiscomplicado: para cada índice i, ele troca o valor do elemento no vetor pelovalor do elemento que possui como índice o valor do elemento a[i]. Dessaforma, até a primeira metade do vetor (índice 49, pois 99 / 2 = 49), os valores são invertidos (de 0 a 49, para os índices de 0 a 49). Porém, para ospróximos itens, o vetor já está

invertido, então ele é sobrescrito com osnovos valores (da primeira metade do vetor), que, por coincidência, são osvalores que estavam anteriormente (quando populamos o vetor, no primeiro for, em ordem decrescente). 7. void troca (float *a, float *b) { float temp; temp = *a; *a = *b; *b = temp; 8. char *strcopy(char *str) { int n, i; char *nova; //Primeiro vamos contar quantos caracteres a string tem: for (n = 0; str[n]!= '\0'; n++) { //Agora vamos copiar alocar memoria para a nova string: nova = malloc(n * sizeof(char)); //Com a memoria alocada, podemos copiar: for (i = 0; i <= n; i++) { nova[i] = str[i]; //O "=" eh necessario para copiar tambem o \0 final de str return nova;

9. Idêntica à questão 4, trocando apenas maximominimo por mm (e sem necessidade da função main). Nota: na questão 4 não está explícito que precisamos passar como parâmetro o número de elementos do vetor (mas é necessário). 10. int x = 100, *p, **pp; //x recebe o valor 100, p é um ponteiro para inteiro e pp é umponteiro para ponteiro para inteiro p = &x; //p passa a apontar para o endereço de x (logo, *p tem o valor 100) pp = &p; //pp passa a apontar para o endereço de p, logo *pp é o valor de pp, que éo mesmo que p e **pp é o mesmo que *p, que é o mesmo que x (que é igual a 100) printf( Valor de pp: %d\n, **pp); //imprime o valor de **pp, que é igual ao valor de x, como mencionado na linha acima 11. #include <stdio.h> #include <stdlib.h> int *acha_caractere(char *str, char c, int *pn) { int i = 0, n = 0, *indices = 0; for (i = 0; str[i]!= '\0'; i++) { if (str[i] == c) { n++; indices = (int *) malloc(n* sizeof(int)); for (i = 0, n = 0; str[i]!= '\0'; i++) { if (str[i] == c) { indices[n] = i;n++;

*pn = n; return indices; int main() { int *indices = 0, n = 0, i; char *frase = "teste"; indices = acha_caractere(frase, 'e', &n); for (i = 0; i < n; i++) { printf("%d ", indices[i]); return 0; 12. a) int *p; //o asterisco mostra que é uma declaração de um ponteiro b) cout << *p; //o asterisco faz com que o conteúdo do endereço a ser apontado por p seja mostrado c) *p = x*5; //o asterisco faz com que o conteúdo do endereço apontado por p se torne x*5 d) cout << *(p+1); //o asterisco faz com que o conteúdo do endereço a ser apontado por (p+1) seja mostrado

13. //A saída será: p= O endereço para onde p aponta (*p+2) = O valor do conteúdo para onde p aponta + 2, que, no caso, dá 7 **&p = O valor do conteúdo para onde p aponta. No caso, 5 (3**p) = O valor do conteúdo para onde p aponta multiplicado por 3, ou seja, 15. (**&p+4) = O valor do conteúdo para onde p aponta somado a 4. No caso, dá 9. STRUCTS 1. #include <stdio.h> typedef struct { int matricula; char nome[100]; float nota1; float nota2; Aluno; #define QUANTIDADE_DE_ALUNOS 3 int main(){ Aluno alunos[quantidade_de_alunos]; printf("dados: nome(sem espacos), matricula, nota1, nota2\n"); for(int i=0; (i < QUANTIDADE_DE_ALUNOS); i++){ printf("\ninforme os dados do aluno(%i): ",i+1);

scanf("%s %i %f %f",alunos[i].nome, &alunos[i].matricula, &alunos[i].nota1, &alunos[i].nota2); printf("\nmatricula\tnome\tmedia\n"); for(int i=0; (i < QUANTIDADE_DE_ALUNOS); i++){ printf("%i\t%s\t%1.2f\n",alunos[i].matricula,alunos[i].nome, (alunos[i].nota1 + alunos[i].nota2)/2); getchar(); return 0; 2. #include <stdio.h> typedef struct{ char nome[100]; char sexo; // 'm': masculino, 'f': femino float peso; float altura; long long cpf; Pessoa; #define QUANTIDADE_DE_PESSOAS 3 int main(){ Pessoa pessoas[quantidade_de_pessoas]; printf("campos: nome, altura, peso, cpf, sexo\n");

for(int i=0; (i < QUANTIDADE_DE_PESSOAS); i++){ printf("\ninforme os dados da pessoa(%i): ",i+1); scanf("%s %f %f %Lu %c",pessoas[i].nome, &pessoas[i].altura, &pessoas[i].peso, &pessoas[i].cpf, &pessoas[i].sexo); printf("\ninforme o CPF da pessoa: "); long long cpf_localizador; scanf("%lu",&cpf_localizador); // printf("\nsexo\tnome\timc"); for(int i=0; (i < QUANTIDADE_DE_PESSOAS); i++){ // if (cpf_localizador == pessoas[i].cpf){ // float imc = pessoas[i].peso / (pessoas[i].altura * pessoas[i].altura); printf("\n%c\t%s\t%1.2f\n",pessoas[i].sexo, break; pessoas[i].nome, imc); getchar(); return 0; 3. #include <stdio.h> typedef struct { long codigo;

char nome[100]; Produto; float preco; #define QUANTIDADE_DE_PRODUTOS 5 int main(){ Produto produtos[quantidade_de_produtos]; printf("campos: codigo-do-produto nome preco\n"); for(int i=0; (i < QUANTIDADE_DE_PRODUTOS); i++){ printf("\ninforme os dados do produto(%i): ",i+1); scanf("%ld %s %f",&produtos[i].codigo,produtos[i].nome, &produtos[i].preco); for(int i=0; (i < QUANTIDADE_DE_PRODUTOS); i++){ printf("\n%ld\t%s R$ %1.2f", produtos[i].codigo, produtos[i].nome,produtos[i].preco); long codigo_digitado; printf("\ninforme o codigo do produto: "); scanf("%ld", &codigo_digitado); for(int i=1; (i < QUANTIDADE_DE_PRODUTOS); i++){ if (produtos[i].codigo == codigo_digitado) { printf("\npreço: R$ %1.2f\n", produtos[i].preco); getchar(); return 0;

4. #include <stdio.h> typedef struct { char nome[256]; long long cpf; Cliente; typedef struct { long numero_da_conta; long cpf_do_cliente; double saldo; Conta; #define QUANTIDADE_DE_CLIENTES 3 #define OPERACAO_SAQUE 1 #define OPERACAO_DEPOSITO 2 int main(){ Cliente clientes[quantidade_de_clientes]; Conta contas[quantidade_de_clientes]; printf("campos: cpf nome deposito-inicial\n"); for(long i=0; (i < QUANTIDADE_DE_CLIENTES); i++){ printf("\ndados para abertura da conta(%ld): ",i+1); scanf("%ld %s %lf",&clientes[i].cpf,clientes[i].nome, &contas[i].saldo); contas[i].numero_da_conta = i; contas[i].cpf_do_cliente = clientes[i].cpf;

printf("\ncliente: %s Conta: %ld Saldo inicial: %1.2lf\n", clientes[i].nome, contas[i].numero_da_conta, contas[i].saldo); int operacao; // como ainda não aprendemos a comparar strings, long num_conta; double valor; // vamos usar 'operação' como numérico. int sair=0; // FALSE while (!sair){ printf("\ninforme a operação: 1-Saque 2-Deposito 3-Sair: "); scanf("%d", &operacao); if (operacao == OPERACAO_SAQUE operacao == OPERACAO_DEPOSITO){ printf("\ninforme numero-da-conta e valor: "); scanf("%ld %lf", &num_conta, &valor); for(int i=0; (i < QUANTIDADE_DE_CLIENTES); i++){ if (contas[i].numero_da_conta == num_conta) { if (operacao == OPERACAO_SAQUE){ contas[i].saldo -= valor; printf("\nsaque: %1.2lf", valor); if (operacao == OPERACAO_DEPOSITO){ contas[i].saldo += valor; printf("\ndeposito: %1.2lf", valor); for(int j=0; j < QUANTIDADE_DE_CLIENTES; j++){ if (clientes[j].cpf == contas[i].cpf_do_cliente) printf("\ncliente: %s Saldo atual: %1.2lf", clientes[j].nome, contas[i].saldo);

else{ sair = 1; // TRUE getchar(); return 0; 5. Lista* retira_ultimo (Lista* l) { if(l == NULL) return NULL; else { Lista* ant = NULL; Lista* p = l; while(p->prox!=null) { ant = p; p = p->prox; free (p); if (ant!=null) { ant -> prox = NULL; return l; else return NULL;

6. Lista* constroi(int n, int* v) { int i; Lista* head=null; for (i=0;i<n;i++) { Lista* novo=(lista*) malloc(sizeof(lista)); novo->info=v[i]; novo->prox=head; head=novo; return head; 7. struct lista { char nome[81]; float nota; struct lista* prox ; typedef struct lista Lista; Lista* insere (Lista* lst, char* nome, float nota) { Lista* novo=(lista*) malloc(sizeof(lista));

strcpy(novo->nome,nome); novo->nota=nota; novo->prox=lst; return novo; 8. a) O nó acessado sera o x. b) O nó acessado sera o z. c) O nó acessado sera o b. 9. a) O valor de x será (55 * 17) 3 = 932. b) O valor de x será (3*17 40) = 11. c) O valor de x será (40 / 8 == 5) = TRUE 10. Como os nós tem sempre valores diferentes, a lista pode ter 1, 2 ou 4 nós para que a função retorne verdadeiro pois, assim, pri->prox->prox e pri->ant- >ant referenciarão o mesmo nó, satisfazendo a equação.