Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] Сколько раз в текстовом файле, встречаются символы 
:(
    Опции темы
Nikaaa
Дата 25.4.2007, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 12.4.2007

Репутация: нет
Всего: нет



Задача: Нужно составить программу, определяющую сколько раз в текстовом файле встречаются различные символы (кроме символа новой строки).
Помогите, пожалуйста!!!!!!!!!!

PM MAIL   Вверх
GIK
Дата 25.4.2007, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 4
Всего: 14



Сделал, только для английских букв:
Код

#include<cstdio.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>


int main(int argc, char* argv[])
{ char ch;
  int up[26]={0};
  int low[26]={0};
  int i;
  FILE *fil;
  fil=fopen("C://test/test.txt", "wb+");
  if(!fil){printf("%s", "Not File"); return 1;};

  do{
   scanf("%s", &ch);
   putc(ch, fil);
  }while(ch!='.');
  fclose(fil);

  fil=fopen("C://test/test.txt", "rb");
  if(!fil){printf("%s", "Not File"); return 1;};

  ch='1';

  while(ch!='.'){
   ch=getc(fil);
   if(ch!='\n'){
      if(islower(ch)){
       low[ch-'a']++;
      }
      else{
       up[ch-'A']++;
      }
   }
  };

  for(i= 0; i < 26; i++)
     printf("%c = %d %c = %d\n", i+'A', up[i], i+'a', low[i]);


  getch();
        return 0;
}





--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Xenon
Дата 25.4.2007, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 19
Всего: 50



Бррр, С - это ... брр smile)
Код

#include <iostream.h> //Вроде такой там в C?

int size = 0;
char* sym_arr = 0;
int* sym_stats = 0;

void add(char sym)
{
    for (int i = 0; i < size; ++i)
    {
        if(sym_arr[i] == sym)
        {
            ++sym_stats[i]; //Если нашли такой символ - увеличиваем кол-во таких символов в таблице
            return;
        }
    }
    //Расширяем массив массив символов и добавляем новый символ
    char* sym_buf = new char[size+1];
    for (int i = 0; i < size; ++i) sym_buf[i] = sym_arr[i];
    sym_buf[size] = sym;
    delete [] sym_arr;
    sym_arr = sym_buf;
    //Расширяем массив статистики символов и указываем, что на данный момент этот символ единственный, то есть количество таких символов - 1
    int* buf_stats = new int[size+1];
    for (int i = 0; i < size; ++i) buf_stats[i] = sym_stats[i];
    buf_stats[size] = 1;
    delete [] sym_stats;
    sym_stats = buf_stats;
    ++size;
}

int main(int argc, char* argv[])
{
    FILE* file = fopen("d:\\text2.txt", "r");
    if(!file) return -1;
    while (!feof(file))
    {
        char sym = fgetc(file);
        if (sym != ' ' && sym != '\n' && sym != '\0') add(sym);
    }
    printf("Symbol`s stats:\n");
    for (int i = 0; i < size - 1; ++i)
        printf("%c : %d\n",sym_arr[i], sym_stats[i]);
    delete [] sym_arr;
    delete [] sym_stats;
    return 0;
}


Добавлено через 1 минуту и 9 секунд
Иницилизация глобальных интегральных переменных нулем - лишнее, ибо по умолчанию делается так, но ... smile пофиг


--------------------
user posted image  
PM MAIL   Вверх
Mayk
Дата 26.4.2007, 00:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 5
Всего: 134



Цитата(Xenon @  26.4.2007,  03:49 Найти цитируемый пост)
void add(char sym)
{
    for (int i = 0; i < size; ++i)
    {
        if(sym_arr[i] == sym)


вместо линейного поиска можно обойтись прямой адресацией(чай, человека не просят сделать поддержку ünícòđê-ов всяких).
то есть мы предполагаем, что кол-во различных символов в входном файле не превышает 256 штук.
далее, ограничившись выводом всех символов начиная с 0x20(пробела), мы автоматически выполним условие об игнорировании конца строки.
Проэксполйтив таким образом данное задание, кол-во строк в решении можно сократить до ~25 


Код

#include <stdio.h>
int main(){
  unsigned int char_count [256]={0,/*0,0,0...*/};
  FILE* f =fopen("input.txt","r");
  unsigned ch;
  // подсчитать различные символы
  while( 1 ){
    // считать символ
    ch = fgetc(f);
    // проверить что файл не окончен
    if( ch == EOF )
        break;
    // увеличим кол-во прочитанных символов с кодом ch
    char_count[ch]++;
  } 

  // вывод символов на экран, пропускаем первые 32, благо они служебные в основном.
  for( ch = 32; ch < 256; ++ch ){
      printf("%c: %u\n",ch, char_count[ch]);
  }

  return 0;
}


Это сообщение отредактировал(а) Mayk - 26.4.2007, 00:18


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Xenon
Дата 26.4.2007, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 19
Всего: 50



Mayk, да, я даже не подумал, что можно вручную забить таблицу символов (при чем необязательно руками, а циклом), а потом уже искать и только инкрмент делать smile ... думал мало ли, какие там кракозяблы попадутся, но типа char он и в африке char smile
А ты и таблицы не делал smile

Это сообщение отредактировал(а) Xenon - 26.4.2007, 01:04


--------------------
user posted image  
PM MAIL   Вверх
GIK
Дата 26.4.2007, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 4
Всего: 14



Можно еще что-то типа:
Код

#include <stdio.h>
int main(){
  unsigned int char_count [256-32]={0};
  FILE* f =fopen("input.txt","r");
  unsigned i;
  char ch='1';

  while(ch!='.'){
  ch=getc(f);
  for( i = 32; i < 256; ++i ){
      if(ch==i) {
         char_count[ch-32]++;    
         breack;   
      }
   }
 }

  return 0;
}

Причем в цикле можно вместо констант можно использовать переменные, которые, к примеру определялись бы пользователем, т.е. пользователь задает диапазон символов которые хочет подсчитать:
Что-то типа:
Код

#include <stdio.h>
int main(){
  
  FILE* f =fopen("input.txt","r");
  unsigned i, go, end;
  char ch='1';
    cout<<"Vvedite diapazon:";
  cin>>go;
  cin>>end;
  unsigned int char_count [end-go]={0};

  while(ch!='.'){
  ch=getc(f);
  for( i = go; i < end; ++i ){
      if(ch==i) {
         char_count[ch-32]++;    
         breack;   
      }
   }
 }

  return 0;
}

Можно к примеру запрашивать у пользователя диапазон символов и обработать их в какой нибуть функции в числовой диапазон для цикла for(); 
Вот вам и рождение идеи после разбора задачи smile




--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1210 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.