Programação Imperativa

Soluções da aula prática 8



0. Faça uma função que retorna xn

float power(float x, int n)
/* solucao com ciclo */
{
  int i;
  float result;
  result = 1;
  for (i=1; i<=n; i++)
   result = result * x;
  return(result);
}

float power(float x, int n)
/* solucao recursiva */
{
  if (n==1)
    return(x)
  else
    return(x * power(x, n-1));
}



1.

#include <stdio.h>

void main()
{
  char frase[128];
  int p;
  int numpalavras;

  printf("Escreve uma frase:\n");
  gets(frase);
  p = 0;
  numpalavras = 1;
  while (frase[p] != '\0')
    {
      if (frase[p]==' ')
        numpalavras++;
      p++;
    }
  printf("Foram escritos %d palavras\n", numpalavras);
}

ou (para adeptos de C com apontadores):

void main()
{
  char frase[128];
  char *p;
  int numpalavras;

  printf("Escreve uma frase:\n");
  gets(frase);
  p = frase;
  numpalavras = 1;
  while (*p != '\0')
    {
      if (*p==' ')
        numpalavras++;
      p++;
    }
  printf("Foram escritos %d palavras\n", numpalavras);
}



2.
#include <stdio.h>

void main()
{
  char frase[128];
  char vogais[20] = "aAeEiIoOuU";
  int p;
  char c[2];
  int numvogais;

  printf("Escreve uma frase:\n");
  gets(frase);
  p = 0;
  numvogais = 1;
  while (frase[p] != '\0')
    {
      c[0]=frase[p];
       /* o caracter c esta dentro do string vogais?: */
      if (strstr(vogais, c))
        numvogais++;
      p++;
    }
  printf("Foram escritos %d vogais\n", numvogais);
}

Existe na bilbioteca tambem a função strchr que procura a posição de uma caracter dentro do string. Usanda esta função a solução seria

void main()
{
  char frase[128];
  char vogais[20] = "aAeEiIoOuU";
  int p;
  char c;
  int numvogais;

  printf("Escreve uma frase:\n");
  gets(frase);
  p = 0;
  numvogais = 1;
  while (frase[p] != '\0')
    {
      c=frase[p];
       /* o caracter c esta dentro do string vogais?: */
      if (strchr(vogais, c))
        numvogais++;
      p++;
    }
  printf("Foram escritos %d vogais\n", numvogais);
}



3.
Faz um programa que pergunte ao utilizador qual o seu nome próprio e qual o seu apelido. O programa deverá apresentar numa só linha o nome e apelido do utilizador.

Exemplo:

    Qual o primeiro nome (nome próprio) ?  Pedro
    Qual o último nome (apelido) ? Abrunhosa
    Pedro Abrunhosa

#include <strdio.h>
#include <string.h>

void main()
{
  char prop[128], nome[128];

  printf("Qual o primeiro nome (nome proprio) ? ");
  gets(prop);
  printf("Qual o ultimo nome (apelido) ? ");
  gets(nome);
  strcat(prop, " ");
  strcat(prop, nome);
  printf("%s", prop);
}



4.
Faz um programa que peça ao utilizador para introduzir um nome completo. O programa deverá formatar esse nome eliminando todos os "e", "da", "de" e "do", apresentar o nome formatado escrito apenas em maiúsculas, e dizer qual o tamanho do nome formatado (em caracteres).

Exemplo:

    Escreva um nome completo: Passos Dias de Aguiar e Mota
    PASSOS DIAS AGUIAR MOTA
    (23 caracteres)

#include <stdio.h>
#include <string.h>

void eliminate_characters(char *p, int n)
/************************************\
 *  eliminates n chars do string p  *
\************************************/
{
  do
    {
      p[0] = p[n];
      p++;
    }
  while (*p != '\0');
}

