Vetores e Strings. 6. Comandos de entrada e saída formatada que trabalham sobre strings

Documentos relacionados
Declarando e Utilizando Ponteiros. Para declarar um ponteiro temos a seguinte forma geral: tipo_do_ponteiro *nome_da_variável;

É o asterisco (*) que faz o compilador saber que aquela variável não vai guardar um valor e sim um endereço para aquele tipo especificado.

19 - Ponteiros em C Parte 1

Vetores e Strings. 4. Funções Básicas para manipulação de Strings. A função gets() lê uma string do teclado. Sua forma geral é:

Vetores e Strings. printf ("\na string %s nao esta contida no vetor de %s", string, "strings.\n");

#include <stdio.h> #define nl 3 #define nc 4 main () { int matriz[nl][nc],*p,i; for (i=0, p=&matriz[0][0];i<nl*nc;i++) *(p++)=i+1; for (i=0,

Linguagem C: Ponteiros. Prof. Tiago Alves de Oliveira

Linguagem C: Ponteiros. Prof. Leonardo Barreto Campos 1

Ponteiros e Alocação Dinâmica em C. Fonte: DCC UFMT (modificado)

SSC304 Introdução à Programação Para Engenharias. Ponteiros. GE4 Bio

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

ALGORITMOS E ESTRUTURAS DE DADOS II (Parte 1)

char *strchr (const char *str, int ch);

Capítulo 1: Introdução à Linguagem C. Pontifícia Universidade Católica Departamento de Informática

char *strchr (const char *str, int ch);

Programação Estruturada

MATRIZES. Luís Charneca.

Curso de Programação C em Ambientes Linux Aula 04

Introdução à Programação. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Ponteiros em C. Adriano Joaquim de Oliveira Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

TÉCNICAS DE LINGUAGEM DE PROGRAMAÇÃO

Introdução à Programação Aula 10. Prof. Max Santana Rolemberg Farias Colegiado de Engenharia de Computação

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Básicas. Aula Tópico 2

Computação 2. Aula 7. Profª. Fabiany Ponteiros

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

Podemos declarar um ponteiro para um ponteiro com a seguinte notação: tipo_da_variável **nome_da_variável;

Centro Universitário Franciscano Curso de Sistemas de Informação Disciplina de algoritmos e programação II. Ponteiros

Ponteiros. Ponteiros. Ponteiros. Ponteiros. Ponteiros. Introdução a Programação. Profa. Roseli Romero

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

Matrizes em C. Lucas Ferrari de Oliveira Professor Adjunto. Universidade Federal do Paraná

11a. Aula Ponteiros e Vetores

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Algoritmos e Estruturas de Dados I (DCC/003) 2013/1. Estruturas Básicas. Aula Tópico 4

A sintaxe para se declarar uma variável do tipo ponteiro é dada por:

Introdução a Programação de Jogos

1) Operadores de auto incremento ++ e auto decremento --

Programação: Vetores

Linguagem C Ponteiros

ponteiros INF Programação I Prof. Roberto Azevedo

Linguagem C: Introdução

Matrizes. Técnicas de Programação. Rafael Silva Guimarães <p://<p.ci.ifes.edu.br/informabca/rafael_guimaraes

LINGUAGEM C: PONTEIROS

Estruturas de Controle de Fluxo

Estruturas de Dados Aulas 3 e 4: Uso da. 14/03/2011 e 16/03/2011

LÓGICA DE PROGRAMAÇÃO. PROFª. M.Sc. JULIANA H Q BENACCHIO

Tipos de Dados, Variáveis e Entrada e Saída em C. DCC 120 Laboratório de Programação

Essencialmente, um ponteiro nada mais é do que uma variável que ao invés de conter um valor, contém um endereço de memória.

Ponteiro. Ponteiro. Objetivo. Compreender a definição e dominar a implementação de ponteiros em C.

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

