Linguagem C
174 pág.

Linguagem C


DisciplinaFundamentos de Programação405 materiais4.775 seguidores
Pré-visualização38 páginas
no vetor n. O <enter>, digitado 
para finalizar a entrada, é automaticamente substituído por '\0'. \ufffd 
5.2.1. I
5.2.1. I5.2.1. I
5.2.1. INICIALIZAÇÃO DE 
NICIALIZAÇÃO DE NICIALIZAÇÃO DE 
NICIALIZAÇÃO DE S
SS
STRINGS
TRINGSTRINGS
TRINGS 
 
 
Como qualquer outro vetor, strings também podem ser inicializadas quando 
são declaradas. Nessa inicialização, podemos usar a sintaxe padrão, em que 
os caracteres são fornecidos entre chaves e separados por vírgulas, ou então 
podemos usar a sintaxe própria para strings, na qual os caracteres são 
fornecidos entre aspas. A vantagem dessa segunda sintaxe é que, além de ser 
mais compacta, o caracter nulo é incluído automaticamente. Na sintaxe 
convencional, o '\0' deve ser fornecido explicitamente. 
Exemplo 5.14.
Exemplo 5.14.Exemplo 5.14.
Exemplo 5.14. Problema com a inicialização padrão de strings. 
#include <stdio.h> 
void main(void) { 
 char x[] = &quot;um&quot;; /* inclui '\0' */ 
 char y[] = {'d','o','i','s'}; /* não inclui '\0' */ 
 printf(&quot;%s %s&quot;, x, y); 
} 
A saída da string x certamente termina após a letra m ter sido exibida, pois o '\0' 
é encontrado. Quanto à string y, entretanto, não há como saber quando a saída 
terminará pois, como não foi colocado o terminador, o compilador irá exibir 
todos os caracteres armazenados após o s, até que um '\0' seja encontrado. A 
saída do programa será algo do tipo: um doishë5ßp\u1e85\u263a... \ufffd 
5.2.2.
5.2.2.5.2.2.
5.2.2. M
 M M
 MANIPULAÇÃO DE 
ANIPULAÇÃO DE ANIPULAÇÃO DE 
ANIPULAÇÃO DE S
SS
STRINGS
TRINGSTRINGS
TRINGS 
 
 
Como a string não é um tipo de dados básico da linguagem C, operações sim-
ples como atribuição e comparação não podem ser feitas diretamente com os 
operadores disponíveis. 
Exemplo 5.15.
Exemplo 5.15.Exemplo 5.15.
Exemplo 5.15. Problema com o uso de operadores relacionais com strings. 
 
5. VETORES, STRINGS E MATRIZES 
72
7272
72
#include <stdio.h> 
void main(void) { 
 char x[] = &quot;um&quot;; 
 char y[] = &quot;um&quot;; 
 printf(&quot;%s == %s resulta em %s&quot;, x, y, x==y ? &quot;verdade&quot; : &quot;falso&quot;); 
} 
Apesar de x e y terem o mesmo valor e, portanto, serem iguais, a saída será 
um == um resulta em falso. Isso acontece porque na expressão x==y não esta-
mos comparando o conteúdo dos vetores x e y, mas sim seus endereços que, 
obviamente, devem ser diferentes. \ufffd 
Qualquer operação com uma string exige o processamento individual dos ele-
mentos do vetor que a representa Assim, para verificar se uma string é igual a 
outra, é preciso comparar seus caracteres correspondentes, um a um. 
Exemplo 5.16.
Exemplo 5.16.Exemplo 5.16.
Exemplo 5.16. Comparação entre strings. 
int strcmp(char s[], char t[]) { 
 int i=0; 
 while( s[i]==t[i] && s[i]!='\0' ) i++; 
 return s[i]-t[i]; 
} 
O laço while pode parar somente em duas situações: a primeira é quando o 
caracter s[i] difere do seu correspondente t[i]; a segunda, é quando eles não 
diferem, mas são ambos nulos. Nos dois casos, a função strcmp() devolve o 
valor s[i]\u2212t[i]. Então, se as duas strings forem iguais, a resposta da função será 
o valor 0; caso contrário, a resposta será um valor positivo ou negativo. Se for 
positivo, então s[i]>t[i] e, portanto, a string s é maior12 que a string 
t. Analogamente, se a resposta for negativa, a string s é menor que a t. \ufffd 
 
12
 Pois o primeiro caracter de s que difere de seu correspondente em t tem código ASCII maior e, 
portanto, aparece depois na ordem lexicográfica. 
 
