Linguagem C_Exercicios Propostos Solucao_8

Page 1


8.1

Linguagem C

25.ª Edição Atualizada e Aumentada FCA Editora (c) 2025

8

EXERCÍCIOS PROPOSTOS – SOLUÇÃO

Usando s Usando ptr Valor

s[2] ou *(s+2) ptr[2] ou *(ptr+2) 'r'

s ou &s[0] ptr

s+1 ou &s[1] ptr+1

(não aplicável) &ptr

8.2

8.3

8.2.1 O operador & (“endereço de”).

8.2.2 O caráter asterisco (*).

8.2.3 Coloca-se entre o tipo para que aponta e o nome da variável.

8.2.4 Um endereço de memória (ou NULL ).

8.2.5 NULL .

8.2.6 Designa-se por “apontado por” e representa-se através de um asterisco (*).

8.2.7 *(&ptr) == ptr

8.2.8 v [0] ou *v

8.2.9 Porque os elementos de qualquer array ocupam sempre posições contíguas de memória.

8.2.10 float **var.

8.3.1 1: #include <stdio.h> 2: #include <string.h> 3: 4: char *my_strrchr(char *str, int ch) /* Versão 1 - Do início para o fim */ 5: { 6: char *ptr = NULL; 7: for (int i=0; str[i]!='\0'; i++) 8: if (str[i]==ch) 9: ptr=&str[i]; // ptr = str+i; 10: 11: return ptr; 12: } 13: 14: char *my_strrchr_alt(char *str, char ch) /* Versão 2 - Do fim para o início */ 15: { 16: char *ptr = str + strlen(str)-1; /* Colocar no último char útil da string */ 17: while (ptr >= str)

18: if (*ptr==ch)

19: return ptr;

20: else

21: ptr--;

22:

23: return NULL;

24: }

25:

26: int main(void)

27: {

28: char nome[100];

29: char *apelido = NULL;

30: printf("Introduza um nome: "); gets(nome); 31:

32: apelido = strrchr(nome, ' ');

33: if (apelido==NULL) /* Não tem apelido. Não existe o espaço */

34: apelido=nome;

35: else

36: apelido++; /* Pois estava a apontar o espaço em branco */

37:

38: printf("Apelido: [%s]\n", apelido);

39: return 0;

40: }

8.3.2

1: #include <stdio.h>

2: #include <string.h>

3: #define MAX_STR 50

4:

5: char *my_strstr(char *str1, char *str2)

6: {

7: int len_search = strlen(str1)-strlen(str2); 8: int len_str2 = strlen(str2);

9:

10: for (int i=0 ; i<=len_search ; i++)

11: if (strncmp(str1+i, str2, len_str2)==0)

12: return str1+i;

13: return NULL;

14: }

15:

16: int main(void)

17: { 18: char str[MAX_STR], search[MAX_STR]; 19: char *ptr_found=NULL;

20:

21: puts(">>> Termine o programa com strings vazias <<<"); 22:

23: while (1)

24: {

25: printf("String principal : "); gets(str); 26: printf("String a procurar: "); gets(search);

27: if (str[0]=='\0' && search[0]=='\0')

28: break;

29:

30: if ((ptr_found=my_strstr(str, search))==NULL)

31: printf("\n\nString não encontrada\n\n");

32: else

33: printf("String [%s] encontrada em [%s]\n\n", search, ptr_found);

34: }

35:

36: return 0;

37: }

PROG0812.C

PROG0811.C

8.4

8.3.3

char *first_vogal(char *s)

{ const char vogais[] = "aeiou"; for (int i=0 ; s[i]!='\0'; i++) if (strchr(vogais, tolower(s[i]))!=NULL) return s+i; // &s[i]

return NULL; }

8.3.4

1: #include <stdio.h>

2: #include <string.h>

3:

4: char *strrcpy(char *dest, char *orig)

5: { 6: for (int len = strlen(orig); len>=0 ; len--)

7: dest[len]=orig[len];

8: return dest;

9: }

10:

11: char *str_ins(char *dest, char *orig)

12: { 13: strrcpy(dest+strlen(orig), dest);

14: memcpy(dest, orig, strlen(orig)); 15: return dest;

16: }

17:

18: int main(void)

