lógica de programação ecoi02€¦ · •etapas para desenvolvimento de um programa: –análise:...

Post on 12-Aug-2020

1 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Lógica de Programação – ECOi02

Profa. Rossana Junqueira

1

1 – Conceitos Básicos

2

1 – Conceitos básicos

• Uso de máquinas para auxiliar o trabalho. – Computador:

• É: – Consciente;

– Trabalhador;

– Muita energia.

• Não tem: – Iniciativa;

– Independência;

– Criatividade;

– Inteligência.

• Conclusão: – Precisa receber instruções nos mínimos detalhes.

3

1 – Conceitos básicos

– Computador:

• Finalidade: – Receber, manipular e armazenar dados.

– Processamento de dados.

» Receber dados por um dispositivo de entrada, realizar operações com esses dados e gerar uma resposta que será expressa em um dispositivo de saída.

• Duas partes diferentes: – Hardware

– Software

4

1 – Conceitos básicos

• Quando queremos criar ou desenvolver um software para realizar determinado tipo de processamento de dados, devemos escrever um programa ou vários programas interligados.

• Linguagem utilizada: linguagem de programação.

– Linguagem que tanto o computador quanto o criador de software entendam.

5

1 – Conceitos básicos

• Etapas para desenvolvimento de um programa:

– Análise: estuda-se o enunciado do problema para definir os dados de entrada, o processamento e os dados de saída.

– Algoritmo: descrever o problema com as suas soluções.

– Codificação: o algoritmos é transformado em códigos da linguagem de programação escolhida para se trabalhar.

6

1.1 – Conceito de algoritmo

“ Descrição de uma sequência de passos que deve ser seguida para a realização de um

tarefa.” (ASCENCIO, 1999)

7

1.2 – Método para a construção de algoritmos

• Compreender completamente o problema a ser resolvido;

• Definir os dados de entrada;

• Definir o processamento;

• Definir os dados de saída;

• Construir o algoritmo;

• Testar o algoritmo.

8

1.3 – Tipos de algoritmos

• Descrição narrativa: – Utilizar a linguagem natural para escrever os

passos a serem seguidos para a sua resolução.

• Fluxograma: – Utilizar símbolos gráficos predefinidos para

escrever os passos a serem seguidos para a sua resolução.

• Pseudocódigo ou portugol: – Utilizar regras predefinidas para escrever os

passos a serem seguidos para a sua resolução.

9

1.4 – Exemplos de algoritmos • Faça um algoritmo para mostrar o resultado

da multiplicação de dois números:

– Descrição narrativa:

– Fluxograma:

10

1.4 – Exemplos de algoritmos • Faça um algoritmo para mostrar o resultado

da multiplicação de dois números:

– Pseudocódigo ou portugol:

11

1.5 – Conceito de variável • Um algoritmo e, posteriormente, um

programa recebem dados que precisam ser armazenados no computador para serem utilizados no processamento.

• Armazenamento é feito na memória.

• Uma variável representa uma posição de memória, que possui nome e tipo e seu conteúdo pode variar ao longo do tempo, durante a execução de um programa.

• Só armazena um valor a cada instante. 12

1.6 – Tipos de dados • Mais utilizados:

– Numéricos:

• Inteiros ou reais.

– Lógicos:

• Assumem verdadeiro ou falso.

– Literais.

13

1.7 – Formação de identificadores • Nomes das variáveis.

• Regras básicas:

– Os caracteres permitidos são: os números, as letras maiúsculas, as letras minúsculas e o _.

– O primeiro caractere deve ser sempre uma letra.

– Não são permitidos espaços em branco e caracteres especiais.

– Não podemos usar palavras que pertençam à linguagem de programação.

14

2 – Paradigmas de programação

15

2 – Paradigmas de programação

• Relacionado à forma de pensar do programador e como ele busca a solução para os problemas.

• Exemplos: – Estruturado, orientado a objetos, lógico,

funcional, ...

• Paradigma estruturado: Também conhecido como imperativo ou procedural. Problema quebrado em problemas menores, de mais fácil solução.

16

Conteúdo Programático

17

Conteúdo programático

• Estrutura sequencial

• Estrutura condicional

• Funções

• Estrutura de repetição (FOR, WHILE e DO-WHILE)

• Arranjos unidimensionais (Vetor)

• Arranjos multidimensionais (Matriz)

• Estruturas heterogêneas de dados (Registro)

• Alocação dinâmica de memória (Ponteiro) 18

3 – Estrutura sequencial

19

3.1 – Estrutura sequencial em C/C++

• Bibliotecas: São arquivos contendo várias funções que podem ser incorporadas aos programas escritos em C/C++.

• #include: Faz o texto contido na biblioteca especificada ser inserido no programa.

Obs: A linguagem é sensível a letras maiúsculas e minúsculas.

