PARTE I
1.
int procura(int m[], int n, int o_que)
{
int i;
for(i = 0; i < n; i++)
if(m[i] == o_que)
return 1;
return 0;
}
2.
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
int c, c_ant = ' ';
while((c = getchar()) != EOF)
{
/*
* islower(c): corrente e' minuscula.
* !isalnum(c): anterior nao e' letra nem digito.
*/
if(islower(c) && !isalnum(c_ant))
c = toupper(c); /* converte para maiuscula. */
putchar(c);
c_ant = c;
}
return EXIT_SUCCESS;
}
3.
/*
* Para simplificar considerou-se qualquer caracter != '0' como
* o digito '1'. Ignorou-se o problema (importante!) de saber se
* o valor e' representavel num unsigned long.
*/
unsigned long converteBinarioDecimal(const char binario[])
{
unsigned long n = 0;
while(*binario != '\0')
n = 2 * n + (*binario++ != '0');
return n;
}
PARTE II (8 valores)
4.
Versão A:
#include <stdio.h>
#include <stdlib.h>
typedef enum {Nao, Sim} Logico;
int main(void)
{
FILE *entrada, *saida;
Logico dentro;
int c, c_ant;
if((entrada = fopen("entrada", "r")) == NULL)
return EXIT_FAILURE;
if((saida = fopen("saida", "w")) == NULL)
{
fclose(entrada);
return EXIT_FAILURE;
}
dentro = Nao;
c_ant = ' ';
while((c = fgetc(entrada)) != EOF)
if(dentro)
if(c_ant == '*' && c == '/')
{
dentro = Nao;
c_ant = ' '; /* para nao usar o '/' no inicio dum novo comentario */
}
else
c_ant = c;
else
if(c_ant == '/' && c == '*')
{
fputc(' ', saida);
dentro = Sim;
c_ant = ' '; /* para nao usar o '*' no fim do novo comentario */
}
else
{
/* O '/' nao pode ser escrito imediatamente, pois pode
ser o inicio dum comentario. So' e' escrito quando
se le o caracter seguinte e se verifica nao ser '*': */
if(c_ant == '/')
fputc('/', saida);
if(c != '/')
fputc(c, saida);
c_ant = c;
}
/* Pode ter ficado um '/' `a espera: */
if(!dentro && c_ant == '/')
fputc('/', saida);
fclose(entrada);
fclose(saida);
return EXIT_SUCCESS;
}
Versão B (sugerida por várias resoluções dos alunos):
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *entrada, *saida;
int c, c_ant;
if((entrada = fopen("entrada", "r")) == NULL)
return EXIT_FAILURE;
if((saida = fopen("saida", "w")) == NULL)
{
fclose(entrada);
return EXIT_FAILURE;
}
c_ant = ' ';
while((c = fgetc(entrada)) != EOF)
if(c_ant == '/' && c == '*')
{
fputc(' ', saida);
c_ant = ' '; /* para nao usar o '*' no fim do novo comentario */
while((c = fgetc(entrada)) != EOF && (c != '/' || c_ant != '*'))
c_ant = c;
if(c == EOF)
{
fprintf(stderr, "Aviso: comentario inacabado!\n");
fclose(entrada);
fclose(saida);
return EXIT_SUCCESS;
}
}
else
{
/* Um '/' nao pode ser escrito imediatamente, pois pode
ser o inicio dum comentario. So' e' escrito quando
se le o caracter seguinte e se verifica nao ser '*': */
if(c_ant == '/')
fputc('/', saida);
if(c != '/')
fputc(c, saida);
c_ant = c;
}
/* Pode ter ficado um '/' `a espera: */
if(c_ant == '/')
fputc('/', saida);
fclose(entrada);
fclose(saida);
return EXIT_SUCCESS;
}
5.
#include <string.h>
/*
* Para simplificar considerou-se qualquer caracter != '0' como
* o digito '1'!
*/
void somaBinario(char r[], const char a[], const char b[])
{
int ir, ia, ib;
int e_vao = 0;
/* Fazer a soma colocando o resultado, invertido, em r: */
ir = 0;
ia = strlen(a) - 1;
ib = strlen(b) - 1;
for( ; ia >= 0 || ib >= 0; ir++, ia--, ib--)
{
int soma = e_vao +
(ia >= 0 ? a[ia] != '0' : 0) +
(ib >= 0 ? b[ib] != '0' : 0);
r[ir] = "01"[soma % 2];
e_vao = soma / 2;
}
/* Faltou algum transporte? */
if(e_vao > 0)
r[ir++] = '1';
else
{
/* Se nao houve transporte, o resultado pode conter zeros `a
esquerda (neste caso `a direita): */
do ir--; while(ir >= 0 && r[ir] == '0');
/* Incrementar para ir ser o local a colocar o '\0': */
ir++;
/* Se a cadeia vai ficar vazia, colocar um unico '0': */
if(ir == 0)
r[ir++] = '0';
}
r[ir] = '\0';
/* Inverter a cadeia de resultado: */
for(ia = 0; ia < ir / 2; ia++)
{
char aux = r[ia];
r[ia] = r[ir - ia - 1];
r[ir - ia - 1] = aux;
}
}
| Página
concebida e mantida por Eng. Manuel Menezes de Sequeira (última actualização 2006/07/07) Copyright © 1996-2001 ISCTE |
||||