Funções & Strings:

Implemente as funções especificadas abaixo:

OBS: Não é para usar as funções do <string.h>. Você só pode usar as funções que tiver implementado. Por questões de simplicidade, assuma o padrão ASCII.

1) void InverteString(char str[]);

Altera a própria string str de modo que ela fica invertida.
Exemplo: Se inicialmente temos:
    str="PAMELA SILVA", no final teremos:
    "AVLIS ALEMAP" em str.
/* função auxiliar */
int TamanhoString(char str[]){
  int i = 0;
  while(str[i] != '\0'){
    i++;
  }
  return i;
}

void InverteString(char str[]) {
  int i,j;
  char tmp;
  
  j = TamanhoString(str) - 1;
  i = 0;

  while (i < j) {
    tmp = str[i];
    str[i] = str[j];
    str[j] = tmp;
    i++;
    j--;
  }
}
  

2) void InvertePalavras(char str[]);

Altera a própria string str de modo que todas as suas palavras individualmente ficam invertidas.
Exemplo: Se inicialmente temos:
    str="PAMELA SILVA", no final teremos:
    "ALEMAP AVLIS" em str.
/* função auxiliar */
void InverteSubString(char str[], int i, int j){
  char tmp;
  
  while (i < j) {
    tmp = str[i];
    str[i] = str[j];
    str[j] = tmp;
    i++;
    j--;
  }
}

void InvertePalavras(char str[]){
  int i, j;
  i = 0;
  do {
    while(str[i] == ' ') i++;
    j = i;

    while(str[j] != '\0' && str[j] != ' ') j++;

    j = j - 1;
    if(i < j) InverteSubString(str, i, j);

    i = j + 1;
  } while (str[i] != '\0');
}
  

3) void ReduzEspacos(char dest[], char src[]);

Gera em dest uma cópia de src porém eliminando o excesso de espaços em branco, de modo que todas as sequências de espaços em branco consecutivos são convertidas em um único caracter de espaço. Assuma que o vetor dest é grande o suficiente para conter o resultado.
Exemplo: Se inicialmente temos:
    src = "     Problema       de     Strings  ", no final teremos:
    dest = " Problema de Strings ".
void ReduzEspacos(char dest[], char src[]){
  int i, j;
  char t;
  i = 0;
  j = 0;
  while(src[i] != '\0'){
    if(src[i] != ' '){
      t = src[i];
      i++;
    }
    else {
      t = src[i];
      while(src[i] == ' ') i++;
    }
    dest[j] = t;
    j++;
  }
  dest[j] = '\0';
}
  

4) void ProcuraEmail(char dest[],char src[]);

Busca em src por possíveis candidatos a endereços de e-mail. Copia em dest a primeira sequência de caracteres não brancos encontrada que contenha o caracter '@', ou uma string vazia caso contrário. Assuma que o vetor dest é grande o suficiente para conter a palavra encontrada.
Exemplo:
Para src="Enviar mensagem para lucas@ig.com.br ou para outro moderador"
temos "lucas@ig.com.br" que ficará em dest.
/* função auxiliar */
void GetSubString(char dest[], char src[],
		  int begin, int end){
  int i,j;
  j = 0;
  for(i = begin; i <= end; i++){
    dest[j] = src[i];
    j++;
  }
  dest[j] = '\0';
}

void BuscaEmail(char dest[], char src[]){
  int i,b,e;
  i = 0;
  while(src[i] != '\0'){
    if(src[i] == '@')
      break;
    i++;
  }
  /* Nenhum email encontrado */
  if(src[i] == '\0'){
    dest[0] = '\0';
    return;
  }
  b = e = i;
  while(b > 0){
    if(src[b-1] == ' ') break;
    b--;
  }

  while(src[e+1] != ' ' && src[e+1] != '\0')
    e++;
  GetSubString(dest, src, b, e);
}
  

Exemplo de função principal main:

#include <stdio.h>

/* Inserir nesse ponto o código das funções anteriores */


int main(){
  char str1[] = "PAMELA SILVA";
  char str2[] = "PAMELA SILVA";
  char str3[] = "Enviar mensagem para lucas@ig.com.br ou para outro moderador";
  char email[500];
  char B[500];

  InverteString(str1);
  printf("%s.\n", str1);

  InvertePalavras(str2);
  printf("%s.\n", str2);

  ReduzEspacos(B, "     Problema       de     Strings  ");
  printf("%s.\n", B);

  BuscaEmail(email, str3);
  printf("Email: %s.\n",email);
  
  return 0;
}
  

Alocação Dinâmica & Strings:

Para uma dada string, contendo uma linha de texto, faça uma função em C que separa cada palavra do texto:
A função deve devolver o endereço de um vetor de apontadores criado dinamicamente com tamanho igual ao número de palavras do texto. Os apontadores desse vetor devem apontar para cópias das palavras do texto. Cada cópia deve ser amazenada em um vetor alocado dinamicamente, usando a menor quantidade de memória possível.

Use o protótipo abaixo:

char **VetorDePalavras(char texto[], int *npal);

onde npal aponta para uma variável que irá guardar o número de palavras encontradas.

Exemplo:
Para o texto de entrada: "A primeira Guerra Mundial    completa 100 anos em 2014", no final teremos os seguintes vetores alocados:

#include <stdio.h>
#include <stdlib.h>