20

#include <nome_da_biblioteca> main ( ) { bloco_de_comandos; }

3.2 – Declaração de variáveis

• São declaradas após a especificação de seus tipos.

• Tipos mais utilizados:

– int: para números inteiros;

– float: para números reais;

– char: para um caractere;

• Exemplo:

21

int x, y;

float z;

char sexo;

char nome[40];

3.2 – Declaração de constantes

• São declaradas depois das bibliotecas e seus valores não podem ser alterados durante a execução do programa.

• Exemplo:

22

const tipo nome valor

const int x = 7;

const float y = 4.5;

const char nome[40] = “MARIA”;

3.3 – Comando de atribuição

• Utilizado para conceder valores ou operações a variáveis.

• Representado por = (sinal de igualdade)

• Exemplo:

23

x = 4; y = x + 2;

Observações

• Os caracteres são representados ente apóstrofos (‘);

• As cadeias de caracteres são representados entre aspas (“);

• Cada comando é finalizado com o sinal de ponto e vírgula (;);

• A parte inteira e a parte fracionária do número são separadas por um ponto (.).

24

3.4 – Comando de entrada

• Utilizado para receber dados digitados pelo usuário.

• Os dados recebidos são armazenados em variáveis.

• Comando de entrada utilizado: cin

– leia-se: c in

• Exemplo:

25

cin >> n1;

3.4 – Comando de saída

• Utilizado para mostrar dados na tela.

• Comando de saída utilizado: cout

– leia-se: c out

• Exemplo:

26

cout << x; Ou cout << “Valor de x: “ << x;

3.4 – Comando de saída

• Exemplo:

– endl: pula uma linha

27

cout << “Valor de x: “ << x << endl;

3.5 – Comentários

• São textos que podem ser inseridos em programas com o objetivo de documentá-los.

• Não são analisados pelo compilador.

• Podem ocupar uma ou várias linhas.

– 1 linha: //

– 1 ou mais linhas: /* .......... */

• Exemplo:

28

/* linhas de comentário linhas de comentário */

// comentário

3.5 – Operadores e funções predefinidas

29

Operador Exemplo Comentário

= x = y O conteúdo da variável y é atribuído à variável x.

+ x + y Soma o conteúdo de x e de y.

- x – y Subtrai o conteúdo de y do conteúdo de x.

* x * y Multiplica o conteúdo de x pelo conteúdo de y.

/ x / y Obtém o quociente da divisão de x por y.

% x % y Obtém o resto da divisão de x por y.

== x == y O conteúdo de x é igual ao conteúdo de y.

!= x != y O conteúdo de x é diferente do conteúdo de y.

<= x <= y O conteúdo de x é menor ou igual ao conteúdo de y.

>= x >= y O conteúdo de x é maior ou igual ao conteúdo de y.

< x < y O conteúdo de x é menor que o conteúdo de y.

> x > y O conteúdo de x é maior que o conteúdo de y.

3.6 – Inicialmente...

30

• iostream: biblioteca para entrada e saída de dados;

• using namespace std: métodos default para entrada e saída de dados;

3.7 – Exercícios resolvidos

31

1. Faça um programa que receba quatro números inteiros, calcule e mostre a soma desses números.

3.6 – Exercícios resolvidos

32

2. Faça um programa que receba três notas, calcule e mostre a média aritmética.

4 – Estrutura condicional

33

4.1 – Estrutura condicional SIMPLES em C/C++ • O comando só será executado se a condição

for verdadeira.

• Uma condição é uma comparação que possui dois valores possíveis: verdadeiro ou falso.

34

if (condição) comando;

if (condição) { comando1; comando2; }

4.1 – Estrutura condicional SIMPLES em C/C++ • Exemplo1:

– Faça um programa que receba a nota de um aluno e mostre se ele está aprovado.

35

#include <iostream> using namespace std; main () { float nota; cout << "Nota: "; cin >> nota; if (nota >= 6) cout << "Aprovado!!!"; }

4.2 – Estrutura condicional COMPOSTA em C/C++ • Se a condição for verdadeira, será executado o

comando1; se for falsa, será executado o comando2.

36

if (condição) comando1; else comando2;

if (condição) { comando1; comando2; } else { comando3; comando4; }

4.2 – Estrutura condicional COMPOSTA em C/C++ • Exemplo2:

– Faça um programa que receba a nota de um aluno e mostre se ele está aprovado ou reprovado.

37

#include <iostream> using namespace std; main () { float nota; cout << "Nota: "; cin >> nota; if (nota >= 6) cout << "Aprovado!!!"; else cout << "Reprovado!!!"; }

4.3 – Estrutura condicional CASE em C/C++ • Usado em situações mutuamente exclusivas,

isto é, se uma situação for executada, as demais não serão.

38