Alocação Dinâmica de Memória - Exercício

Introdução a Ponteiros e Vetores em C

Vetores. e o programa deverá ler os valores separadamente:

Ponteiros. Baseado nos slides do Prof. Mauro.

Estruturas de Dados Homogêneas (Vetores e Matrizes) e Ponteiros em C

Revisão. Profa Marina Gomes

Capítulo 2 Operadores. A função scanf()

Ponteiros. um ponteiro é uma variável que contém o endereço um dado declaração: * indica que a variável é um ponteiro. Ex: tipo_dado *nome_ponteiro;

Aula 20 - Ponteiros. Prof. Laura Silva de Assis. Engenharia de Computação. CEFET/RJ - Centro Federal de Educação Tecnológica Celso Suckow da Fonseca

Introdução a Computação

1 Exercícios com ponteiros

#include <stdio.h> main () { short int desloca, byte, aux=1; printf("\n\ndigite um numero pertencente ao intervalo [0,255]: "); scanf("%hd", &byte);

Linguagem C ponteiros

Programação Estruturada

Ponteiros. Considere um carteiro recém-chegado na vila Na vila, a referência para se encontrar a casa é pelo morador

1 Exercícios com ponteiros

ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória

11 - Estrutura de um programa em C

3. Linguagem de Programação C

Aula 15 Variáveis Indexadas (vetores)

Estrutura de Dados. Cadeia de Caracteres. Roberto Araujo Ago/2013

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Sumário. Introdução à Ciência da Computação. Ponteiros em C. Introdução. Definição. Por quê ponteiros são importantes?

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Funciona como uma matriz unidimensional, mas tem mais de um índice. Sintaxe:

Hello World. Linguagem C. Tipos de Dados. Palavras Reservadas. Operadores Aritméticos. Pré e pós incremento e pré e pós decremento

Algoritmos e Programação

3. Linguagem de Programação C

3.1 - Funções para manipular dados de entrada e saída padrão

Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

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

Programação Básica. Estrutura de um algoritmo

Introdução à Programação C

DAS5102 Fundamentos da Estrutura da Informação

INF 1620 P1-13/09/02 Questão 1 Nome:

CCO 016 / COM 110 Fundamentos de Programação

3. Linguagem de Programação C

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

prim = A ; prim = &A[0];

Introdução a Programação. Ponteiros e Passagem de Argumentos por Referência

Variáveis, Tipos de Dados e Operadores

Aula 8 Oficina de Programação Vetores. Profa. Elaine Faria UFU

UNIVERSIDADE FEDERAL FLUMINENSE INSTITUTO DE COMPUTAÇÃO DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO

Aula 9 Agregado Heterogêneo Ponteiro. prof Leticia Winkler

INF1007: Programação 2. 0 Revisão. 06/08/2015 (c) Dept. de Informática - PUC-Rio 1

Programação de Computadores II Aula 03. Linguagem C I

Variáveis e Operadores em C

Matrizes. Marina Andretta. 17 de abril de 2017 ICMC-USP. Marina Andretta (ICMC-USP) sme0230-ipc 17 de abril de / 30

Modularidade - Funções e Procedimentos

Disciplina de Algoritmos e Programação

Transcrição:

332 Vetores e Strings #include <stdio.h> main () { char strings [5][100],string [100]; int count,count2; for (count=0;count<5;count++) { printf ("\n\ndigite a %dº string do vetor: ", count+1); scanf ("%99[^\n]",strings[count]); /*Se necessário limpar o buffer*/ } printf ("\nentre com a string que voce deseja saber se pertence ao vetor:"); scanf ("%99[^\n]", string); ]); /*Se necessário limpar o buffer*/

Vetores e Strings for (count=0;count<5;count++) for (count2=0;count2<100;count2++) { if (strings[count][count2]!=string[count2]) break; if (string[count2]=='\0') { printf ("\na string %s esta na posicao %d do vetor de strings.\n", string, count+1); exit(0); } } printf ("\na string %s nao esta contida no vetor de strings.\n", string); } 333

