Buscar

Atividade A4 TÉCNICAS DE PROGRAMAÇÃO

Prévia do material em texto

Se foi útil para você deixe um joinha 
Pergunta 1)
Em arquivos textuais, quando desejamos substituir uma informação com o mesmo tamanho da nova informação, podemos realizar sobrescrita sem a necessidade de criação de arquivo temporário para receber a nova versão do conteúdo. Para essa questão, analise o código a seguir, que realiza a troca do caractere “i” pelo caractere “y” na primeira linha do arquivo. Em sua análise preencha as lacunas.
#include <stdio.h>
#include <string.h>
 
int main()
{
FILE *arq;
char linha[40];
long pos;
int i;
arq=fopen("atividade.txt","___");
if(arq==NULL)
{
printf("Erro de abertura do arquivo.\n");
return 0;
}
pos=_____; //armazenar a posicao corrente do ponteiro de arquivo.
fgets(linha,40,arq);
for(i=0;i<strlen(linha);i++)
if(linha[i]=='i')
linha[i]='y';
_____; //reposicionar no ponto anterior aa leitura
_____; //gravacao da linha.
fclose(arq);
return 0;
}
Assinale a alternativa que você julgue ser a correta.
Resposta: . r+ ; ftell(arq) ; fseek(arq,pos,SEEK_SET); fputs(linha,arq) .
Parabéns! Sua resposta foi a correta! Você deve ter notado que podemos salvar a posição do ponteiro do arquivo para que possamos restaurar a posição e sobrescrever o conteúdo. Para isso, foram usadas as funções “ ftell()” e “ fseek()”, respectivamente.
Pergunta 2)
Em diversas situações, nos arquivos textuais, faz-se necessária a substituição de palavras. Para essa questão, analise o código a seguir que coleta linha por linha de um arquivo texto e realiza a substituição de palavras. Na análise, preencha as lacunas com os códigos correspondentes.
#include <stdio.h>
#include <string.h>
 
void ProcessaLinha(char linha[],char nome_ret[],char nova_palavra[])
{
int i=0;
char tmp[40];
for(;i<strlen(linha)-strlen(nome_ret);i++)
if(!strncmp(&linha[i],nome_ret,strlen(nome_ret)))
{
strncpy(tmp,linha,i);
tmp[i]='\x0';
strcat(tmp,nova_palavra);
strcat(tmp,&linha[i+strlen(nome_ret)]);
strcpy(linha,tmp);
}
}
 
int main()
{
char linha[40],nome_ret[11],nova_palavra[11];
FILE *arq,*arqtmp;
arq=fopen("atividade.txt","___");
if(arq==NULL)
{
printf("Erro de abertura de arquivo origem.");
return 0;
}
arqtmp=fopen("atividade_tmp.txt","___");
if(arq==NULL)
{
printf("Erro de abertura do arquivo temporario.");
return 0;
}
printf("Palavra a ser substituida (ate 10 letras): ");
gets(nome_ret);
printf("Nova palavra (ate 10 letras): ");
gets(nova_palavra);
while(1)
{
fgets(linha,40,arq); //fgets() lê toda a linha até o <enter>
if(feof(arq))
break;
ProcessaLinha(linha,nome_ret,nova_palavra);
____(linha,arqtmp);
}
fclose(arq);
fclose(arqtmp);
if(remove("atividade.txt"))
printf("Erro na remocao.\n");
else if(rename("____", "____"))
printf("Erro no renomeamento.\n");
return 0;
}
Assinale a alternativa que você julgue possuir a sequência correta.
Resposta:  r ; w ; fputs ; atividade_tmp.txt ; atividade.txt .
Parabéns! Sua resposta foi a correta! Você observou corretamente os tipos de abertura necessários para o arquivo origem das informações e para o arquivo temporário; e, também, a necessidade do uso da função “ fputs()” para a gravação no arquivo temporário e os parâmetros da função “ rename()”.
Pergunta 3)
Suponha a existência de um arquivo textual onde as palavras são separadas pelo caractere “$” e pelo caractere “%”. Suponha também, que há a necessidade de se implementar um programa para imprimir, na tela, o conteúdo do referido arquivo de modo que, ao encontrar o caractere “$” imprime-se um espaço em branco e, ao encontrar o “%” pula-se para a linha seguinte da tela.
Para essa questão, analise o código a seguir e preencha as lacunas.
#include <stdio.h>
 