switch (variável) { case valor1: lista de comandos; break; case valor2: lista de comandos; break; ......... default: lista de comandos; }

break: Usado para impedir a execução dos comandos definidos nos cases subsequentes. default: Quando o valor da variável não coincidir com aqueles especificados nos cases, será executado, então, o default.

4.3 – Estrutura condicional CASE em C/C++ • Exemplo3:

– Faça um programa que receba um número. O programa deverá dar como resposta “Número 1” se o número digitado tiver sido 1, “Número 2” se o número digitado tiver sido 2 e “Número diferente de 1 e 2” para qualquer outro número digitado.

39

{ int num; cout << "Digite um numero: "; cin >> num; switch (num) { case 1: cout << "Numero 1"; break; case 2: cout << "Numero 2"; break; default: cout << "Numero diferente de 1 e 2"; } }

4.4 – Exercícios Resolvidos 1. Faça um programa que receba as três notas de um aluno,

calcule e mostre a média e o conceito de acordo com a tabela abaixo:

40

8,0 10,0 A

7,0 8,0 B

6,0 7,0 C

5,0 6,0 D

0,0 5,0 E

4.4 – Exercícios Resolvidos

41

{ float n1, n2, n3, media; cout << "Digite a primeira nota: "; cin >> n1; cout << "Digite a segunda nota: "; cin >> n2; cout << "Digite a terceira nota: "; cin >> n3; media = (n1 + n2 + n3) / 3; cout << "Media: " << media << endl; if (media >= 0 and media < 5) cout << "E"; else if (media >= 5 and media < 6) cout << "D"; else if (media >= 6 and media < 7) cout << "C"; else if (media >= 7 and media < 8) cout << "B"; else cout << "A"; }

5 – Funções

42

5.1 – Funções em C/C++

• Também chamada de sub-rotinas, são blocos de instruções que realizam tarefas específicas.

• O código do uma sub-rotina é carregado uma vez e pode ser executado quantas vezes forem necessárias.

• Como o problema pode ser subdividido em pequenas tarefas, os programas tendem a ficar menores e mais organizados.

43

5.1 – Funções em C/C++

• Os programas, em geral, são executados linearmente, uma linha após a outra, até o fim.

• Quando são usadas sub-rotinas, é possível a realização de desvios na execução do programa.

• Esse desvios são efetuados quando uma função é chamada pelo programa principal.

44

5.1 – Funções em C/C++

• Um ponto a ser destacado é que, dentro das sub-rotinas, pode ocorrer declaração de variáveis, chamadas variáveis locais.

• Só podem ser utilizadas apenas dentro da sub-rotina.

• Quando a execução da sub-rotina chega ao fim, essas variáveis são destruídas e seus conteúdos são perdidos.

• Variáveis declaradas fora de qualquer sub-rotina são chamadas globais.

45

5.1 – Funções em C/C++

• Podem ser criadas quantas funções quiser, dependendo do problema que estiver sendo resolvido pelo programa.

• Às vezes precisam receber valores externos, chamados parâmetros.

• Podem devolver algum valor produzido para o ambiente externo, denominado retorno.

46

5.2 – Funções sem passagem de parâmetros e sem retorno • O tipo mais simples de função é aquele que

não recebe nenhuma informação no momento de sua chamada e que não repassa nenhum valor para quem a chamou.

• void é a forma de identificar que a função não retorna nenhuma informação.

47

void nome_da_função () { comando; }

5.2 – Funções sem passagem de parâmetros e sem retorno • Exemplo: Função soma que recebe dois números e imprime a sua

soma.

48

#include <iostream> using namespace std; void soma () { int x, y, soma; cout << "X: "; cin >> x; cout << "Y: "; cin >> y; soma = x + y; cout << "Soma: " << soma; } main() { soma(); }

5.3 – Funções com passagem de parâmetros e sem retorno • Esse tipo de função recebe valor no momento

em que é chamada, mas não devolvem valor para quem as chamou (retorno).

• Onde tipo é o tipo de dado do parâmetro.

49

void nome_da_função (tipo nome_do_parametro, tipo nome_do_parametro, ...) { comando; }

5.3 – Funções com passagem de parâmetros e sem retorno • Exemplo: Função soma que recebe dois parâmetros do tipo int e

imprime a sua soma.

50

#include <iostream> using namespace std; void soma (int a, int b) { int soma; soma = a + b; cout << "Soma: " << soma; } main() { int x, y; cout << "X: "; cin >> x; cout << "Y: "; cin >> y; soma(x,y); }

5.4 – Funções sem passagem de parâmetros e com retorno • Esse tipo de função não recebe valor no

momento em que são chamadas (parâmetros), mas que, no final, devolvem um valor para quem as chamou (retorno).

• Onde tipo_retorno é o tipo de dado que o resultado desta função vai retornar.