Vetores e Strings #include <stdio.h> #include <string.h> main () { char strings [5][100],string [100]; int count; for (count=0;count<5;count++) { printf ("\n\ndigite a %dº string do vetor: ", count+1); gets (strings[count]); } puts ("\nentre com a string que voce deseja saber se pertence ao vetor:"); gets(string); 334

Vetores e Strings for (count=0;count<5;count++) if (!strcmp(strings[count],string)) break; if (count<5) printf ("\na string %s esta na posicao %d do vetor de strings.\n", string, count+1); else printf ("\na string %s nao esta contida no vetor de strings.\n", string); } 335

Vetores e Strings 6. Comandos de entrada e saída formatada que trabalham sobre strings - sprintf e sscanf sprintf e sscanf são semelhantes a printf e scanf. Porém, ao invés de escreverem na saída padrão ou lerem da entrada padrão, escrevem ou lêem em uma string. Suas formas gerais são: sprintf (string_destino,string_de_controle,lista_de_argumentos); sscanf (string_origem,string_de_controle,lista_de_argumentos); 336

Vetores e Strings 6. Comandos de entrada e saída formatada que trabalham sobre strings (continuação) Estas funções são muito utilizadas para fazer a conversão entre dados na forma numérica e sua representação na forma de strings e vice-versa. No programa a seguir, por exemplo, a variável i é "impressa" em string1. Além da representação de i como uma string, string1 também conterá "Valor de i = ". 337

338 Vetores e Strings 6. Comandos de entrada e saída formatada que trabalham sobre strings (continuação) Exemplo: #include <stdio.h> main() { int i; char string1[25]; puts( "Entre um valor inteiro: "); scanf("%d", &i); sprintf(string1,"valor de i = %d", i); puts(string1); }

Vetores e Strings 6. Comandos de entrada e saída formatada que trabalham sobre strings (continuação) Já no próximo programa, foi utilizada a função sscanf para converter informações armazenadas em string1 em valores numéricos: 339

340 Vetores e Strings 6. Comandos de entrada e saída formatada que trabalham sobre strings (continuação) Exemplo: #include <stdio.h> main() { } int i, j; float k; char string1[]= "10 20 5.89"; sscanf(string1, "%d %d %f", &i, &j, &k); printf("valores lidos: %d, %d, %.2f", i, j, k);

341 Vetores e Strings 6. Comandos de entrada e saída formatada que trabalham sobre strings (continuação) Exercício: Construa um programa que declare um vetor de strings e outro de inteiros, ambos com 10 elementos. O programa deve inicializar os vetores com valores fornecidos pelo usuário através da entrada padrão. Depois, deve acrescentar os inteiros, do vetor de inteiros, no final das strings correspondentes no vetor de strings. Ao termino do processamento o vetor de strings, com seus valores atualizados, deve ser apresentado na saída padrão.

342 #include<stdio.h> #include<string.h> main() { char strings[10][100],aux[10]; int inteiros[10],i; for (i=0;i<10;i++) { printf("\nentre com a string[%d]: ",i+1); scanf("%99[^\n]", strings[i]); printf("\nentre com o inteiro[%d]: ",i+1); scanf("%d",&inteiros[i]); } for (i=0;i<10;i++) { sprintf(aux,"%d",inteiros[i]); strcat(strings[i],aux); /*verificar possível falha de segmentação*/ } for (i=0;i<10;i++) printf("\n%s\n",strings[i]); }

1. Como Funcionam Variáveis do tipo int guardam valores inteiros, as do tipo float guardam números de ponto flutuante, já as do tipo char guardam caracteres. guardam endereços de memória e ponteiro também tem tipo. 343