char **ListaPalavras(char texto[], int *npalavras){
  char **L = NULL;
  int i,j,tam,npal,inic;
  char *pal;

  /* Conta o numero de palavras. */
  i = 0;
  npal = 0;
  while(texto[i] != '\0'){
    while(texto[i] == ' ')
      i++;
    if(texto[i] != '\0'){
      npal++;
      while(texto[i] != ' ' && texto[i] != '\0')
        i++;
    }
  }
  *npalavras = npal;

  /* Aloca o vetor de apontadores. */
  L = (char **)malloc(npal*sizeof(char *));
  if(L == NULL){
    printf("Memoria insuficiente.\n");
    exit(1);
  }

  i = 0;
  j = 0;
  while(texto[i] != '\0'){
    while(texto[i] == ' ')
      i++;
    inic = i;
    while(texto[i] != ' ' && texto[i] != '\0')
      i++;

    tam = i - inic;
    if(tam > 0){
      pal = (char *)malloc(sizeof(char)*(tam+1));
      if(pal == NULL){
        printf("Memoria insuficiente.\n");
        exit(1);
      }
      L[j] = pal;
      i = inic;
      while(texto[i] != ' ' && texto[i] != '\0'){
        pal[i-inic] = texto[i];
        i++;
      }
      pal[i-inic] = '\0';
      j++;
    }
  }
  return L;
}

int main(){
  char texto[] = "A  primeira Guerra Mundial    completa 100 anos    em 2014";
  char **L;
  int n,i;

  L = ListaPalavras(texto, &n);

  printf("Lista de palavras:\n");
  for(i = 0; i < n; i++){
    printf("%s.\n",L[i]);
  }

  /* Libera memoria */
  for(i = 0; i < n; i++){ 
    free(L[i]);
  }
  free(L);

  return 0;
}
  

Estruturas & arquivos (modo texto)

Um triângulo pode ser representado pelas coordenadas reais (float) dos seus três vértices (Xa, Ya), (Xb, Yb), e (Xc, Yc). Escreva uma possível definição em C para as estruturas de um vértice e de um triângulo, e implemente as seguintes funções em C:

float Distancia(struct Vertice A, struct Vertice B);

Calcula a distância euclidiana entre os vértices (pontos) A e B.
OBS: Use a função float sqrtf(float x); para calcular a raiz quadrada.

float Perimetro(struct Triangulo T);

Calcula o perímetro do triângulo T.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

struct Vertice{
  float x;
  float y;
};

struct Triangulo{
  struct Vertice A;
  struct Vertice B;
  struct Vertice C;
};

float Distancia(struct Vertice A, struct Vertice B){
  float dx, dy, d;
  dx = (B.x - A.x);
  dy = (B.y - A.y);
  d = sqrtf(dx*dx + dy*dy);
  return d;
}


float Perimetro(struct Triangulo T){
  float d = 0.0;
  d += Distancia(T.A, T.B);
  d += Distancia(T.A, T.C);
  d += Distancia(T.B, T.C);
  return d;
}
  
Dado um arquivo texto "entrada.txt" que possui em sua primeira linha um inteiro que indica a quantidade de triângulos, e nas demais linhas os dados dos triângulos (um triângulo por linha segundo o formato: "Xa Ya Xb Yb Xc Yc"), conforme o exemplo:
5
0.0  0.0  0.0  1.0  1.0  0.0
0.0  0.0  0.0  0.1  0.1  0.0
2.0  2.0  3.0  2.0  2.5  3.0
2.0  2.0  2.1  2.0  2.05 2.1
8.0  1.0  7.0  3.0  2.0  1.0
Escreva um programa que: Exemplo do arquivo "saida.txt":
3
0.00 0.00 0.00 1.00 1.00 0.00
2.00 2.00 3.00 2.00 2.50 3.00
8.00 1.00 7.00 3.00 2.00 1.00
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/* Inserir nesse ponto o código das funções anteriores */


int main(){
  FILE *fp = NULL;
  struct Triangulo *T = NULL;
  int n, nn = 0, i;

  fp = fopen("entrada.txt", "r");
  if(fp == NULL){
    printf("Erro na leitura do arquivo.\n");
    exit(1);
  }
  fscanf(fp, "%d", &n);
  T = (struct Triangulo *)malloc(n*sizeof(struct Triangulo));
  if(T == NULL){
    printf("Memoria insuficiente.\n");
    exit(1);
  }
  for(i = 0; i < n; i++){
    fscanf(fp, "%f %f", &(T[i].A.x), &(T[i].A.y));
    fscanf(fp, "%f %f", &(T[i].B.x), &(T[i].B.y));
    fscanf(fp, "%f %f", &(T[i].C.x), &(T[i].C.y));

    if( Perimetro(T[i]) > 0.5 ) nn++;
  }
  fclose(fp);

  fp = fopen("saida.txt", "w");
  fprintf(fp, "%d\n", nn);
  for(i = 0; i < n; i++){
    if( Perimetro(T[i]) > 0.5 ){
      fprintf(fp, "%.2f %.2f ",  T[i].A.x, T[i].A.y);
      fprintf(fp, "%.2f %.2f ",  T[i].B.x, T[i].B.y);
      fprintf(fp, "%.2f %.2f\n", T[i].C.x, T[i].C.y);
    }
  }
  fclose(fp);
  free(T);

  return 0;
}