51

tipo_retorno nome_da_função () { comando; }

5.4 – Funções sem passagem de parâmetros e com retorno • Exemplo: Função soma que recebe dois números e retorna o resultado

para o programa principal.

52

#include <iostream> using namespace std; int soma () { int x, y, s; cout << "X: "; cin >> x; cout << "Y: "; cin >> y; s = x + y; return s; } main() { int resultado; resultado = soma(); cout << "Resultado da soma: " << resultado; }

5.5 – Funções com passagem de parâmetros e com retorno • Esse tipo de função recebe valor no momento

em que são chamadas (parâmetros), e que, no final, devolvem um valor para quem as chamou (retorno).

53

tipo_retorno nome_da_função (tipo nome_da_variável, tipo nome_da variável, ...) { comando; }

5.5 – Funções com passagem de parâmetros e com retorno • Exemplo: Função soma que recebe dois parâmetros do tipo

int e retorna o resultado para o programa principal.

54

#include <iostream> using namespace std; int soma (int a, int b) { int s; s = a + b; return s; } main() { int x, y, resultado; cout << "X: "; cin >> x; cout << "Y: "; cin >> y; resultado = soma(x,y); cout << "Resultado da soma: " << resultado; }

5.6 – Passagem de parâmetros por valor • Significa que a função trabalhará com cópias

dos valores passados no momento de sua chamada, desta forma, qualquer alteração dos valores nas variáveis correspondentes dentro da função não afetam os valores das variáveis utilizadas como parâmetros.

• Até este momento todas as funções apresentadas utilizam a passagem de parâmetros por valor.

55

5.6 – Passagem de parâmetros por valor

56

#include<iostream> using namespace std; void nao_muda(int a, int b) //passagem por valor { a = a + 2; b = b + 5; } int main() { int x, y; cout << "X: "; cin >> x; cout << "Y: "; cin >> y; nao_muda(x,y); cout << "Valores apos a funcao nao_muda x = "<< x <<" y = " << y; }

5.7 – Passagem de parâmetros por referência • Significa que a função trabalhará com as próprias

variáveis passadas no momento de sua chamada. Assim, qualquer alteração nos valores das variáveis correspondentes dentro da função afetam as variáveis passadas como parâmetros.

• Este mecanismo permite que a função retorne mais de um valor para a função que chama.

• Para definir que um parâmetro será passado como referência para uma função, utilizamos o símbolo & antes do nome da variável no cabeçalho da função, indicando que ela é um alias (apelido, referência, outro nome) para a variável passada como parâmetro.

57

5.7 – Passagem de parâmetros por referência

58

#include<iostream> using namespace std; void muda(int &a, int &b) //passagem por referência { a = a + 2; b = b + 5; } int main() { int x, y; cout << "X: "; cin >> x; cout << "Y: "; cin >> y; muda(x,y); cout << "Valores apos a funcao muda x = "<< x << " y = " << y; }

6 – Estrutura de repetição

59

6.1 – Estrutura de repetição em C/C++

• Utilizada quando um trecho do algoritmo, ou até mesmo o algoritmo inteiro, precisa ser repetido.

• O número de repetições pode ser fixo ou estar atrelado a uma condição.

• Tipos de estrutura:

– FOR

– WHILE

– DO-WHILE

60

6.1 – Estrutura de repetição FOR em C/C++

• Utilizada quando se sabe o número de vezes que um trecho do programa deve ser repetido.

• A primeira parte atribui um valor_inicial à variável i, que tem como função controlar o número necessário de repetições.

• A segunda parte corresponde a uma expressão relacional que, quando assumir o valor falso, determinará o fim da repetição.

• A terceira parte é responsável por alterar o valor da variável i, com o objetivo de, em algum momento, fazer a condição assumir o valor falso.

61

for (i = valor_inicial; condicao; incremento ou decremento de i) { comando; }

6.1 – Estrutura de repetição FOR em C/C++

• Exemplo 1: Mostrar os números de 1 a 20.

62

main() { int a; for (a = 1; a <= 20; a++) { cout << a << endl; } }

6.1 – Estrutura de repetição FOR em C/C++

• Exemplo 2: Mostrar os números pares de 1 a 20.

63

main() { int a; for (a = 1; a <= 20; a++) { if (a % 2 == 0) cout << a << endl; } }

6.2 – Estrutura de repetição WHILE em C/C++

• Pode ser utilizada quando o número de repetições necessárias não for fixo.

• Os comandos serão repetidos até a condição assumir o valor falso.

• Enquanto a condição for verdadeira, os comandos que estão dentro das chaves serão executados .

64

while (condição) { comando; }

6.2 – Estrutura de repetição WHILE em C/C++

• Exemplo 3: Mostrar os números de 1 a 20.

65

