Escolar Documentos
Profissional Documentos
Cultura Documentos
Lista 1: soluções
J. L. Rangel
1. Escreva um programa em C que lê três números inteiros do teclado, e imprime os
três números em ordem crescente.
#include <stdio.h>
int leInt(void) {
int i;
printf(">");
scanf("%d",&i);
return i;
}
int main(void) {
int i1, i2, i3;
i1=leInt();
i2=leInt();
i3=leInt();
if (i1>i2)
troca(&i1, &i2);
if (i2>i3) {
troca(&i2, &i3);
if (i1>i2)
troca(&i1, &i2);
}
printf("%d <= %d <= %d\n", i1, i2, i3);
}
4. Escreva uma função com protótipo
int contaletra(char *s);
que calcula o número de letras (maiúsculas e minúsculas) da cadeia s.
/*
letra verifica se c e’uma letra
veja tambem isalpha em <ctype.h>
*/
int letra(char c) {
return ((c>='A') && (c<='Z'))
|| ((c>='a') && (c<='z'));
}
(continua)
int main(void) {
int i;
char s[80];
int m; /* m=1 -> mudar de linha no proximo branco */
printf(">");
/* com formato " %[^\n]" scanf le
ate' o Enter do fim da entrada */
scanf(" %[^\n]",s);
printf("[%s]\n",s);
m=0;
for (i=0; s[i]!='\0'; i++)
if (s[i]==' ') {
if (m) {
printf("\n");
m=0;
}
} else {
printf("%c",s[i]);
m=1;
}
printf("\n");
}
• O controle com m é necessário para mudar de linha só uma vez entre as palavras,
mesmo que haja mais de um branco.
• O formato %[……] só permite que sejam lidos os caracteres dentro dos colchetes;
^ quer dizer “não”, de forma que %[^\n] quer dizer “qualquer coisa, até o fim da
linha”.
• Outras funções de <stdio.h> também leem uma linha, como gets, e fgets.
(fgets é preferível, porque sua chamada especifica quantos caracteres podem ser
lidos.)
10. Escreva uma função
int igual(char *s1, char *s2);
para descobrir se as cadeias s1 e s2 são iguais.
Sugestão: comece descobrindo porque a solução abaixo não é aceitável.
Estruturas de Dados J .L. Rangel - 4
/* bobagem! */
int igual(char *s1, char *s2) {
return s1==s2;
}
⇒ A função dada verifica se o endereço das duas cadeias é o mesmo, em vez de
verificar se os caracteres das duas cadeias são em mesmo número e iguais.
Solução recursiva:
int igual(char *s1, char *s2) {
if (s1[0]=='\0')
return (s2[0]=='\0');
if (s2[0]=='\0')
return 0;
return (s1[0]==s2[0]) && igual(++s1,++s2);
}
Solução iterativa (com for)
int igual(char *s1, char *s2) {
int i;
for(i=0; (s1[i]!='\0') && (s2[i]!='\0'); i++)
if (s1[i]!=s2[i])
return 0;
/* aqui um dos dois caracteres e' nulo! */
return s1[i]==s2[i];
}
(abr 00)