Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Регистр


Автор: Guest 13.11.2005, 01:51
Код

struct scan_info
         {
       char mode[25];
       int price;
       double x_size;
       double y_size;
       int optr;
       int grey;
       };


//----------------------------------------------------
void input_file(scan_info* scaner, long less, int count)
    {
   FILE *f;
   if ((f = fopen ("scan_info.txt", "w+b")) == NULL)
    {
      cout << "ERROR\n" ;exit(0);
      }
   fwrite(&less,sizeof(long),1,f);
    for( int i = 0; i < count; i++)
    {
        if(scaner[i].price>=200)
      fwrite(&scaner[i],sizeof(scan_info),1,f);
       }
    fclose(f);
   }

//----------------------------------------------------
void input_information()
    {
   int count = 0;
   int less = 0;
   cout << "Input number of records: ";
   cin  >> count;
   scan_info* scaner = new scan_info[count];
   for (int i=0; i < count; i++)
      {
    cout << "\nInput information about scaner\n";
      cout << "Input model ";  cin >> scaner[i].mode;   cout << "\n";
      cout << "Input price ";  cin >> scaner[i].price;  cout << "\n";
      cout << "Input x_size "; cin >> scaner[i].x_size; cout << "\n";
      cout << "Input y_size "; cin >> scaner[i].y_size; cout << "\n";
      cout << "Input optr ";   cin >> scaner[i].optr;   cout << "\n";
      cout << "Input grey ";   cin >> scaner[i].grey;   cout << "\n";
      if (scaner[i].price >= 200) less++;
    }
   input_file(scaner,less,count);
   }
//----------------------------------------------------


Необходимо сделать так, чтобы в файл писались сперва поля scaner[i].mode, которые начинаются с заглавной буквы, а потом со строчной. Как? smile

Автор: Chaos A.D. 13.11.2005, 11:52
А есть ограничения на применение потокового ввода-вывода или алгоритмов STL? Просто, как то непривычно смотрится использование cout-а вместе с FILE* и fwrite. А вообще, кажется, можно заюзать partial_sort или stable_sort, в зависимости от того, должны ли сохранять свой порядок сканеры с одинаковым регистром первых букв. Хотя под рукой нет ничего такого, куда бы можно было бы заглянуть в поисках точной инфы об этих алгоритмах, так что может они чем-то и не подойдут.

Автор: Exekutor 14.11.2005, 09:06
Мне кажется, что можно сделать так: пусть у тебя будут два цикла пусть первый пробегает по полям структуры, и проверяет - принадлежит ли скан код первого символа множеству с - по (ведь скан коды заглавных букв упорядочены) и записывает если принадлежит. Второй цикл записывает все остальные. Алгоритм не самый совершенный но ничего умнее придумать сходу не могу smile

Автор: Chaos A.D. 14.11.2005, 09:45
Похоже, автор темы на неё забил.

Автор: Guest 15.11.2005, 03:08
Chaos A.D. совсем не забил, зря так говоришь, если ты создаешь тему, а потом ее не посещешь, то это бессмысленно. Chaos A.D. а то что ты писал, я чего-то не воткнул smile , а вот мысля Exekutor'a мне более понятна, постараемся реализовать smile

Автор: Chaos A.D. 15.11.2005, 10:42
Я хотел сказать - можно просто отсортировать вектор твоих сканнеров так, чтобы их название приводилось к какому-то одному регистру при сортировке. Не тронутой мы оставляли бы только первую букву. То есть не меняли бы ей регистра. Потом, сортируем вектор с таким критерием сравнения, который я только что описал. И выводим. Сделать это удобнее всего написав функтор, и заюзав его со стандартным алгоритмом sort из STL.

У Exekutor-а подход попроще. Но он, по-моему, более удобный, чем мой. Если тебе нужно вывести все сканнеры, и выйти, то это то, что нужно.

Автор: Doc_d0s 15.11.2005, 16:26
создай список, с указателями на эти все mode отсортируй его и согласно указателям пиши
насколько я знаю заглавные буквы раньше чем строчные => список сортировать по убыванию(не возрастанию)

Автор: Guest 16.11.2005, 03:32
Doc_d0s с указателями у меня большие проблемы smile

Автор: Chaos A.D. 16.11.2005, 09:33
Цитата(Guest @ 16.11.2005, 03:32)
Doc_d0s с указателями у меня большие проблемы

А, начинающий...

Просто сделай своему массиву std::sort с предикатом, который сравнивает scan_info по именам.

Код


// Этот класс добавь в начало файла. Не забудь подключить <algorithm>
class LessByName
    : public std::binary_function<scan_info, scan_info, bool>
{
    public :
        bool operator()( const scan_info &lhs, const scan_info &rhs )
        { return strcmp( lhs.mode, rhs.mode ) < 0; }
};

// Вставь эту строку после цикла в input_information, и перед выводом в файл (в строку 47 в твоем коде выше)
std::sort( &scaner[0], &scaner[count], LessByName() );



Автор: Guest 17.11.2005, 01:10
Все большое спасибо за ответы!!! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)