main() { int a; a = 1; while (a <= 20) { cout << a << endl; a = a + 1; } }

6.2 – Estrutura de repetição WHILE em C/C++

• Exemplo 4: Mostrar os números pares de 1 a 20.

66

main() { int a; a = 1; while (a <= 20) { if (a % 2 == 0) cout << a << endl; a = a + 1; } }

6.2 – Estrutura de repetição WHILE em C/C++

• Exemplo 5: Mostrar a soma dos números digitados pelo usuário.

67

main() { int a, soma, teste; teste = 0; while (teste != 1) { cout << "Digite um numero: "; cin >> a; soma = soma + a; cout << "Digite 0 para informar outro numero ou 1 para sair: "; cin >> teste; } cout << "Soma: " << soma; }

6.3 – Estrutura de repetição DO-WHILE em C/C++

• Pode ser utilizada quando o número de repetições necessárias não for fixo.

• Os comandos serão repetidos até a condição assumir o valor falso.

• Nesse tipo de estrutura o teste condicional ocorre no fim. Isso significa que a repetição será executada, no mínimo, uma vez, quando todo bloco for executado uma vez, e, ao final, a condição assumir o valor falso.

68

6.3 – Estrutura de repetição DO-WHILE em C/C++

• Os comandos serão repetidos até que a condição assuma valor falso.

69

do { comandos; } while (condição);

6.3 – Estrutura de repetição DO-WHILE em C/C++

• Exemplo 6: Mostrar os números de 1 a 20.

70

main() { int a; a = 1; do { cout << a << endl; a = a + 1; } while (a <= 20); }

6.3 – Estrutura de repetição DO-WHILE em C/C++

• Exemplo 7: Mostrar os números pares de 1 a 20.

71

main() { int a; a = 1; do { if (a % 2 == 0) cout << a << endl; a = a + 1; } while (a <= 20); }

6.3 – Estrutura de repetição DO-WHILE em C/C++

• Exemplo 8: Mostrar a soma dos números digitados pelo usuário.

72

main() { int a, soma, teste; teste = 0; soma = 0; do { cout << "Digite um numero: "; cin >> a; soma = soma + a; cout << "Digite 0 para informar outro numero ou 1 para sair: "; cin >> teste; } while (teste != 1); cout << "Soma: " << soma; }

7 – Vetor

73

7.1 – Vetor em C/C++

• Conhecido como variável composta homogênea unidimensional.

• Trata-se de um conjunto de variável do mesmo tipo, que possuem o mesmo identificador (nome) e são alocadas sequencialmente na memória.

• Como as variáveis têm o mesmo nome, o que as distingue é um índice que referencia sua localização dentro da estrutura.

74

7.2 – Declaração de vetor

• Os vetores são identificados pela existência de colchetes logo após o nome da variável no momento da declaração.

• Dentro dos colchetes, deve-se colocar o número de elementos que o vetor poderá armazenar.

75

int vet[10];

10 5 3 8 1 19 44 21 2 7

0 1 2 3 4 5 6 7 8 9

vet

7.3 – Atribuindo valor ao vetor

• As atribuições em vetor exigem que seja informada em qual de suas posições o valor ficará armazenado.

• Lembre-se: sempre a primeira posição de u vetor tem índice 0.

76

vet[0] = 1; Atribui o valor 1 à primeira posição do vetor.

x[3] = ‘b’; Atribui a letra b à quarta posição do vetor.

7.4 – Preenchendo um vetor

• Preencher um vetor significa atribuir valor às suas posições. Assim, deve-se implementar um mecanismo que controle o valor do índice.

77

int i, vet[10]; for (i=0; i < 10; i++) { cout << "Digite um número: "; cin >> vet[i]; }

7.5 – Mostrando os elementos do vetor

• Mostrar os valores contidos em um vetor também exige a utilização de um índice.

78

for (i=0; i < 10; i++) { cout << vet[i]; }

7.6 – Exemplo

• Escrever um algoritmo que leia duas notas de 5 alunos. Calcular a média e guardar em um terceiro vetor, e ao final, escrever a média de cada um dos alunos.

79

7.6 – Exemplo

80

int i, nota1[5], nota2[5]; float media[5]; for (i=0; i < 5; i++) { cout << "Nota 1: "; cin >> nota1[i]; cout << "Nota 2: "; cin >> nota2[i]; media[i] = (nota1[i] + nota2[i]) / 2; } cout << endl; for (i=0; i < 5; i++) { cout << media[i] << endl; }

8 – Matriz

81

8.1 – Matriz em C/C++

• Conhecido como variável composta homogênea multidimensional.

• É formada por uma sequência de variáveis, todas do mesmo tipo, que possuem o mesmo identificador (nome) e são alocadas sequencialmente na memória.

• Como as variáveis têm o mesmo nome, o que as distingue é um índice que referencia sua localização dentro da estrutura.