void main()
{
  char nome[128];
  int i, mudanca;
  char *p;

  printf("Escreva um nome completo :");
  gets(nome);

    /* convert to upperscript: */
  for (i=1; i<strlen(nome); i++)
    if ((nome[i]<='z') && (nome[i]>='a'))
      nome[i] = nome[i]-32;

   /* eliminate de, etc.: */
  mudanca=1;  /* houve mundancas na ultima passagem? */
  while (mudanca!=0)
    {
      mudanca=0;
      p = strstr(nome, " DE ");
      if (p!=0)
        {
          p++;  /* agora aponta "DE " dentro nome */
          eliminate_characters(p, 3);
          mudanca=1;
        }
      p = strstr(nome, " DA ");
      if (p!=0)
        {
          p++;  /* agora aponta "DA " dentro nome */
          eliminate_characters(p, 3);
          mudanca=1;
        }
    }
  printf("%s\n", nome);
  printf("(%d caracteres)\n", strlen(nome));
}



5
Exemplo:

    Escreva um nome completo: olinda   barba De jesus
    Olinda Barba de Jesus

#include <stdio.h>

void convert_to_uppercase(char *p)
/************************************\
 *  converts char *p to uppercase   *
\************************************/
{
   /* exemplo, A=65, a=97, B=66, b=98 .... */
  *p = *p-32;
}

void convert_to_lowercase(char *p)
/************************************\
 *  converts char *p to lowercase   *
\************************************/
{
  *p = *p+32;
}

void eliminate_character(char *p)
/************************************\
 *  eliminates 1 char do string p   *
\************************************/
{
  do
    {
      p[0] = p[1];
      p++;
    }
  while (*p != '\0');
}

void main()
{
  char nome[128];
  char *n;
  int inicio; /* estamos no inicio de uma palavra? 1=verdade */

  printf("Escreva um nome completo: ");
  gets(nome);
  n = nome;
  printf("nome: %s\n", n);
  inicio = 1;
  while (*n != '\0')
    {
      if (inicio==1)
       {
         inicio=0;
         if ((*n>='a') && (*n<='z'))
           convert_to_uppercase(n);
         else
          if (*n==' ')
            {
              eliminate_character(n);
              n--;
              inicio=1;
            }
       }
     else /* inicio==0 */
       {
         if (*n == ' ')
           inicio=1;
         if ((*n>='A') && (*n<='Z'))
           convert_to_lowercase(n);
       }
     n++;
    }
  printf("corrected: %s", nome);
}



6
/* TP8 ex.6
   ordenar nomes num array estático de 1 dimensão
   utiliza método de ordenação da burbulha ("bubble") esperto.
   solucao: Patricio Serendero */

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
/*----------------------var globais ----------------------*/
const int COL = 10;
const int LIN = 10;
char a[LIN][COL] = {"laranja", "uva", "pessego", "ameixa", "pera", "cereja",
   "banana", "limao", "tanjerina", "meloa"};

void ordena_array(void)
{
  int k, i; int resultado;
  char *s1, *s2;

  for (k=0; k<LIN; k++)       /*controla ciclo de todas as passadas */
  {
    for (i=0; i<(LIN-k-1); i++)
    {
      s1 = a[i]; s2 = a[i+1];
      resultado = strcmp(s1, s2);
      if (resultado > 0)        /*termina nos elementos já ordenados*/
        trocar(a[i], a[i+1]);
    }
  }
}

void trocar(char *primeiro, char *segundo)
  /*troca primeiro pelo segundo*/
{
  char temp[COL];

  strcpy(temp, segundo);
  strcpy(segundo, primeiro);
  strcpy(primeiro, temp);
}

void imprime_array(char vez)
{
  if (vez == '1')
    printf("\n\n conteúdo do array ANTES de ser ordenado: \n");
  else
    printf("\n\n conteúdo do array DEPOIS de ser ordenado: \n");

  for (int j=0; j < LIN; j++)
  {
    if (!(j % 4)) printf("\n");
      printf("%s  ", a[j]);
  }
}

void main()
{
  clrscr();
  imprime_array('1');
  ordena_array();
  imprime_array('2');
  getch();
}