int main()
{
FILE *arq;
char carac;
arq=fopen("texto.txt","___");
if(arq==NULL)
{
printf("Erro de abertura do arquivo.\n");
return 0;
}
while(1)
{
carac = ____(arq);
if(___)
break;
switch(carac)
{
case '$':
carac = ' ';
break;
case '%':
carac = '\n';
break;
}
printf("%c",carac);
}
fclose(arq);
return 0;
}
Assinale a alternativa que você julgue ser a correta.
Resposta: . r ; getc ; carac == EOF.
Parabéns! Sua resposta foi a correta! Você associou acertadamente o modo de abertura de arquivo textual para somente leitura (parâmetro “r”), usou a função correta para ler um caractere do arquivo textual (“ getc()”) e testou corretamente o fim do arquivo (“ carac == EOF”).
Pergunta 4)
Em uma operação de recuperação de informações a partir de um arquivo, após a leitura de um item, deve-se sempre verificar se o final do arquivo foi alcançado. A informação de EOF ( End-Of-File - Final de Arquivo) pode ser obtida em diversas operações. Para essa questão, analise as linhas de código a seguir:
I - info = fgetc(arq);
II - fputs(buffer, sizeof(buffer), arq);
III - fread(buffer,sizeof(buffer),1,arq);
IV - fputc(carac,arq);
Assinale a alternativa que você julgue ser a correta.
Resposta: Apenas a função da linha III não pode retornar EOF.
Parabéns! Sua resposta foi a correta! Apesar das funções das linhas II e IV serem de saída (gravação), podem retornar EOF em caso de erro. A função da linha I pode retornar EOF no caso do encontro de final de arquivo na operação de leitura. A função da linha III retorna a quantidade de itens lidos.
Pergunta 5)
Linguagens estruturadas permitem que informações sejam armazenadas e recuperadas de memórias não voláteis. Porém, elas são dependentes de funções e estruturas exportadas pelo sistema operacional. Dadas as afirmativas a seguir, classifique-as V para verdadeiro e F para falso.
( ) Ponteiros de arquivos (“ FILE *”) devem ser alocados dinamicamente através do uso “ malloc()” antes de serem utilizados.
( ) Ponteiros de arquivos referenciam uma posição de memória mantida pelo sistema operacional que armazena atributos e status dos arquivos manipulados.
( ) Para a manipulação da posição corrente do arquivo podemos usar as funções “ ftell()” e “ fseek()” que devolvem e setam a posição corrente do arquivo, respectivamente.
( ) A função “fread ()” retorna EOF quando chegar ao final do arquivo.
Assinale a alternativa que você julgue ter a sequência correta.
Resposta: F, V, V, F.
Parabéns! Sua resposta foi a correta! Descritores de arquivos são estruturas mantidas pelo sistema operacional e são endereçados através dos ponteiros de arquivos, que são instanciados pelo uso da função “fopen ()”. A função “fread ()” retorna a quantidade de itens lidos.
Pergunta 6)
Em algumas situações, temos a necessidade de conhecermos a quantidade de palavras em um arquivo textual. Para essa questão, analise o código a seguir e preencha as lacunas.
#include <stdio.h>
 
int ContPalavras(char linha[])
{
int cont=0,i=0,esp=0;
for(;linha[i]!='\x0';i++)
{
if((!esp) && (linha[i]!=' '))
{
esp=1;
cont++;
}
else
if(esp && (linha[i]==' '))
esp=0;
}
return cont;
}
int main()
{
FILE *arq;
char linha[40];
int cont=0;
arq=fopen("atividade.txt","___");
if(arq==NULL)
{
printf("Erro de abertura do arquivo.\n");
return 0;
}
while(1)
{
____(linha,40,arq);
cont+=ContPalavras(linha);
if(____)
break;
}
printf("Qtd de palavras = %d\n",cont);
fclose(arq);
return 0;
}
Assinale a alternativa que você julgue ser a correta.
Resposta: . r ; fgets ; feof(arq) .
Parabéns! Sua resposta foi a correta! Você observou bem que o programa manipula um arquivo textual apenas para operações de leitura. A contagem das palavras foi feita linha a linha, usando-se, portanto, a função “ fgets()”. O laço deve ser interrompido ao encontrar o final de arquivo – teste feito a partir do valor de retorno da função “ feof()”.
Pergunta 7)
Para essa questão, suponha que um certo arquivo mantém, em sua primeira posição, a quantidade de registros armazenados. Após o indicativo da quantidade, são gravados os valores na forma <int,float>. Desta forma, o arquivo consiste em:
<qtd_registros><int1><float1><int2><float2>...<intn,floatn>.
Para essa questão, analise o código a seguir e preencha as lacunas de modo a representar o processo de criação de um arquivo novo e gravação de três registros.
#include <stdio.h>
 