• Uma variável do tipo matriz precisa de um índice para cada uma de suas dimensões.

82

8.2 – Declaração de matriz

• Onde:

– tipo_dos dados: é o tipo dos dados que serão armazenados na matriz.

– nome_variável: é o nome dado à variável do tipo matriz.

– [dimensão1]: representa o tamanho da 1ª dimensão.

– [dimensão2]: representa o tamanho da 2ª dimensão.

83

tipo_dos_dados nome_variável [dimensão1] [dimensão2] [...] [dimensãoN]

8.3 – Exemplo de matriz

84

int mat [2] [3]

10 5 3

7 8 4

0 1 2

mat 0

1

8.4 – Atribuindo valor à matriz

• Atribuir valor a uma matriz significa armazenar informação em seus elementos, identificados de forma única por meio de seus índices.

85

mat[0][2] = 3; Atribui o valor 3 na linha 0 coluna 2.

mat[1][0] = 7; Atribui o valor 7 na linha 1 coluna 0.

8.5 – Preenchendo uma matriz

• Significa percorrer todos os seus elementos, atribuindo-lhes um valor.

86

int i, j, mat[2][3]; for (i=0; i < 2; i++) { for (j=0; j < 3; j++) { cout << "Digite um número: "; cin >> mat[i][j]; } }

8.6 – Mostrando os elementos de uma matriz • Significa percorrer todos os seus elementos,

atribuindo-lhes um valor.

87

for (i=0; i < 2; i++) { for (j=0; j < 3; j++) { cout << mat[i][j]; } cout << endl; }

8.7 – Exemplo

• Elaborar um algoritmo que leia uma matriz de 3 linhas e 4 colunas de números inteiros. No final, imprima todos os números.

88

8.7 – Exemplo

89

int i, j, mat[3][4]; for (i=0; i < 3; i++) { for (j=0; j < 4; j++) { cout << "Digite um número: "; cin >> mat[i][j]; } } for (i=0; i < 3; i++) { for (j=0; j < 4; j++) { cout << mat[i][j]; } cout << endl; }

9 – Manipulando cadeias de caracteres - Strings

90

9.1 - Strings

• A linguagem C não possui um tipo de dado similar à STRING de outras linguagens.

• Para armazenar uma cadeia de caracteres, utiliza vetores, nos quais cada posição representa um caractere.

91

9.1 - Strings

• Compiladores da linguagem C/C++ identificam o fim de uma cadeia por meio do caractere nulo, ou seja, por meio de ‘\0’.

• Sendo assim, deve-se declarar sempre o vetor com uma posição a mais para armazenar o caractere nulo.

• Por exemplo, para armazenar a palavra CADEIA, deve-se declarar um vetor do tipo char com sete posições.

92

9.1 - Strings

• Exemplos de variáveis do tipo cadeia de caracteres:

93

char nome[21]; A variável nome poderá armazenar até 20 caracteres.

char sexo[4]; A variável sexo poderá armazenar até 3 caracteres.

char curso; A variável curso poderá armazenar apenas um caractere.

9.2 – Inicializando cadeia de caracteres

• Para declarar um vetor de caracteres podemos utilizar:

ou

ou

94

char nome[ ] = {‘U’, ‘N’, ‘I’, ‘F’, ‘E’, ‘I’, ‘\0’};

char nome[ ] = “UNIFEI”;

char nome[7] = “UNIFEI”;

9.3 – Funções para manipulação de strings • Para manipular as cadeias de caracteres,

devem-se utilizar funções específicas, e estas fazem parte da biblioteca string.h ou cstring.

• Para consultar funções dessa biblioteca acesse: http://www.cplusplus.com/reference/clibrary/cstring/.

95

9.3.1 – Função strlen()

• Retorna o número de caracteres da cadeia.

96

#include <iostream > #include <string.h> using namespace std; main() { char nome[ ] = "UNIFEI"; int tamanho = strlen(nome); cout << tamanho; }

9.3.1 – Função strlen()

• Exemplo:

97

#include <iostream > #include <string.h> using namespace std; main() { char nome[22] = "Logica de Programacao"; int tamanho = strlen(nome); for (int i =0; i < tamanho ; i++) { cout<<"Caracter n." << i+1 << ": " << nome[i] << endl; } }

9.3.2 – Função strcat()

• Concatena duas strings (uma no final da outra).

• Recebe duas strings como argumento e copia a segunda string (origem) no final da primeira (destino), sendo que a segunda string permanece inalterada.

• Note que a string destino deverá ser grande o suficiente para armazenar a string resultante.

98

9.3.2 – Função strcat()

• Exemplo:

99

