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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с файлами 
:(
    Опции темы
lenarano
Дата 18.4.2014, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть задание В командной строке задаются N<= 5 имен файлов и строка . Вывести в указанные файлы N символов из строки в порядке убывания частоты их встречаемости (если строка содержит менее N различных символов, в оставшиеся файлы не записывать ничего). Строку вывести на экран, причем если в ней дублируется символ - выводить его только в мес-
те первого включения. Например "каникулы" -> "каниулы".
На этом этапе выполнила сортировку символов по частоте встречаемости, удаление дублирующего символа. как можно открыть файлы по количеству заданных пользователем(до 5)? Через оператор выбора?
Как можно вывести в эти файла эти символы по количеству заданных символов? Т.е. как реализовать ввод указанного кол-ва символов в каждый файл? Через цикл? Я так понимаю на каком то этапе вводить уже будет нечего и условие в скобках выполниться автоматически. или нет? Помогите с кодом с расшифровкой действий. 
Код

#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <conio.h>


struct str
{char sim;
 int count;};
struct str freq_tabls[256];

 //функции
 void parse_string(const char* str)//подсчет количества символов
{
 int i;
 for(i=0;i<256;++i)
  {
  freq_tabls[i].sim=i;
  freq_tabls[i].count=0;
  }
 while(*str) 
  freq_tabls[(unsigned char)*str++].count++;
}

void Del(char *s)//удаление повторяющихся символов
{
   int flag[256] = {0};
   char *ps = s;
   while(*ps)
      if (!flag[*ps])
      {
         flag[*ps] = 1;
         ps++;
      }
      else strcpy(ps, ps + 1);
}

void bubbleSort(struct str *b,  int size )//сортировка 
{
    struct str tmp;
    int i, j;
    for(i = 0; i < size - 1; ++i)
    {            
     for(j = 0; j < size - 1; ++j)
        {     
         if (b[j + 1].count > b[j].count) 
          {
            tmp = b[j + 1]; 
            b[j + 1] = b[j]; 
            b[j] = tmp;
          }
        }
    }
}

int main(void)
{FILE *fp;//указатель на поток
setlocale(LC_ALL,"rus");
char string[1024];
char stringdybler[1024];
char fname[20];//массив для имени файла
int i,len,number;
printf( "\n\nВведите строчку латинскими буквами: \n" ); 
gets (string);
len=strlen(string);
   for(i=0;i<len+1;i++)
   {stringdybler[i] = string[i];}
   //puts (stringdybler);
printf( "\nЗадание 1.\nСтроку вывести на экран, причем если в ней дублируется символ\n - выводить его только в месте первого включения.\n\n" );
Del(stringdybler);
puts(stringdybler);
printf( "\nЗадание 2.\nОтсортировать символы в строке в порядке убывания частоты их встречаемости\n\n" ); 
  parse_string(string);
  bubbleSort( freq_tabls,  256);
     for( i = 0; i < 256; i++ )
      {
        if ( freq_tabls[ i ].count == 0 ) {
            break; // т.к. массив отсортирован, то после первого нуля все остальные д.б. тоже нули
        }
        printf( "Cимвол '%c'. Он встречался %d раз\n", freq_tabls[i].sim, freq_tabls[i].count );
       }
 printf( "\nЗадание 3.Вывести в указанный пользователем файл N символов из строки\nв порядке убывания частоты их встречаемости.\n");
 printf( "(если строка содержит менее N различных символов, в оставшиеся файлы не записывать ничего).\n\n" );
 puts ("Введите имя файла:");  
 gets (fname);
 if((fp=fopen(fname, "w"))==NULL)
 {printf("Не удалось открыть файл. Операция закончилась неудачно.");
   return -1;//выход по ошибке
 }
  printf( "Сколько символов хотите вывести в файл?\n" );
  scanf("%d",&number);
  fprintf(fp,"Символы в порядке убывания частоты встречаемости:");
  for(i=0;i<number;i++)
  {fprintf(fp,"Символ %с встречался %d раз",freq_tabls[i].sim, freq_tabls[ i ].count );
}
  fclose(fp);
}


Хочу идти по этому алгоритму. Только хочу ввести это через несколько файлов,т.е. видимо, как-то используя цикл. "вводим в узазаный пользователем файл указанное количество символов, и ,если символы еще есть, открываем новый файл и записываем в него." 



Это сообщение отредактировал(а) lenarano - 18.4.2014, 20:49
PM MAIL   Вверх
lenarano
Дата 18.4.2014, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



файл заработал. Но в блокноте под именем файла символ почему то прописывает всегда с, а значения и того заблочней (127 например и не соответствуют действительности). Укажите на ошибку. smile
Код

 printf( "Сколько символов хотите вывести в файл?\n" );
  scanf("%d",&number);
  fprintf(fp,"Символы в порядке убывания частоты встречаемости:");
  for(i=0;i<number;i++)
  {fprintf(fp,"Символ %с встречался %d раз",freq_tabls[i].sim, freq_tabls[ i ].count );
 

Это сообщение отредактировал(а) lenarano - 18.4.2014, 18:48
PM MAIL   Вверх
lenarano
Дата 18.4.2014, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <conio.h>

struct str
{char sim;
int count;};
struct str freq_tabls[256];

 //функции
 void parse_string(const char* str)//подсчет количества символов
{
 int i;
   for(i=0;i<256;++i)
    {
    freq_tabls[i].sim=i;
    freq_tabls[i].count=0;
    }
   while(*str) 
    freq_tabls[(unsigned char)*str++].count++;
}

void Del(char *s)//удаление повторяющихся символов
{
 int flag[256] = {0};
 char *ps = s;
   while(*ps)
      if (!flag[*ps])
      {
         flag[*ps] = 1;
         ps++;
      }
      else strcpy(ps, ps + 1);
}

void bubbleSort(struct str *b,  int size )//сортировка 
{
    struct str tmp;
    int i, j;
    for(i = 0; i < size - 1; ++i)
    {            
     for(j = 0; j < size - 1; ++j)
        {     
         if (b[j + 1].count > b[j].count) 
          {
            tmp = b[j + 1]; 
            b[j + 1] = b[j]; 
            b[j] = tmp;
          }
        }
    }
}

int main(void)
{
FILE *fp;//указатель на поток
FILE *fp2;
setlocale(LC_ALL,"rus");
char string[1024];
char stringdybler[1024];
char fname[20],fname2[20];//массив для имени файла
int i,len,number;
printf( "\n\nВведите строчку латинскими буквами: \n" ); 
gets (string);
len=strlen(string);
   for(i=0;i<len+1;i++)
   {
   stringdybler[i] = string[i];
   }
   //puts (stringdybler);
printf( "\nЗадание 1.\nСтроку вывести на экран, причем если в ней дублируется символ\n - выводить его только в месте первого включения.\n\n" );
Del(stringdybler);
puts(stringdybler);
printf( "\nЗадание 2.\nОтсортировать символы в строке в порядке убывания частоты их встречаемости\n\n" ); 
parse_string(string);
bubbleSort( freq_tabls,  256);
     for( i = 0; i < 256; i++ )
      {
        if ( freq_tabls[ i ].count == 0 ) {
            break; // т.к. массив отсортирован, то после первого нуля все остальные д.б. тоже нули
        }
        printf( "Cимвол '%c'. Он встречался %d раз\n", freq_tabls[i].sim, freq_tabls[i].count );
       }
 printf( "\nЗадание 3.Вывести в указанный пользователем файл N символов из строки\nв порядке убывания частоты их встречаемости\n");
 printf( "(если строка содержит менее N различных символов, в оставшиеся файлы не записывать ничего).\n\n" );
 puts ("Введите имя файла:");  
 gets (fname);
    if((fp=fopen(fname, "w"))==NULL)
     {
     printf("Не удалось открыть файл. Операция закончилась неудачно.");
     return -1;//выход по ошибке
     }
 printf( "Сколько символов хотите вывести в файл?\n" );
 scanf("%d",&number);
 fprintf(fp,"Символы в порядке убывания частоты встречаемости:\n");
   for(i=0;i<number;i++)
     {
      fprintf(fp,"Символ %c встречался %d раз\n",freq_tabls[i].sim, freq_tabls[ i ].count );
     }
 fclose(fp);
  
}



Как развить идею с вводом пользователем файлов, до тех пор пока эти символы есть?

Это сообщение отредактировал(а) lenarano - 18.4.2014, 20:46
PM MAIL   Вверх
lenarano
Дата 18.4.2014, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Можно былобы продолжать так
Код

 puts ("Введите имя второго файла:");  
   gets (fname2);
   if((fp2=fopen(fname2, "w"))==NULL)
     {
     printf("Не удалось открыть файл. Операция закончилась неудачно.");
     return -1;//выход по ошибке
     }
   fprintf(fp,"Оставшиеся символы в порядке убывания частоты встречаемости:\n");
     for(i=0;i<number;i++)
     {if ( freq_tabls[ i ].count == 0 )
      {fprintf(fp,"Менее N символов.\n");
      break;
      }
      fprintf(fp,"Символ %c встречался %d раз\n",freq_tabls[i].sim, freq_tabls[ i ].count );
     } 
  fclose(fp2);

Развитвая этот путь, но это явно не то((( Помогите smile  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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