void GravaArq(FILE *arq, int val_i,float val_f)
{
fwrite(&val_i,sizeof(____),1,arq);
fwrite(&val_f,sizeof(____),1,arq);}
 
 
int main()
{
FILE *arq;
int qtd=3;
arq=fopen("exercicio.dat","___");
if(arq==NULL)
{
printf("Erro de abertura do arquivo (1).\n");
return 0;
}
fwrite(&qtd,sizeof(int),1,arq);
GravaArq(arq,0,2.1);
GravaArq(arq,10,45.21);
GravaArq(arq,20,345.87);
fclose(arq);
return 0;
}
Assinale a alternativa que você julgue ser a correta.
Resposta:  int ; float ; wb .
Parabéns! Sua resposta foi a correta! Realmente, para realizar somente operações em um arquivo binário, deve-se usar o modo “ wb”. O processo de gravação ocorre mediante a utilização de “ fwrite()” onde o tamanho do item gravado deve acompanhar o tipo. No caso, foi utilizada a função “ sizeof()” vinculado ao tipo passado como parâmetro para a gravação.
Pergunta 8)
Para a manipulação de arquivos temos que, inicialmente, realizar a instanciação do ponteiro do arquivo por intermédio da operação de abertura. Para tanto, usa-se a função “ fopen()” passando como parâmetros o nome físico do arquivo e o modo de abertura. Para essa questão, suponha que o programa em questão, tenha em seu código, as seguintes linhas:
if(!fread(&item,sizeof(tipo_do_item),1,arq))
return -1;
...
if(!fwrite(&item,sizeof(tipo_do_item),1,arq))
return -2;
...
Levando em conta as linhas de código acima, o fato de que o arquivo binário deve existir previamente e as suas informações deverão ser mantidas, selecione a opção que contém a forma de abertura adequada.
Resposta: . arq=fopen("arq.dat","rb+"); .
Parabéns! Sua resposta foi a correta! O fato do código apresentar as funções “ fread()” e “ fwrite()” já determina que está sendo manipulado um arquivo binário. Como o arquivo deve existir previamente e serão realizadas operações de leitura e de escrita, o modo de abertura deverá ser, necessariamente “ rb+”.
Pergunta 9)
Quando se manipula um arquivo, às vezes temos a necessidade de alterar informações ou incluir novas. Para tanto, funções “ fseek()”, “ fgets()”, “ fputs()”, “ fgetc()” e “ fgets()” podem ser utilizadas. Dentre as alternativas a seguir, assinale V para verdadeiro e F para falso.
( ) a função “ fseek()“ não admite valores negativos para o seu deslocamento mesmo quando utilizada com o parâmetro “SEEK_CUR”;
( ) no caso de gravarmos uma informação no meio do arquivo, a informação será sobrescrita;
( ) no caso de gravarmos uma informação no meio do arquivo, toda a informação abaixo do ponto a receber a nova informação será deslocada;
( ) a função “ fseek()“ admite três pontos de referência para o seu deslocamento: a partir do início do arquivo (SEEK_SET), a partir da posição corrente (SEEK_CUR) e a partir do fim do arquivo (SEEK_END).
Assinale a alternativa que você julgue ter a sequência correta.
Resposta: F, V, F, V.
Parabéns! Sua resposta foi a correta! Pelo fato da função “ fseek()” utilizar, como parâmetro de deslocamento, um tipo “ long int”, valores negativos podem ser colocados para que seja realizado, um deslocamento de retrocesso do ponteiro do arquivo ou a partir do ponto referenciado. Assim como em vetores, a escrita em posições já gravadas provoca a sobreposição de informações.
Pergunta 10)
Suponha a existência de um arquivo onde a primeira posição indica a quantidade de registros armazenados. Após o indicativo da quantidade, o arquivo armazena valores na forma <int,float>. Desta forma, o arquivo consiste em:
<qtd_registros><int1><float1><int2><float2>...<intn,floatn>.
Para essa questão, analise o código a seguir e preencha a lacuna de modo que o programa imprima os valores relativos ao terceiro par “<int><float>”.
#include <stdio.h>
 
int main()
{
FILE *arq;
int valor_int;
float valor_float;
arq=fopen("exercicio.dat","rb+");
if(arq==NULL)
{
printf("Erro de abertura do arquivo.\n");
return 0;
}
fseek(arq,_______________,SEEK_SET);
fread(&valor_int,sizeof(int),1,arq);
fread(&valor_float,sizeof(float),1,arq);
printf("Terceiro registro: int=%d float=%f\n",valor_int,valor_float);
fclose(arq);
return 0;
}
Assinale a alternativa que você julgue ser a correta.
Resposta:  sizeof(int)+sizeof(float))*2+sizeof(int).
Parabéns! Sua resposta foi a correta! Você analisou corretamente o fato de que o terceiro registro corresponde ao deslocamento multiplicado por dois, pelo fato de que a numeração do registro se inicia em zero. Além do “ (sizeof(int)+sizeof(float))*2”, deve-se adicionar o deslocamento relativo ao valor da quantidade de registros, localizado no início do arquivo.

Continue navegando