5. VETORES, STRINGS E MATRIZES 
73
7373
73
De modo geral, para um operador relacional \u25ca, a expressão strcmp(x,y) \u25ca 0 
equivale à expressão x \u25ca y. Por exemplo, em vez de &quot;Ana&quot; \u2265 &quot;Bia&quot;, devemos 
escrever strcmp(&quot;Ana&quot;,&quot;Bia&quot;) >= 0. 
Exemplo 5.17.
Exemplo 5.17.Exemplo 5.17.
Exemplo 5.17. Usando a função strcmp()
13
. 
#include <stdio.h> 
void main(void) { 
 char x[] = &quot;um&quot;; 
 char y[] = &quot;um&quot;; 
 char z[] = &quot;dois&quot;; 
 printf(&quot;\n %s = %s \u2261 %s&quot;, x, y, strcmp(x,y)==0 ? &quot;V&quot; : &quot;F&quot; ); 
 printf(&quot;\n %s \u2260 %s \u2261 %s&quot;, x, y, strcmp(x,y)!=0 ? &quot;V&quot; : &quot;F&quot; ); 
 printf(&quot;\n %s < %s \u2261 %s&quot;, x, z, strcmp(x,z)< 0 ? &quot;V&quot; : &quot;F&quot; ); 
 printf(&quot;\n %s > %s \u2261 %s&quot;, x, z, strcmp(x,z)> 0 ? &quot;V&quot; : &quot;F&quot; ); 
 printf(&quot;\n %s \u2264 %s \u2261 %s&quot;, z, y, strcmp(z,y)<=0 ? &quot;V&quot; : &quot;F&quot; ); 
 printf(&quot;\n %s \u2265 %s \u2261 %s&quot;, z, z, strcmp(z,z)>=0 ? &quot;V&quot; : &quot;F&quot; ); 
} 
A saída do programa será: 
um = um \u2261 V 
um \u2260 um \u2261 F 
um < dois \u2261 F 
um > dois \u2261 V 
dois \u2264 um \u2261 V 
dois \u2265 dois \u2261 V \ufffd 
Exercício
ExercícioExercício
Exercício 
 
 5.13.
5.13.5.13.
5.13. 
 
 Codifique a função strcpy(s,t), que copia o conteúdo da string t 
para a string s. Essa função é útil quando precisamos realizar atribuição entre 
strings; por exemplo, para atribuir a constante &quot;teste&quot; a uma string x, basta 
escrever strcpy(x,&quot;teste&quot;). 
Exercício
ExercícioExercício
Exercício 
 
 5.14.
5.14.5.14.
5.14. 
 
 Codifique a função strlen(s), que devolve o número de carac-
teres armazenados na string s. Lembre-se de que o terminador '\0' não faz 
parte da string e, portanto, não deve ser contado. 
 
13
 Para facilitar a manipulação de strings, C oferece uma série de funções, definidas em string.h, 
entre as quais estão strcmp(), strcpy(), strlen(), strupr() e strcat(). 
 
5. VETORES, STRINGS E MATRIZES 
74
7474
74
Exercício
ExercícioExercício
Exercício 
 
 5.15.
5.15.5.15.
5.15. 
 
 Codifique a função strupr(s), que converte a string s em maiús-
cula. Por exemplo, se x armazena &quot;Teste&quot;, após a chamada strupr(x), x estará 
armazenando &quot;TESTE&quot;. 
Exercício
ExercícioExercício
Exercício 
 
 5.16.
5.16.5.16.
5.16. 
 
 Codifique a função strcat(s,t), que concatena a string t ao final 
da string s. Por exemplo, se x armazena &quot;facil&quot; e y armazena &quot;idade&quot;, após a 
chamada strcat(x,y), x estará armazenando &quot;facilidade&quot;. 
Exercício
ExercícioExercício
Exercício 
 
 5.17.
5.17.5.17.
5.17. 
 
 Codifique a função strpos(s,c), que devolve a posição da primei-
ra ocorrência do caracter c na string s; ou \u22121, caso ele não ocorra em s. 
Exercício
ExercícioExercício
Exercício 
 
 5.18.
5.18.5.18.
5.18. 
 
 Codifique a função strdel(s,p), que remove o caracter existente 
na posição p da string s. Se a posição p não existe em s, nada é feito. 
Exercício
ExercícioExercício
Exercício 
 
 5.19.
5.19.5.19.
5.19. 
 
 Codifique a função strins(s,c,p), que insere o caracter s na 
posição p da string s. Se a posição p não existe em s, o caracter deve ser 
inserido no final da string. 
Exercício
ExercícioExercício
Exercício 
 
 5.20.
5.20.5.20.
5.20. 
 
 As cadeias de Freeman são usadas para representar objetos a 
partir da codificação de seus contornos. Para montar a cadeia de Freeman 
para um determinado objeto, partimos do princípio de que ele pode ser 
enquadrado num plano reticulado e que, de um ponto P qualquer desse plano, 
podemos nos mover para oito posições distintas. 
P 
1 2 3 4 5 6 7 8 9 
0 
1 
2 
3 
4 
5 
6 
7 
8 
1 2 3 
5 7 6 
4 0 
P 
 
5. VETORES, STRINGS E MATRIZES 
75
7575
75
Escolhido um ponto P como origem, a cadeia é montada seguindo-se o contor-
no do objeto no sentido horário. Por exemplo, para o objeto representado na 
figura acima, a codificação de Freeman é: (1,5) 11000060666464444332. 
a) sabendo-se que os movimentos horizontais e verticais contribuem com 1 
unidade e que os movimentos diagonais contribuem com 1.42 unidades de 
comprimento, codifique uma função que recebe uma cadeia de Freeman e 
devolve o perímetro da figura representada pela cadeia. 
b) encontre uma forma de calcular a área de uma figura a partir da sua cadeia 
de Freeman e codifique uma função que implemente essa idéia. 
c) codifique