#include <iostream > #include <string.h> using namespace std; main() { char nome[40] = "Rossana "; char sobrenome[] = "de Paula Junqueira"; cout << "Vetor nome: " << nome << endl; cout << "Vetor sobrenome: " << sobrenome << endl; cout << endl; strcat(nome, sobrenome); cout << "Nome completo: " << nome; }

9.3.3 – Função gets()

• Para a leitura de uma string do teclado devemos usar a função gets, que está definida na biblioteca cstdio.

• Ela captura todos os caracteres digitados, inclusive os espaços em branco, até que seja pressionada a tecla Enter.

• No Windows você deverá usar a função fflush(stdin) antes de chamar a gets() para limpar o buffer de entrada.

100

9.3.3 – Função gets()

• Exemplo:

101

#include <iostream > #include <string.h> #include <cstdio> using namespace std; main() { char nome[30]; cout << "Escreva seu nome completo: "; fflush(stdin); //Limpa o buffer de entrada do teclado gets(nome); cout << nome; }

9.3.4 – Função strcmp()

• Realiza a comparação entre o conteúdo de duas strings.

• Recebe duas strings como argumento e retorna o valor 0 (zero) caso o conteúdo das duas strings sejam iguais ou um valor diferente de zero, caso conteúdos diferentes.

102

9.3.4 – Função strcmp()

• Exemplo:

103

#include <iostream > #include <string.h> #include <cstdio> using namespace std; main() { char cor[] = "azul"; char resposta[10]; cout << "Qual e a cor do ceu? "; gets(resposta); cout << strcmp(cor, resposta); }

9.3.5 – Função strcpy()

• Realiza a cópia do conteúdo de uma string para outra string, substituindo o conteúdo da string de destino.

• Recebe duas strings como argumento e copia a segunda string (origem) na primeira (destino).

• Note que a string destino deverá ser grande o suficiente para armazenar a string origem.

104

9.3.5 – Função strcpy()

• Exemplo:

105

#include <iostream > #include <string.h> #include <cstdio> using namespace std; main() { char origem[] = "Rossana"; char destino[] = "Junqueira"; cout << "Origem: " << origem << endl; cout << "Destino: " << destino << endl; strcpy(destino, origem); cout << "Origem: " << origem << endl; cout << "Destino: "<< destino; }

9.3.6 – Funções strupr() e strlwr()

• podemos utilizar as funções strlwr() ou strupr() para converter os caracteres da string em letras minúsculas ou maiúsculas respectivamente e compará-la com uma string padrão.

106

9.3.6 – Funções strupr() e strlwr()

• Exemplo:

107

#include <iostream > #include <string.h> #include <cstdio> using namespace std; main() { char palavra[7] = "BrASiL"; cout << "String antes da conversao: " << palavra << endl; strupr(palavra); cout << "Maiuscula - strupr(): " << palavra; strlwr(palavra); cout << "Minuscula - strlwr(): " << palavra; }

9.3.7 – Resumo das funções

• strlen()

– Retorna o número de caracteres da cadeia.

• strcat()

– Concatena duas strings.

108

char nome[] = “UNIFEI”; int tamanho = strlen(nome);

char nome[] = "Rossana "; char sobrenome[] = "de Paula Junqueira"; strcat(nome, sobrenome);

9.3.7 – Resumo das funções

• gets()

– Faz a leitura de uma string do teclado.

• strcmp()

– Realiza a comparação entre o conteúdo de duas strings.

109

char nome[30]; cout << "Escreva seu nome completo: "; fflush(stdin); //Limpa o buffer de entrada do teclado gets(nome);

char cor[] = "azul"; char resposta[] = "azul"; cout << strcmp(cor, resposta);

9.3.7 – Resumo das funções

• strcpy()

– Copia o conteúdo de uma string para outra.

• strupr()

– Converte os caracteres para maiúscula.

110

char origem[] = "Rossana"; char destino[] = "Junqueira"; strcpy(destino, origem);

char palavra[] = "BrASiL"; strupr(palavra);

9.3.7 – Resumo das funções

• strlwr()

– Converte os caracteres para minúsculas.

111

char palavra[] = "BrASiL"; strlwr(palavra);

Exercício

112

1) Faça um programa que receba uma frase, calcule e mostre a quantidade de vogais da frase digitada. O programa deverá contar vogais maiúsculas e minúsculas.

Dica: – Digitar uma frase. (usar a função gets para fazer a leitura)

– Pegar o tamanho da frase. (usar a função strlen, guardando o resultado em uma variável)

– Percorrer a frase.

– Comparar cada caractere com as vogais (maiúsculas e minúsculas).

– Quando encontrar uma vogal, acrescentar um na quantidade.

Exercício

113

