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


Автор: mosssr 10.12.2012, 15:57
В файле хранятся названия фирм. Каждая строка запись об отдельной фирме.
ЗАО Рога и Копыта
ООО Три поросенка
ОАО Аврора
Написать программу, которая читает строки из файла в массив строк, и выводит их на 
экран, отсортировав по названию, исключая правовую форму. Т.е. исходные данные этого 
примера должны быть отсортированы следующим образом:
ОАО Аврора
ЗАО Рога и Копыта
ООО Три поросенка

Код

// Строки.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include "Windows.h"



int _tmain(int argc, _TCHAR* argv[])
{
    SetConsoleCP (1251);
    SetConsoleOutputCP (1251);



    char ru_sl[]="БВГДЖЗКЛМНПРСТФХЦЧШЩбвгджзклмнпрстфхцчшщ";
    int sl[9024];
    int sl2;
    bool fl;
    char *sl3;




    FILE *in;
    int f=0;
    int i,j;
    int k1,k2,k3;
    int max2=0, max3=0, max=0,max1=0,max4=0;
    int flag, flag1=0, flag2;
    char text[9024];
    char seps[] = " .,!():;<>^%$#@?\n«»";
    char *words[255] = {NULL};
    int numWords = 0;
    char menu;
    do
    {    
        printf ("====================================================\n");
        printf ("1-Загрузить из файла\n");
        printf ("2-Вывод на экран, отсортировав по названию, исключая правовую форму. \n");
        printf ("0-Выход\n");
        printf ("====================================================\n");
        menu=getch ();
        switch (menu)
        {
        case '1':
            {
                in=fopen("input.txt","r");
                if(in==NULL)
                {
                    printf ("\nОшибка открытия файла...\n");
                    getch();
                    break;
                }
                fgets(text, 9024, in);
                printf ("\nФайл прочитан.\n");
                fclose(in);


                words[numWords] = strtok( text, seps ); 
                    while( words[numWords] != NULL )
                        {
                    
                            printf( "Слово в файле: %s\n", words[numWords] );
                            numWords++;
                            words[numWords] = strtok( NULL, seps ); 
                        }

        
                break;
            }
        case '2':


Помогите case 2 сделать, пожалуйста. Я думаю, что надо делать сортировку по алфавиту после 1 пробела, но у меня не получается это сделать.

Автор: NoviceF 10.12.2012, 16:38
Цитата(mosssr @  10.12.2012,  16:57 Найти цитируемый пост)
 Я думаю, что надо делать сортировку по алфавиту после 1 пробела, но у меня не получается это сделать.


Гуглить "strtok (разбить строку на токены)" или в таком духе.

Писать только на Си или можно STL?

Автор: mosssr 10.12.2012, 16:49
Писать только на Си. 

Автор: baldina 10.12.2012, 16:55
Цитата(mosssr @  10.12.2012,  15:57 Найти цитируемый пост)
сортировку по алфавиту после 1 пробела

Код

int compare (const char**str1, const char**str2) {
  char *s1 = strchr(*str1, ' ');
  char *s2 = strchr(*str2, ' ');
  return strcmp (s1, s2);
}
...
#include <stdlib.h>
...
qsort  (words, numWords, sizeof (char*), compare);
...


Добавлено через 8 минут и 24 секунды
в strcmp нельзя передавать NULL, если могут быть строки без пробелов, нужна проверочка:
Код

  return strcmp (s1?s1:"", s2?s2:"");

Автор: feodorv 10.12.2012, 18:27
Цитата(mosssr @  10.12.2012,  16:57 Найти цитируемый пост)
Помогите case 2 сделать

Так и с case 1 ещё не разобрались. По условию задания файл состоит из строк, которые нужно вставить в массив строк.
Цитата(mosssr @  10.12.2012,  16:57 Найти цитируемый пост)
                fgets(text, 9024, in);

Это чтение одной-единственной строки. Все остальные строки останутся непрочитанными... Массива строк тоже не просматривается.


Цитата(mosssr @  10.12.2012,  17:49 Найти цитируемый пост)
Писать только на Си.  


Цитата(mosssr @  10.12.2012,  16:57 Найти цитируемый пост)
int _tmain(int argc, _TCHAR* argv[])
{
    SetConsoleCP (1251);
    SetConsoleOutputCP (1251);
    char ru_sl[]="БВГДЖЗКЛМНПРСТФХЦЧШЩбвгджзклмнпрстфхцчшщ";
    int sl[9024];

Увы, это не C. В Си сначала идут объявления переменных, и лишь потом операции.

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