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.
void InverteString(char 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--; } }
void InvertePalavras(char 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'); }
void ReduzEspacos(char dest[], char src[]);
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'; }
void ProcuraEmail(char dest[],char src[]);
/* 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); }
#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; }
Use o protótipo abaixo:
char **VetorDePalavras(char texto[], int *npal);
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; }
float Distancia(struct Vertice A, struct Vertice B);
float sqrtf(float x);
para calcular a raiz quadrada.
float Perimetro(struct Triangulo 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.0Escreva um programa que:
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; }