Capítulo VI – Variáveis Indexadas

of 76 /76
Capítulo VI – Variáveis Capítulo VI – Variáveis Indexadas Indexadas 6.1 – A necessidade de variáveis 6.1 – A necessidade de variáveis indexadas indexadas 6.2 – Vetores e matrizes 6.2 – Vetores e matrizes 6.3 – Aplicações com vetores numéricos 6.3 – Aplicações com vetores numéricos 6.4 – Aplicações com matrizes numéricas 6.4 – Aplicações com matrizes numéricas 6.5 – Cadeias de caracteres 6.5 – Cadeias de caracteres 6.6 – Aplicações com vetores de cadeias 6.6 – Aplicações com vetores de cadeias de caracteres de caracteres

Embed Size (px)

description

Capítulo VI – Variáveis Indexadas. 6.1 – A necessidade de variáveis indexadas 6.2 – Vetores e matrizes 6.3 – Aplicações com vetores numéricos 6.4 – Aplicações com matrizes numéricas 6.5 – Cadeias de caracteres 6.6 – Aplicações com vetores de cadeias de caracteres. - PowerPoint PPT Presentation

Transcript of Capítulo VI – Variáveis Indexadas

  • Captulo VI Variveis Indexadas6.1 A necessidade de variveis indexadas6.2 Vetores e matrizes6.3 Aplicaes com vetores numricos6.4 Aplicaes com matrizes numricas6.5 Cadeias de caracteres6.6 Aplicaes com vetores de cadeias de caracteres

  • 6.4 Aplicaes com Matrizes Numricas6.4.1 Transformar uma matriz quadrada em sua transposta

    Matriz transposta de uma matriz quadrada aquela cujas linhas so as colunas da matriz original e cujas colunas so as linhas da mesma

  • Exemplo:

    Se o objetivo fosse apenas obter o resultado na tela:

    for (i = 0; i < n; i++) {for (j = 0; i < n; j++) printf (%5d, A[j][i]); printf (\n);}

    Mas deseja-se transformar a original na transposta

    Matriz quadrada 5 x 5 originalMatriz transposta da originalEscrevendo cada coluna numa linha da telaA

  • AOperao bsica para a transformao:

    Trocar A[i][j] com A[j][i]

    Exemplo: se i = 2 e j = 3,

    Trocar A[2][3] com A[3][2]

  • AOperao bsica para a transformao:

    Trocar A[i][j] com A[j][i]

    Exemplo: se i = 2 e j = 3,

    Trocar A[2][3] com A[3][2]

  • AOperao bsica para a transformao:

    Trocar A[i][j] com A[j][i]

    Exemplo: se i = 2 e j = 3,

    Trocar A[2][3] com A[3][2]

  • AOperao bsica para a transformao:

    Trocar A[i][j] com A[j][i]

    Exemplo: se i = 2 e j = 3,

    Trocar A[2][3] com A[3][2]Trocar (A[i][j], A[j][i]):

    aux = A[i][j];A[i][j] = A[j][i];A[j][i] = aux;

  • APara transformar toda a matriz:

    Percorr-la com 2 cursores i e je Trocar (A[i][j], A[j][i])

    O percurso no pode abranger toda a matriz!!! Porqu???Sejam os comandos:

    for (i = 0; i < n; i++) for (j = 0; j < n; j++) Trocar (A[i][j], A[j][i]);

    que percorrem toda a matrizQuando (i, j) = (1, 3)Trocar (A[1][3], A[3][1])

    Mais adiante, quando (i, j) = (3, 1)Trocar (A[3][1], A[1][3])

    A troca anterior desfeita

  • ADeve-se planejar o percurso de i e de j

    Para comear, a diagonal principal no precisa ser percorrida

    A parte acima dessa diagonal deve ser trocada com a parte abaixo dela

  • AOs comandos:

    for (i = 0; i

  • #include #include int main () {int A[10][10], i, j, n, aux;

    /*Leitura e escrita da matriz*/

    printf ("Dimensao da matriz quadrada: "); scanf ("%d",&n);printf ("\nElementos da matriz: \n");for (i = 0; i

  • /*Transformacao da matriz em sua transposta e sua escrita*/

    for (i = 0; i

  • 6.4.2 Sntese de sub-matrizes

    Muito usada em processamento de imagens p. ex., para o controle de desmatamento numa regio

    Dados captados pela cmera de um satlite so armazenados numa imensa matriz bidimensional, para serem usados na confeco de fotografias

    Tipicamente uma foto constituda de uma matriz de pontos, de dimenses bem menores que as da matriz preenchida pela cmera

    Ento cada ponto da foto deve conter uma sntese das informaes contidas numa sub-matriz da primeira matriz

  • A seguir, o desenvolvimento de um programa para sintetizar o contedo das sub-matrizes de uma grande matriz B em elementos de outra matriz A bem menor que a primeira

    Dimenses: B(20 x 20) e A(5 x 5)

    A sntese consiste na mdia aritmtica dos elementos de cada sub-matriz de B

    Sendo inteiros os elementos de B, ento os de A devem ser reais

    A seguir, um contedo possvel para a matriz B e o contedo correspondente da matriz A

  • Cada linha de A corresponde a 4 linhas de B

    Cada coluna de A corresponde a 4 colunas de B

    A linha i de A corresponde s linhas de 4i a 4i+3 de B

    A coluna j de A corresponde s colunas de 4j a 4j+3 de B

  • A linha i de A corresponde s linhas de 4i a 4i+3 de B

    A coluna j de A corresponde s colunas de 4j a 4j+3 de B

    Clculo de A[i][j]:aux = 0;for (x = 4*i; x

  • Clculo de A[i][j]:

    aux = 0;for (x = 4*i; x

  • #include #include int main () {

    /*Declaracoes das variaveis*/

    float A[5][5]; int B[20][20];int i, j, k, x, y, z; float aux; char c;

    /*Formacao da matriz B (20 x 20)*/

    for (i = k = 0; i < 20; i++)for (j = 0; j < 20; j++)B[i][j] = ++k;

  • /*Escrita da matriz B (20 x 20) no video*/

    printf ("Matriz principal? (s/n): ");scanf ("%d", &c);if (c == 's' || c == 'S') { printf ("\n\n");for (i = 0; i < 20; i++) for (j = 0; j < 20; j++) printf ("%4d", B[i][j]);}Os 20 elementos preenchem uma linha inteira do vdeo

    No preciso o \n no final de cada linha

  • /*Sintetizacao da Matriz B na matriz A*/

    for (i = 0; i < 5; i++)for (j = 0; j < 5; j++) {aux = 0;for (x = 4*i; x

  • /*Escrita da matriz A(5 x 5) no video*/

    printf ("\n\nMatriz reduzida? (s/n): ");scanf ("%d", &c);if (c == 's' || c == 'S') { printf ("\n\n");for (i = 0; i < 5; i++) {for (j = 0; j < 5; j++) printf ("%8.2f", A[i][j]);printf ("\n");}}

    /*Fechamento da tela*/

    printf ("\n\n"); system ("pause"); return 0;}

  • Exerccios 6.4:

    Escrever um programa para ler os elementos de uma matriz A e quatro inteiros i, j, k, l, formando em seguida outra matriz B, contendo uma submatriz de A composta de suas linhas de i a j e de suas colunas de k a l; no final, o programa deve escrever a matriz B

    A seguinte matriz tem o apelido de matriz ziguezague de dimenses 5 x 8:

    Fazer um programa que leia 2 inteiros positivos m e n e em seguida construa e escreva no vdeo uma matriz ziguezague de dimenses m x n

  • As seguintes matrizes tm o apelido de matrizes-cebolas de dimenses (6 x 7) e (8 x 5):

    Fazer um programa para ler m e n e construir uma matriz-cebola de dimenses m e n

  • As seguintes matrizes tm o apelido de matrizes-espirais de dimenses 5 e 6:

    Fazer um programa para ler n e construir uma matriz-espiral de dimenso n

    e

  • Fazer um programa para ler o valor de uma varivel inteira n, os valores dos elementos reais de uma matriz A triangular superior de dimenses (n x n) e de um vetor B de dimenso n, e resolver o seguinte sistema:

  • Captulo VI Variveis Indexadas6.1 A necessidade de variveis indexadas6.2 Vetores e matrizes6.3 Aplicaes com vetores numricos6.4 Aplicaes com matrizes numricas6.5 Cadeias de caracteres6.6 Aplicaes com vetores de cadeias de caracteres

  • 6.5 Cadeias de Caracteres6.5.1 Cadeias de caracteres como variveis e constantes

    Vetores de caracteres so denominados cadeias de caracteres (strings, em Ingls)

    Podem ser manipulados de forma diferenciada em relao aos vetores numricos, pela maioria das linguagens de programao

    Tudo comea pela existncia de constantes do tipo cadeia de caracteres, mas no de constantes vetores numricos

  • Constante cadeia de caracteres uma sequncia de caracteres delimitada por aspas (), como por exemplo:

    abc DEF

    Os componentes dessa constante so os caracteres da sequncia, sem as aspas, e mais o caractere \0, que o finalizador da cadeia

    Ento, os caracteres componentes da constante anterior so:

    a, b, c, , D, E, F e \0

  • A declarao sem inicializao de uma varivel cadeia de caracteres pode ser feita da mesma forma que a de vetores numricos

    Exemplo: char cad[30];

    Mas a declarao com inicializao pode ser feita da seguinte maneira:

    char cad[] = ABCDE;

    que equivalente s seguintes:

    char cad[] = {A, B, C, D, E, \0};char cad[6] = ABCDE;char cad[6] = {A, B, C, D, E, \0};

  • char cad[] = ABCDE;

    Esta declarao reserva espao na memria para os elementos cad[0], cad[1], cad[2], cad[3], cad[4] e cad[5]

    e coloca neles os caracteres A, B, C, D, E, \0

    Representao grfica:

  • Tal como em vetores numricos, os elementos de uma cadeia de caracteres podem ser referenciados individualmente

    Exemplos: cad[3] = b; y = cad[i+1];

    A seguinte atribuio no permitida:

    cad = xyzwt;

    Porm, se cad for declarada como sendo do tipo ponteiro para caracteres, isso ser permitido

  • 6.5.2 Leitura e escrita de cadeias de caracteres

    O formato %s pode ser usado nas funes printf e scanf para fazer escrita e leitura de valores de variveis do tipo cadeia de caracteres

    Funo printf:

    O formato %s faz com que os caracteres da varivel sejam escritos na tela at que o caractere \0 seja encontrado, no sendo ele escrito

    Por exemplo, os comandos:char cad[10] = ABCDE;printf (%s, cad);escrevero na tela:ABCDE

  • Se a varivel cad no contiver o caractere \0:

    printf continuar escrevendo todos os caracteres encontrados pela frente, invadindo locais reservados para outras finalidades, at encontrar um byte que contenha \0

  • Funo scanf :

    O formato %s procura no buffer do teclado o primeiro caractere diferente do espao em branco, do enter e da tabulao

    Ao encontr-lo, scanf passa a transportar para a varivel alvo da leitura todos os caracteres do buffer, at encontrar um caractere espao em branco, um enter ou uma tabulao

    Da, em vez de transportar o espao em branco, a tabulao ou o enter, scanf coloca na varivel o finalizador \0, encerrando a leitura para essa varivel

  • Exemplo: seja o seguinte trecho de programa:

    char cad[20], c;scanf ("%s%c", cad, &c);printf ("\ncadeia lida:%s; caractere lido:%d", cad, c);

    Se o operador digitar ABCDE FGHASCII ( ) = 32Se o operador digitar 4 espaos e o enter: o buffer se esvaziar e o computador ficar esperando nova digitao encerrada por enterNo usar &cad

    O nome de uma varivel indexada por si s um endereo (cf. ponteiros)

  • Cuidado: na leitura de uma varivel cadeia de caracteres, o nmero de caracteres digitados no deve exceder o espao reservado para ela

    Exemplo experimental: seja o seguinte trecho de programa:char a, b, c, d, cad[5]; int i;printf ("Digite uma cadeia de caracteres:\n\n");scanf ("%s", cad);printf ("\ncadeia lida:%s", cad);printf ("\n\na=%d; b=%c; c=%c; d=%c;\n", a, b, c, d);for (i = 0; i

  • char a, b, c, d, cad[5]; int i;printf ("Digite uma cadeia de caracteres:\n\n");scanf ("%s", cad);printf ("\ncadeia lida:%s", cad);printf ("\n\na=%d; b=%c; c=%c; d=%c;", a, b, c, d);for (i = 0; i
  • Funo gets :

    A funo scanf usando o formato %s encerra a leitura de uma cadeia quando encontra um espao em branco

    Ento, cadeias contendo espaos em branco no podem ser lidas por ela

    No entanto, o arquivo stdio.h da biblioteca de C tem a funo gets que resolve esse problema

    Ela recebe como argumento a varivel do tipo cadeia para a qual se deseja fazer a leitura

    Seu retorno, que no momento no tem relevncia, um ponteiro (assunto a ser estudado em captulo especfico)

  • #include #include typedef char cadeia[50];int main ( ) {int i, n; cadeia frases [10];printf ("Numero de frases (ate 10): ");scanf ("%d", &n);printf ("\n");for (i = 0; i
  • #include #include typedef char cadeia[50];int main ( ) {int i, n; cadeia frases [10];printf ("Numero de frases (ate 10): ");scanf ("%d", &n);printf ("\n");for (i = 0; i

  • Funo fgets :

    uma verso da funo gets, s que para leitura em arquivos

    Pertence ao arquivo stdio.h da biblioteca de C

    Chamada de fgets:

    fgets (cad, expr, filein);

    cad: varivel cadeia para a qual se deseja fazer a leiturafilein: varivel FILE de onde fazer a leituraexpr: a funo para de ler quando interar expr-1 caracteres lidos ou quando encontrar enter

    Quando lido o enter, ele colocado em cad antes do \0

  • #include #include #include typedef char cadeia[50];int main ( ) {int i, j, n, Num[10]; cadeia frases [10]; FILE *filein; filein = fopen ("filefrases", "r");fscanf (filein, "%d", &n);for (i = 0; i
  • #include #include #include typedef char cadeia[50];int main ( ) {int i, j, n, Num[10]; cadeia frases [10]; FILE *filein; filein = fopen ("filefrases", "r");fscanf (filein, "%d", &n);for (i = 0; i
  • #include #include #include typedef char cadeia[50];int main ( ) {int i, j, n, Num[10]; cadeia frases [10]; FILE *filein; filein = fopen ("filefrases", "r");fscanf (filein, "%d", &n);for (i = 0; i
  • 6.5.3 Funes para converso de cadeias de caracteres

    Funo atoi (ASCII to int): converte uma cadeia de caracteres no inteiro correspondente

    Funo atof (ASCII to float): converte uma cadeia de caracteres no real correspondente

    Funo itoa (int to ASCII): converte um inteiro numa cadeia de caracteres correspondente, especificada a base numrica para a escrita

  • Funo atoi: converte uma cadeia de caracteres no inteiro correspondente:

    #include #include typedef char cadeia[50];int main ( ) {int i; char c; cadeia cad;printf ("Converter cadeia em inteiro? (s/n): "); scanf ("%c", &c); while (c == 's' || c == 'S') { printf ("\n\tDigite a cadeia: "); scanf ("%s", cad); i = atoi (cad);printf ("\tatoi (\"%s\") = %d", cad, i);printf ("\n\nConverter cadeia em inteiro? (s/n): "); scanf (" %c", &c); }printf ("\n\n"); system ("pause"); return 0;}

    Exemplo: seja o seguinte programaConverter cadeia em inteiro? (s/n): s

    Digite a cadeia: 728391 atoi ("728391") = 728391

    Converter cadeia em inteiro? (s/n): s

    Digite a cadeia: pe182 atoi ("pe182") = 0

    Converter cadeia em inteiro? (s/n): s

    Digite a cadeia: 625xyz atoi ("625xyz") = 625

    Converter cadeia em inteiro? (s/n): nResultado de uma execuo

  • Funo atof: converte uma cadeia de caracteres no real correspondente:

    #include #include typedef char cadeia[50];int main ( ) {float x; char c; cadeia cad;printf ("Converter cadeia em real? (s/n): "); scanf ("%c", &c); while (c == 's' || c == 'S') { printf ("\n\tDigite a cadeia: "); scanf ("%s", cad); x = atof (cad);printf ("\tatof (\"%s\") = %lf", cad, x);printf ("\n\nConverter cadeia em real? (s/n): "); scanf (" %c", &c); }printf ("\n\n"); system ("pause"); return 0;}Exemplo: seja o seguinte programaConverter cadeia em real? (s/n): s

    Digite a cadeia: 52.1753 atof ("52.1753") = 52.1753

    Converter cadeia em real? (s/n): s

    Digite a cadeia: 167.23e32 atof ("167.23e32") = 1.6723e+34

    Converter cadeia em real? (s/n): s

    Digite a cadeia: 0.0012e-15 atof ("0.0012e-15") = 1.2e-18

    Converter cadeia em real? (s/n): nResultado de uma execuo

  • Funo itoa: converte um inteiro numa cadeia de caracteres correspondente, especificada a base numrica para a escrita:

    #include #include typedef char cadeia[50];int main ( ) {int i, base; char c; cadeia cad;printf ("Converter inteiro em cadeia? (s/n): "); scanf ("%c", &c); while (c == 's' || c == 'S') { printf ("\n\tDigite o int e a base: "); scanf ("%d%d", &i, &base); itoa(i, cad, base);printf ("\t(%d)10 = (\"%s\")%d", i, cad, base);printf ("\n\nConverter inteiro em cadeia? (s/n): "); scanf (" %c", &c);}printf ("\n\n"); system ("pause"); return 0;}Exemplo: seja o seguinte programaConverter inteiro em cadeia? (s/n): s

    Digite o int e a base: 2561 10 (2561)10 = ("2561")10

    Converter inteiro em cadeia? (s/n): s

    Digite o int e a base: 87 8 (87)10 = ("127")8

    Converter inteiro em cadeia? (s/n): s

    Digite o int e a base: 2871936 16 (2871936)10 = ("2bd280")16

    Converter inteiro em cadeia? (s/n): nResultado de uma execuo

  • 6.5.4 Funes para manipulao de cadeias de caracteres

    Funo strlen (string length): nmero de caracteres de uma cadeia

    Funo strcat (string concatenation): concatena 2 cadeias de caracteres

    Funo strcmp (string comparision): compara lexicograficamente 2 cadeias de caracteres

    Funo strcpy (string copy): copia o contedo de uma cadeia de caracteres em outra

    As 4 funes pertencem ao arquivo string.h da biblioteca

  • Funo strlen:

    Seu argumento uma cadeia de caracteres

    Retorna o nmero de caracteres de seu argumento, sem contabilizar o finalizador \0

    A seguir, modificao do programa das frases digitadas, com a contagem dos caracteres de cada uma

  • #include #include #include typedef char cadeia[50];int main ( ) {int i, n; cadeia frases [10];printf ("Numero de frases (ate 10): "); scanf ("%d", &n);printf ("\n");for (i = 0; i
  • Funo strcat:

    Faz a concatenao de 2 cadeias recebidas como argumentos

    Ela concatena o segundo argumento no primeiro

    O primeiro argumento deve ser uma varivel cadeia de caracteres

    O segundo argumento deve ser uma varivel ou uma constante do mesmo tipo

    Depois de executada a funo, o primeiro argumento guardar a concatenao e o segundo permanecer inalteradoVer o programa a seguir

  • #include #include #include typedef char cadeia[50];int main ( ) {cadeia cad1, cad2;printf ("Digite uma cadeia: "); gets (cad1);printf ("Digite outra cadeia: "); gets (cad2);printf ("\nAntes da Concatenacao:");printf ("\n\n\tcad1: %s\n\tcad2: %s", cad1, cad2);strcat (cad1, cad2); printf ("\n\nDepois de strcat (cad1, cad2):");printf ("\n\n\tcad1: %s\n\tcad2: %s", cad1, cad2);strcat (cad1, "ijk"); printf ("\n\nDepois de strcat (cad1, \"ijk\"):");printf ("\n\n\tcad1: %s\n\tcad2: %s", cad1, cad2); printf ("\n\n"); system ("pause"); return 0;}Digite uma cadeia: abcdeDigite outra cadeia: fgh

    Antes da Concatenacao:

    cad1: abcde cad2: fgh

    Depois de strcat (cad1, cad2):

    cad1: abcdefgh cad2: fgh

    Depois de strcat (cad1, "ijk"):

    cad1: abcdefghijk cad2: fgh

    Pressione ...

  • Funo strcmp:

    Compara lexicograficamente 2 cadeias recebidas como argumentos

    Os 2 argumentos podem ser variveis ou constantes do tipo cadeia de caracteres

    strcmp retorna um valor inteiro menor, igual ou maior que zero, dependendo do primeiro argumento ser menor, igual ou maior lexicograficamente que o segundoVer o programa a seguir

  • #include #include typedef char cadeia[50];int main ( ) {cadeia cad1, cad2; char c;printf ("Comparar cadeias? (s/n): ");do scanf ("%c", &c); while (c != 's' && c != 'S' && c != 'n' && c != 'N');while (c == 's' || c == 'S') {printf ("\nDigite as cadeias: "); scanf ("%s%s", cad1, cad2);if (strcmp (cad1, cad2) < 0)printf ("\n\t%s eh lexicograficamente menor que %s", cad1, cad2);else if (strcmp (cad1, cad2) == 0)printf ("\n\t%s eh lexicograficamente igual a %s", cad1, cad2);else printf ("\n\t%s eh lexicograficamente maior que %s", cad1, cad2);printf ("\n\nComparar mais cadeias? (s/n): ");do scanf ("%c", &c); while (c != 's' && c != 'S' && c != 'n' && c != 'N');}printf ("\n\n"); system ("pause"); return 0;}A seguir, o resultado de uma execuo

  • Comparar cadeias? (s/n): s

    Digite as cadeias: Alfredo Maria

    Alfredo eh lexicograficamente menor que Maria

    Comparar mais cadeias? (s/n): s

    Digite as cadeias: Carlos Carlos

    Carlos eh lexicograficamente igual a Carlos

    Comparar mais cadeias? (s/n): s

    Digite as cadeias: Fausto Bianca

    Fausto eh lexicograficamente maior que Bianca

    Comparar mais cadeias? (s/n): s

    Digite as cadeias: Nivaldo nivaldo

    Nivaldo eh lexicograficamente menor que nivaldo

    Comparar mais cadeias? (s/n): n

  • Funo strcpy:

    Recebendo duas cadeias como argumentos, strcpy copia a segunda para a primeira

    O primeiro argumento deve ser uma varivel cadeia de caracteres

    O segundo argumento deve ser uma varivel ou uma constante do mesmo tipo

    Depois de executada a funo, o primeiro argumento guardar uma cpia do segundo e esse ltimo permanecer inalteradoVer o programa a seguir

  • #include #include #include typedef char cadeia[50];int main ( ) {cadeia cad1, cad2;printf ("Digite uma cadeia para cad2: "); gets (cad2);strcpy (cad1, cad2);printf ("\nDepois da Copia de cad2 para cad1:");printf ("\n\ncad1: %s\ncad2: %s", cad1, cad2);strcpy (cad2, "xyz");printf ("\n\nDepois da Copia de \"xyz\" para cad2:");printf ("\n\ncad1: %s\ncad2: %s", cad1, cad2);printf ("\n\n"); system ("pause"); return 0;}Resultado de uma execuoDigite uma cadeia para cad2: abcde

    Depois da Copia de cad2 para cad1:

    cad1: abcdecad2: abcde

    Depois da Copia de "xyz" para cad2:

    cad1: abcdecad2: xyz

    Pressione ...

  • Captulo VI Variveis Indexadas6.1 A necessidade de variveis indexadas6.2 Vetores e matrizes6.3 Aplicaes com vetores numricos6.4 Aplicaes com matrizes numricas6.5 Cadeias de caracteres6.6 Aplicaes com vetores de cadeias de caracteres

  • 6.6 Aplicaes com Vetores de Cadeias de Caracteres6.6.1 Bubble-sort para vetores de nomes

    O programa do Bubble-Sort para vetores numricos pode ser adaptado para ordenar vetores de cadeias de caracteres

    Os elementos do vetor devem ser nomes (cadeias de caracteres)

    A leitura e a escrita dos elementos utilizam o formato %s

    A comparao de dois nomes feita com a funo strcmp e as atribuies entre elementos so feitas pela funo strcpy

  • #include #include #include

    /*Criacao do tipo logic e suas constantes*/

    typedef char logic;const logic false = 0, true = 1;

    /*Criacao do tipo nome*/

    typedef char nome[15];

    /*Cabecalho e declaraes locais*/

    int main () {int n, i, p; logic trocou; nome V[50], aux;Programa do Bubble-Sort para nomes

  • /*Leitura do vetor de nomes a ser ordenado*/

    printf ("Ordenacao de nomes pelo Bubble-Sort\n\n");printf ("\tNumero de nomes do vetor: "); scanf ("%d",&n);printf ("\n\tNomes: ");for (i = 0; i < n; i++) scanf("%s", V[i]);

    /*Escrita do vetor desordenado*/

    printf ("\n\nVetor desordenado:\n");for (i = 0; i < n; i++) printf("\n%s", V[i]);

  • /*Aplicao do metodo bubble-sort*/

    for (trocou = true, p = n-2; p >= 0 && trocou == true; p--) {for (trocou = false, i = 0; i 0) {strcpy(aux, V[i]); strcpy(V[i], V[i+1]);strcpy(V[i+1], aux); trocou = true;}}

    /*Escrita do vetor ordenado*/

    printf ("\n\nVetor ordenado:\n");for (i = 0; i < n; i++) printf("\n%s", V[i]);

    /*Fechamento da tela*/

    printf ("\n\n"); system ("pause"); return 0;}

  • 6.6.2 Procura binria em vetores de nomes

    O programa da Procura Binria para vetores numricos pode ser adaptado para procurar nomes em vetores de nomes

    Os elementos do vetor devem ser nomes (cadeias de caracteres)

    O elemento a ser procurado deve ser um nome

    A comparao do nome procurado com os elementos do vetor feita com a funo strcmp

    A seguir, um programa da procura binria para nomes

  • /*Diretivas de preprocessamanto e declaracoes*/

    #include #include #include

    typedef char logic;const logic false = 0, true = 1;typedef char nome[15];

    int main () {int n, i, inf, sup, med;nome V[50], nome;logic achou, erro;char c;

  • /*Leitura dos elementos do vetor*/

    printf ("PROCURA BINARIA EM VETORES DE NOMES\n\n");printf ("Numero de nomes do vetor: "); scanf ("%d", &n);printf ("\nNomes: ");for (i = 0; i < n; i++) scanf ("%s", V[i]);

    /*Verificacao da ordenacao do vetor*/

    for (i = 0, erro = false; i < n-1 && erro == false; i++)if (strcmp(V[i], V[i+1]) > 0) erro = true;if (erro == true)printf ("\n\tRelacao desordenada: nao havera procuras\n");

  • /*Secao de procuras*/

    else {clrscr ();printf ("Secao de Procuras:\n\n");printf ("Procurar nome (s/n)?: ");do c = getche();while (c != 's' && c != 'n' && c != 's' && c != 'n');while (c == 's' || c == 'S') {printf ("\n\n\tNome: "); scanf ("%s", nome);

  • /*Procura de um numero no vetor*/

    achou = false; inf = 0; sup = n - 1;do {med = (inf + sup) / 2;if (strcmp(nome, V[med]) == 0) achou = true;else if (strcmp(nome, V[med]) < 0) sup = med - 1;else inf = med + 1;} while (!achou && inf

  • /*Emissao do resultado da procura */

    if (achou)printf ("\n\t%s estah na posicao %d da relacao\n\n", nome, med);elseprintf ("\n\t%s nao estah na relacao\n\n",nome);printf ("Procurar outro numero (s/n)?: ");do c = getche();while (c != 's' && c != 'n' && c != 's' && c != 'n');}}

    /*Fechamento da tela*/

    printf ("\n\n"); system ("pause");return 0;}

  • 6.6.3 Limpeza de textos

    Seja um arquivo-texto contendo cadeias de caracteres imprimveis separadas umas das outras por um ou vrios espaos em brancos e/ou enters

    O programa a seguir produz outro arquivo contendo uma cpia de cada cadeia do primeiro que for uma sequncia somente de letras ou somente de dgitos decimais

    Cadeias contendo simultaneamente letras e dgitos decimais no devem fazer parte do novo arquivo

    Entre as cadeias do novo arquivo deve haver apenas um espao

  • Exemplo:

    Se o contedo do arquivo original textoin.dat for:

    %&() bxnDJk 953481 B 1 123h asdf8 ; ABCDEfg

    Ento o novo arquivo textout.dat dever conter:

    bxnDJk 953481 B 1 ABCDEfg

  • #include #include #include #include

    /*Declaracao dos tipos e constantes logicas e do tipo cadeia*/

    typedef char logic;const logic TRUE = 1, FALSE = 0;typedef char cadeia[50];

    /*Cabecalho e declaracoes locais*/

    int main () {int n, i; logic erro;cadeia cad;FILE *fin, *fout;

  • /*Abertura dos arquivos de entrada e de saida*/

    fin = fopen ("textoin.dat", "r");fout = fopen ("textout.dat", "w");

    /*Leitura de uma cadeia do arquivo de entrada e teste de fim de arquivo */

    while (fscanf(fin, "%s", cad) == 1) {erro = FALSE;

    /*Se o primeiro caractere da cadeia for letra, os outros tambem devem ser */

    if (isalpha (cad[0])) {for (i = 1, n = strlen (cad); i < n && !erro; i++)if (! isalpha (cad[i])) erro = TRUE;}

  • /*Se o primeiro caractere da cadeia for digito, os outros tambem devem ser*/

    else if (isdigit (cad[0])) {for (i = 1, n = strlen (cad); i < n && !erro; i++)if (! isdigit (cad[i])) erro = TRUE;}

    /*Se o primeiro caractere da cadeia nao for letra nem digito: erro*/

    else erro = TRUE;

    /*Se nao ha erro na cadeia, escreve-la no arquivo de saida*/

    if (! erro) fprintf (fout, "%s ", cad);}printf ("\n\n"); system ("pause"); return 0;}

  • Exerccios 6.6:

    Escrever um programa para ler vrias cadeias de 16 caracteres encerradas por um enter; para cada cadeia:Encar-la como a representao binria em complemento de 2 de um nmero inteiro no intervalo [-32768 .. 32767]Verificar se ela realmente uma tal representao; se for, encontrar e escrever o nmero correspondente na base 10 (no esquecer que o nmero pode ser negativo); seno, emitir uma mensagem de erroCalcular e escrever, na base 10, a somatria dos nmeros encontradosObs.: A cadeia de caracteres estar errada se no tiver exatamente 16 caracteres ou se tiver algum caractere diferente de 0 e de 1.