Graduação
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
int leInt(void) { int i; printf(">"); scanf("%d",&i); return i;
}
void troca(int *i, int *j){ int k=*i;
*i=*j;
*j=k;
}
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 ");
/* 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 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