paulo1205
(usa Ubuntu)
Enviado em 15/12/2016 - 10:44h
Ana888 escreveu:
Olá, sou estudante de informática e estou tendo problemas com um código em c, se alguém puder verificar e me auxiliar na resolução do problema ficarei extremamente grata, obrigada desde já!
Obs: Testei só com a primeira letra do alfabeto para ver se iria funcionar.
Código:
#include <stdio.h>
#include <stdlib.h>
/* Faça um programa que receba do usuario um arquivo texto e mostre na tela quantas
vezes cada letra do alfabeto aparece dentro do arquivo. */
int main() {
Um programa em C tem duas opções para declarar
main :
- recebendo nenhum parâmetro, implicando que a declaração deve ser na forma “
int main(void) ”; ou
- recebendo dois parâmetros (através dos quais o ambiente de execução pode passar argumentos ao programa no momento de sua invocação), caso esse em que a declaração deve ter a forma “
int main(int argc, char **argv) ”, onde
argc é um contador da quantidade elementos contidos no segundo argumento,
argv , que, por sua vez, é um vetor de strings, cujos elementos representam os sucessivos argumentos passados ao programa.
Do jeito como você fez, você disse ao compilador C que a função
main () pode receber uma quantidade indefinida de argumentos de quaisquer tipos, só que isso é errado porque: (i) viola as convenções padronizadas, descritas acima, e (ii) você não faz nenhum uso desses inúmeros possíveis argumentos, logo não quer usar tal declaração (você quer a primeira forma mostrada acima).
char url = "arq.txt";
FILE *arq;
char ch;
Você vai usar
ch mais abaixo para receber dados de
fgetc (). Apesar do nome, o tipo de retorno de
fgetc () é
int , a fim de poder sinalizar erros de execução com um valor inteiro diferente de qualquer caráter válido. Assim sendo, você tem de declarar essa variável também como
int .
(Tecnicamente falando, em caso de erro
fgetc () retorna
EOF , que tem o valor inteiro
-1 , ao passo que qualquer leitura bem-sucedida retorna um valor não negativo, tipicamente na faixa de
0 a
255 , assumindo que dados do tipo
char têm oito bits. Se você atribuir
EOF a uma variável do tipo
char , fica impossível distinguir entre os valores inteiros
-1 e
255 ).
int a=0;
arq = fopen ("arq.txt", "r");
if(arq == NULL)
{
printf("Erro, nao foi possivel abrir o arquivo\n");
}
else while((ch = fgetc(arq)) != EOF)
if ( strcmp (ch, 'a') == 0)
A função
strcmp () é, como indica o nome, para comparar strings. Você está comparando apenas um caráter, logo pode usar simplesmente o operador
== (ou
!= ).
{
a++;
printf ("\nA letra <a> foi encontrada %d vezes no arquivo.", a);
}
else
printf ("\nCaracter nao encontrado.");
fclose(arq);
return 0;
}
Corrigindo os problemas acima, o programa deve funcionar. No entanto, acho que você vai querer fazer de uma forma sucinta, e também tratar alguns casos especiais. Pergunto-lhe:
- Letras maiúsculas e minúsculas têm de ser tratadas de modo consistente? (Por exemplo: "A casa" deve considerar 3 ocorrências da letra “A”, ou uma de “A” e duas de “a”?)
- Letras acentuadas ou com diacríticos têm de ser tratadas de forma especial, ou se considera apenas a letra básica, sem seu modificado? (Por exemplo: “Café e açúcar” considera duas ocorrências de “C“ e de “E”, ou uma de “C”, de “Ç“, de “E” e de “É”.
- Se você aceitar letras acentuadas, qual será o conjunto de caracteres do seu arquivo?
- Dependendo das informações acima, pode ser bem mais fácil detectar cada letra válida. Você poderia transformar um blocão de
if s ou vários rótulos
case numa expressão simples, e usar o valor dessa expressão como índice de um array de letras (por exemplo, 'A' -> 0, 'B' -> 1, 'C' -> 2 etc.), usando os elementos desse array como contadores de cada letra. Algo parecido com o pseudo-código abaixo.
unsigned cont_letra[26]={0}; // Garante que todos os elementos começarão com valor zerado.
int letra, indice;
while(letra=le_letra()){
indice=calcula_indice(letra);
cont_letra[indice]++;
}