2. Declarando e Utilizando Para declarar um ponteiro temos a seguinte forma geral: tipo_do_ponteiro *nome_da_variável; Exemplos de declarações: int *pt; char *temp,*pt2; 344

2. Declarando e Utilizando (continuação) Um cuidado, muito importante, que deve ser tomado na manipulação de ponteiros, é o de inicializar um ponteiro antes de utilizá-lo, pois quando esses são declarados, apontam para um lugar indefinido. Para atribuir um valor válido a um ponteiro recém-criado poderíamos igualá-lo a um endereço de memória de uma variável declarada. Mas, como saber a posição na memória de uma variável do nosso programa? 345

2. Declarando e Utilizando (continuação) Para saber o endereço de uma variável basta usar o operador &. Veja o exemplo:... int count=10; int *pt; pt=&count;... OBS.: Lembre-se da função scanf() 346

347 2. Declarando e Utilizando (continuação) Como nós colocamos um endereço válido em pt, ele agora pode ser utilizado. Podemos, por exemplo, alterar o valor de count usando pt. Para tanto vamos usar o operador "inverso" do operador &, que é o operador *. No exemplo anterior, uma vez que fizemos pt=&count a expressão *pt é equivalente ao próprio count. Isto significa que, se quisermos mudar o valor de count para 12, basta fazer *pt=12.

Exemplo 1: 348 #include <stdio.h> main () { int num,valor; int *p; num=55; p=&num; valor=*p; printf ("\n\n%d\n",valor); printf ("Endereco para onde o ponteiro aponta: %p\n", p); printf ("Valor da variavel apontada: %d\n",*p); }

Exemplo 2: #include <stdio.h> main () { int num,*p; num=55; p=&num; printf ("\nvalor inicial: %d\n",num); *p=100; printf ("\nvalor final: %d\n",num); } 349

Exemplo 3: #include <stdio.h> main () { int num,*p; num=55; p=&num; printf ("\nvalor inicial: %d\n",num); printf ("Digite um valor inteiro:"); scanf("%d", p); printf ("\nvalor final: %d\n",num); } 350

2. Operações Aritméticas com a) Atribuição Se temos dois ponteiros, p1 e p2, e quisermos que p1 aponte para o mesmo lugar que p2, basta fazermos p1=p2. É interessante observar que se o objetivo for que a variável apontada por p1 tenha o mesmo conteúdo da variável apontada por p2 deve-se fazer *p1=*p2. 351

2. Operações Aritméticas com (continuação) b) Incremento e Decremento Quando incrementamos um ponteiro ele passa a apontar para o próximo valor do mesmo tipo para o qual o ponteiro aponta. Esta é uma razão pela qual o compilador precisa saber o tipo de um ponteiro. 352

2. Operações Aritméticas com (continuação) b) Incremento e Decremento (continuação) O decremento funciona de forma semelhante. Supondo que p é um ponteiro, as operações são escritas, por exemplo, como: p++; p--; 353

2. Operações Aritméticas com (continuação) b) Incremento e Decremento (continuação) Estamos falando de operações com ponteiros e não de operações com o conteúdo das variáveis para as quais eles apontam. Por exemplo, para incrementar o conteúdo da variável apontada pelo ponteiro p, faz-se: (*p)++; 354

2. Operações Aritméticas com (continuação) c) Soma e Subtração de Inteiros com Vamos supor que você queira incrementar um ponteiro em 15 unidades. Basta fazer: p=p+15; ou p+=15; /*considerando que p é uma variável do tipo ponteiro*/ E se você quiser usar o conteúdo da memória apontada 15 posições adiante: *(p+15); Obs.: A subtração funciona de forma similar. 355

2. Operações Aritméticas com (continuação) d) Comparação entre dois podemos saber se dois ponteiros são iguais ou diferentes (== e!=). No caso de operações do tipo >, <, >= e <= estamos comparando qual ponteiro aponta para uma posição mais alta na memória. A comparação entre dois ponteiros se escreve como a comparação entre outras duas variáveis quaisquer: Por exemplo, p1>p2 356