#include <iostream> #include <string.h> #include <cstdio> using namespace std; main() { char frase[200]; int tam,i,qtde; qtde = 0; cout << "Digite uma frase: "; gets(frase); tam = strlen(frase); for (i=0;i<tam;i++) { if (frase[i]=='a' or frase[i] =='A' or frase[i]=='e' or frase[i] =='E' or frase[i]=='i' or frase[i] =='I' or frase[i]=='o' or frase[i] =='O' or frase[i]=='u' or frase[i] =='U') qtde = qtde + 1; } cout << "Quantidade de vogais = " << qtde; }

10 – Registros

114

10.1 - Registros

• Até aqui, as variáveis utilizadas nos programas conseguem armazenar apenas um tipo de dado, definido no momento em que foram declaradas.

• Porém, é bastante comum a necessidade de armazenar, dentro de uma mesma variável, diferentes tipos de dados.

• Registros ou variáveis compostas heterogêneas, conseguem agregar vários dados de uma mesma entidade.

• Cada dados contido em um registro é chamado campo.

115

10.2 – Declaração de registros em C/C++ • São chamados de estruturas.

• São definidos por meio da utilização da palavra reservada struct.

• A partir da estrutura definida, o programa poderá considerar que existe um novo tipo de dado chamado nome_da_estrutura.

116

struct nome_da_estrutura { tipo campo1; tipo campo2; ... tipo campoN; };

10.2 – Declaração de registros em C/C++ • Exemplo 1:

• Para permitir que qualquer parte do seu programa entenda e utilize uma struct, sua definição deverá ser feita fora da função main, de preferência logo abaixo de todos os #include.

117

struct estrutura { int num; char titular[35]; float saldo; };

10.2 – Declaração de registros em C/C++ • Para que um programa utilize uma struct, é

necessária a declaração de variáveis desse tipo, da seguinte forma:

118

nome_da_estrutura nome_da variavel;

10.2 – Declaração de registros em C/C++ • Exemplo 2:

119

struct banco { int num; char titular[35]; float saldo; }; main() { banco conta; banco contas[10]; }

10.3 – Acesso a membros de um registro • É possível por meio do acesso individual a

seus membros, quer seja para gravar quer seja para recuperar um dado.

• O acesso a determinado membro da estrutura é feio informando-se o nome da variável, seguido por um ponto e pelo nome do campo desejado.

120

nome_da_variável_do_tipo_estrutura.nome_do_campo

10.3 – Acesso a membros de um registro • Exemplo 3:

121

struct banco { int num; char titular[35]; float saldo; }; main() { banco conta; cout << "Numero: "; cin >> conta.num; cout << "Titular: "; cin >> conta.titular; cout << "Saldo: "; cin >> conta.saldo; }

10.3 – Acesso a membros de um registro • Exemplo 4:

122

main() { banco contas[10]; int i; for (i=0; i<10; i++) { cout << "Numero: "; cin >> contas[i].num; cout << "Titular: "; cin >> contas[i].titular; cout << "Saldo: "; cin >> contas[i].saldo; } }

10.4 – Exemplo 5

123

• Elabore um algoritmo que leia os dados de quatro pessoas (código, nome, sexo, idade e altura), sendo que a primeira seja um funcionário e as três últimas sejam associadas. No final, imprima o funcionário e as associadas, ou seja, os associados do sexo feminino.

124

struct dados { int codigo, idade; char nome[35]; char sexo; float altura; }; main() { dados funcionario, associado[3]; int i; cout << "Informacao do funcionario" << endl; cout << "Codigo: "; cin >> funcionario.codigo; cout << "Nome: "; cin >> funcionario.nome; cout << "Sexo: "; cin >> funcionario.sexo; cout << "Idade: "; cin >> funcionario.idade; cout << "Altura: "; cin >> funcionario.altura; cout << endl;

125

cout << "Informacoes dos associados:" << endl; for (i=0; i<3; i++) { cout << "Codigo: "; cin >> associado[i].codigo; cout << "Nome: "; cin >> associado[i].nome; cout << "Sexo: "; cin >> associado[i].sexo; cout << "Idade: "; cin >> associado[i].idade; cout << "Altura: "; cin >> associado[i].altura; } cout << endl; cout << "Dados do funcionario: " << endl; cout << "Codigo: " << funcionario.codigo << endl; cout << "Nome: " << funcionario.nome << endl; cout << "Sexo: " << funcionario.sexo << endl; cout << "Idade: " << funcionario.idade << endl; cout << "Altura: " << funcionario.altura << endl; cout << endl;

126

cout << "Dados das associadas: " << endl; for (i=0; i<3; i++) { if (associado[i].sexo == 'F' or associado[i].sexo == 'f') { cout << "Codigo: " << associado[i].codigo << endl; cout << "Nome: " << associado[i].nome << endl; cout << "Sexo: " << associado[i].sexo << endl; cout << "Idade: " << associado[i].idade << endl; cout << "Altura: " << associado[i].altura; } } }

top related