19: {

20: char s[100] = "Gama";

21:

22: str_ins(s, "Beta");

23: printf("%s\n", s); // BetaGama 24:

25: str_ins(s, "Alfa");

26: printf("%s\n", s); // AlfaBetaGama

27:

28: return 0; 29: }

PROG0813.C

Na resolução deste exercício, foi necessário implementar uma função que realize a cópia do final para o início da string , uma vez que ela poderá ter de ser copiada para cima dela própria. Começa-se por copiar a string existente no destino para a posição strlen(orig), pois a string de origem irá ocupar strlen(orig) carateres na string dest . Depois, usa-se a função memcpy, e não a função strcpy, para copiar a string orig para dest , porque a função memcpy não coloca o terminador '\0', que iria apagar o primeiro caráter da string dest anterior, terminando, aí, a string resultado.

8.4.1

pv=v

ppv=&pv;

8.5

8.4.2 v

8.6

8.4.3

A única restrição em relação aos endereços a usar é que todos os elementos do array fiquem em posições contíguas de memória.

1: #include <stdio.h>

2: #include <string.h>

3: 4: int main(void)

5: {

6: int v[5] = {10, 20, 30, 40, 50}; // Array com 5 inteiros

7: int *pv; // Pointer para inteiro

8: int **ppv; // Pointer para Pointer para inteiro

9: 10: pv = v; 11: ppv = &pv;

12: 13: printf("%d %d %d\n", v[0] , *pv , **ppv); 14: printf("%d %d %d\n", v[1] , *(pv+1) , *((*ppv)+1)); 15: printf("%d %d %d\n", v[2] , *(pv+3) , *((*ppv)+4)); 16: printf("%d %d %d\n", v[0]-1 , *(pv+1)-1 , *((*ppv)+2)-1); 17: 18: return 0; 19: }

8.4.4 Colocaria no ecrã, usando os endereços apresentados no Exercício 8.4.2:

100 500 700

char *StrDelUpper(char *s) // ver prog0815.c { char *prim, *ptr; prim = ptr = s; while (*s) /* Equivalente a while (*s!='\0') */ { if (!isupper(*s)) *ptr++=*s; s++; } *ptr='\0'; return prim; }

char *StrDelStr(char *s1, char *s2) // ver prog0815.c { char *loc = strstr(s1, s2); if (loc!=NULL) /* Se s2 existir em s1 */ strcpy(loc, loc+strlen(s2)); return s1; }

PROG0814.C

8.7

1: #include <stdio.h>

2: #include <string.h>

3: #include <ctype.h>

4:

5: char *StrDelUpper(char *s)

6: { char *prim, *ptr; 7: prim = ptr = s;

8:

9: while (*s) /* Equivalente a while (*s!='\0') */ 10: { if (!isupper(*s))

11: *ptr++=*s; 12: s++; 13: }

14: *ptr='\0'; 15: return prim; 16: } 17:

18:

19: char *StrDelStr(char *s1, char *s2)

20: { 21: char *loc = strstr(s1, s2);

22: if (loc!=NULL) /* Se s2 existir em s1 */ 23: strcpy(loc, loc+strlen(s2)); 24: return s1;

25: }

26:

27: int main(void)

28: { 29:

30: char mix[] = "Alfa_BETA_GaMa?~deltA";

31: char s[] = "O rato roeu a rolha da garrafa de rum do rei da Rússia";

32:

33: printf("Apagar maiúsculas em [%s]\n", mix);

34: printf("[%s]\n\n", StrDelUpper(mix));

35:

36: printf("Apagar [xy]: %s\n", StrDelStr(s, "xy"));

37: printf("Apagar [ra]: %s\n", StrDelStr(s, "ra"));

38:

39: return 0;

40: }

8.7.1 px = &x; py = &y;

8.7.2

PROG0815.C

8.8

8.7.3 Se se fizer px = py, então:

y 3

py

px

x 2

8.9

char *Second(char *s)

{ if (*s=='\0') return NULL; /* String Vazia */ return strchr(s+1, *s); }

char *Up_Down(char *s)

{ char *ptr=s; while (*ptr!='\0') { if (((ptr-s) %2)==0) /* Se for um índice par */ *ptr = toupper(*ptr); else *ptr = tolower(*ptr); ptr++; } return s; }

Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.