2. Operações Aritméticas com (continuação) Há entretanto operações que não podemos efetuar sobre um ponteiro. Não se pode dividir ou multiplicar ponteiros, adicionar dois ponteiros, adicionar ou subtrair floats ou doubles a ponteiros. 357

Exercícios: a) Explique a diferença, caso exista, entre p++ (*p)++ *(++p) b) O que quer dizer *(p+10)? 358

c) Qual o valor de y no final do programa? Escreva um /* comentário */ em cada comando de atribuição explicando o que ele faz e o valor da variável à esquerda do '=' após sua execução. Explique se os parênteses são realmente necessários. #include <stdio.h> main() { int *p, y, x; } y = 0; p = &y; x = *p; x = 4; ++(*p); x--; (*p) += x++; printf ("y = %d\n", y); 359

3. e Vetores - Vetores como ponteiros Para que possamos entender esta similaridade, devemos primeiro entender como o C trata vetores. Quando declaramos uma matriz da seguinte forma: tipo_da_variável nome_da_variável [tam1][tam2]... [tamn]; 360 169

361 - Vetores como ponteiros (continuação) O compilador C calcula o tamanho, em bytes, necessário para armazenar esta matriz. Como vimos, este tamanho é: tam1 x tam2 x tam3 x... x tamn x tamanho_do_tipo O compilador então aloca este número de bytes em um espaço livre de memória. O nome_da_variável que você declarou é na verdade um ponteiro para o tipo_da_variável da matriz que aponta para o endereço inicial da área alocada.

- Vetores como ponteiros (continuação) Mas aí surge a pergunta: então como é que podemos usar a seguinte notação? nome_da_variável[índice] Isto pode ser facilmente explicado desde que você entenda que a notação acima é absolutamente equivalente a se fazer: *(nome_da_variável+índice) 362

- Vetores como ponteiros (continuação) Dessa forma, um ponteiro pode ser utilizado, por exemplo, para fazer uma varredura sequencial de uma matriz. Pois, quando temos que varrer todos os elementos de uma matriz de uma forma sequencial, podemos usar um ponteiro, o qual vamos incrementando. Qual seria a vantagem em se fazer uma varredura sequencial? 363

364 - Vetores como ponteiros (continuação) Considere o seguinte programa para zerar uma matriz: main () { float matrx [50][50]; int i,j; for (i=0;i<50;i++) for (j=0;j<50;j++) matrx[i][j]=0.0; }

- Vetores como ponteiros (continuação) Podemos reescrevê-lo usando ponteiros: main () { float matrx [50][50], *p; int count; for (count=0, p=matrx[0]/*p=&matrx[0][0]*/; count<2500;count++) *(p++)=0.0; } 365

366 - Vetores como ponteiros (continuação) Há uma diferença entre o nome de um vetor e um ponteiro que deve ser destacada: um ponteiro é uma variável, mas o nome de um vetor não é uma variável. Isto significa, que não se consegue alterar o endereço que é apontado pelo "nome do vetor". Logo: int vetor[10], *ponteiro, i; ponteiro = &i; /* as operações a seguir são invalidas */ vetor = vetor + 2; vetor++; vetor = ponteiro;

- Vetores como ponteiros (continuação) Se testarmos as operações anteriores em nossos compiladores. Eles darão, por exemplo, uma mensagem de erro do tipo: - Lvalue; - incompatible types in assignment. 367

- Vetores como ponteiros (continuação) Exercício: Construa um programa que declare uma matriz [3,4] de inteiros e a inicializa da seguinte forma: [ ] 01 02 03 04 05 06 07 08 09 10 11 12 e depois a imprima na saída padrão com o layout apropriado. As manipulações da matriz deve ser feitas utilizando um ponteiro. 368