С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/23: Рейтинг темы: голосов - 23, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 8

Сортировка строк

26.10.2011, 13:06. Показов 4439. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите написать программу, которая читает строки из файла в массив строк, и выводит их на экран, отсортировав по названию, исключая правовую форму. Т.е. не сравнивает ЗАО , ОАО , ООО

Пример: ЗАО Оскол , ОАО Крона , ООО Аристократ

Должно получиться: ООО Аристократ , ОАО Крона , ЗАО Оскол

Заранее спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.10.2011, 13:06
Ответы с готовыми решениями:

Сортировка строк матрицы C++ (перестановка строк)
Помогите пожалуйста, в матрице из целых чисел поменять местами первую строку и строку, содержащую самый большой по абсолютной величине...

Сортировка строк
Я уже голову ломаю над задачей где то месяц. У меня все никак не получается сделать сортировку что бы результаты в алфавитном порядке...

Сортировка строк
В файле хранятся названия блюд. Каждая строка отдельное название. Написать программу, которая читает строки из файла в массив строк, и...

12
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 8
02.11.2011, 09:43  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int _tmain(int argc, _TCHAR* argv[])
{
  setlocale( LC_ALL,"Russian" );
 
  char *str = new char [1024];
 
  //Открывает файл для чтения
 
  ifstream b_file;
 
  b_file.open("D:\\text1.txt");
 
  b_file>> str;
 
  printf("В файле находится строка %s \n", str );
 
  cin.get(); //Ожидание нажатия клавиши
 
  return 0;
В файле находится "Hello world !" ,но почему то в str записывается только "Hello"!

И ещё: как в файле перейти на вторую строку и сохранить всю строку в новой переменной?

Добавлено через 13 часов 25 минут
В общем что я насобирал:
1.Есть рабочая сортировка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
void filter(const char* str, char** destlist);
void sort(char** strlist, int strcnt);
 
int main()
{
    char   str[80];
    char** strlist;
    int    delimcnt = 0;
 
    cin.getline(str, 80);
    
    for(int i = 0; str[i] != '\0'; i++)
        if(str[i] == ',' || str[i] == '.')
            delimcnt++;
 
    if(delimcnt == 0) {
        cout << "Wrong input string\n";
        return 1;
    }
 
    strlist = new char*[delimcnt];
    for(int i = 0; i < delimcnt; i++)
        strlist[i] = new char[20];
 
    filter(str, strlist);
    sort(strlist, delimcnt);
 
    for(int i = 0; i < delimcnt; i++)
        cout << strlist[i] << endl;
    getchar();
    getchar();
    return 0;
}
 
void filter(const char* str, char** destlist)
{
    for(int i = 0, j = 0, k = 0; str[i] != '\0'; i++) {
        if(str[i] == ',' || str[i] == '.') {
            // Если j не равно нулю, то прибавить единицу, дабы не скопировать запятую
            strncpy
                (destlist[k], str + j + (j != 0), i - j - (j != 0));
            destlist[k][i-j] = '\0';
            k++;
            j = i;
        }
    }
}
 
void sort(char** strlist, int strcnt)
{
    for(int i = 0; i < strcnt - 1; i++)
        for(int j = i + 1; j < strcnt; j++)
            if(strcmp(strlist[i], strlist[j]) > 0) {
                char* tmp = strlist[i];
                strlist[i] = strlist[j];
                strlist[j] = tmp;
            }
}
Но её надо немного доработать!

2)
Чтение из файла:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void main( void ) 
{
FILE *file;
char* file_name = "text1.txt";
char load_string[50] = "none";
 
 
file = fopen_s( file_name, "r" );
if( file != 0 )
{
fgets( load_string, 50 , file ); 
}
printf("%s \n" , load_string);
getchar();
getchar();
Но в load_string записывается только первая строка файла!

Как мне объеденить в одно целое эти две программы?

Добавлено через 25 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <clocale>
 
using namespace std;
 
 
void filter(const char* str, char** destlist);
void sort(char** strlist, int strcnt);
 
void main( void ) 
{
setlocale(LC_ALL,"Russian");
setlocale(LC_ALL,"rus");
FILE *file;
char* file_name = "text1.txt";
char str[100] = "none";
char** strlist;
int    delimcnt = 0;
 
 
file = fopen( file_name, "r" );
if( file != 0 )
{
fgets( str, 50 , file ); 
}
printf("%s \n" , str);
 
 
for(int i = 0; str[i] != '\0'; i++)
                if(str[i] == ',' || str[i] == '.')
                        delimcnt++;
 
        if(delimcnt == 0) {
                cout << "Wrong input string \n";
 
        }
 
        strlist = new char*[delimcnt];
        for(int i = 0; i < delimcnt; i++)
                strlist[i] = new char[20];
 
        filter(str, strlist);
        sort(strlist, delimcnt);
 
        for(int i = 0; i < delimcnt; i++)
                cout << strlist[i] << endl;
        getchar();
        getchar();
 
}
 
void filter(const char* str, char** destlist)
{
        for(int i = 0, j = 0, k = 0; str[i] != '\0'; i++) {
                if(str[i] == ',' || str[i] == '.') {
                        // Если j не равно нулю, то прибавить единицу, дабы не скопировать запятую
                        strncpy
                                (destlist[k], str + j + (j != 0), i - j - (j != 0));
                        destlist[k][i-j] = '\0';
                        k++;
                        j = i;
                }
        }
}
 
void sort(char** strlist, int strcnt)
{
        for(int i = 0; i < strcnt - 1; i++)
                for(int j = i + 1; j < strcnt; j++)
                        if(strcmp(strlist[i], strlist[j]) > 0) {
                                char* tmp = strlist[i];
                                strlist[i] = strlist[j];
                                strlist[j] = tmp;
                        }
}
Вот что получилось! Но есть пару недочётов:
1)в строку записываются с файла только первая строка
2) Не понял пока как пропустить первые 3-и буквы, на подобии "ЗАО",""OAO" и т.п.
3) При выводе отсортированных слов в конце их дописывается "Н"
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
02.11.2011, 11:10
Цитата Сообщение от Dominion50
Помогите написать программу, которая читает строки из файла в массив строк, и выводит их на экран, отсортировав по названию, исключая правовую форму. Т.е. не сравнивает ЗАО , ОАО , ООО
считывай их в вектор через string и getline()
сортируй их в векторе с помощью функции, которая принимает две строки
в функции разделяй каждую строку через stringstream и возвращай результат сравнения названий
(функция должна возвращать такие же значения, как strcmp() )
0
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 8
02.11.2011, 14:11  [ТС]
А можно поподробнее про stringstream? А то базы знаний почти никакой!
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
02.11.2011, 14:17
Dominion50, http://cplusplus.com/reference... ingstream/
0
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 8
02.11.2011, 16:58  [ТС]
А что сделать если выдаёт например
C++
1
невозможно преобразовать 'std::string' в 'char'
C++
1
невозможно преобразовать 'char [80]' 'char'
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
03.11.2011, 01:48
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
#include <sstream>
 
using namespace std;
 
int main()
{
    string s = "ЗАО Оскол";
    string type, name;
    istringstream iss;
 
    iss.str(s);
    iss >> type >> name;
    cout << "type: \"" << type << "\", "
         << "name: \"" << name << "\""
         << endl;
 
    return 0;
}
Code
1
2
3
4
[guest@localhost tests]$ .iso++ t.cpp -o t
[guest@localhost tests]$ ./t
type: "ЗАО", name: "Оскол"
[guest@localhost tests]$
0
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 8
17.11.2011, 06:29  [ТС]
С сортировкой разобрался, а вот со строками не могу!

C++
1
2
3
4
5
while(!feof(fp))
  {
   fgets(str,1024, fp);
   printf("%s \n" , str);
  }
Вывод на экран содержание файла делаю этим методом!

Но вот есть вопрос! Как записать каждую строку в файле в отдельной переменной?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
17.11.2011, 10:34
Цитата Сообщение от Dominion50
Вывод на экран содержание файла делаю этим методом!
C++
1
2
    while(fgets(str, sizeof str, fp) != NULL)
        printf("%s\n", str);
твой вариант не только выводит последнюю строку два раза, но и содержит ловушку для новичков, связанную с возможной ошибкой чтения в файле

Цитата Сообщение от Dominion50
Как записать каждую строку в файле в отдельной переменной?
делается массив указателей, потом для каждой строки выполняется malloc() + strcpy() и указатель сохраняется в массив
0
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 8
17.11.2011, 14:13  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
char *str2;
  str2 = new char [100];
  int i =  0 ;
   while(fgets(str, sizeof str, fp) != NULL)
   {
    printf("%s\n", str); 
    str[i] = malloc(strlen(str)+1);
    strcpy(str[i],str);
    i++;
   }
Вот что получилось! Но что сделать с этими ошибками?
C++
1
2
error C2440: =: невозможно преобразовать 'void *' в 'char'  
error C2664: strcpy: невозможно преобразовать параметр 1 из 'char' в 'char *'
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
17.11.2011, 15:07
C++
1
    char str[100];
0
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 8
17.11.2011, 19:41  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 FILE *fp = fopen("text1.txt","r");
 
 if(NULL == fp)
 {
 printf("Не удалось открыть файл! \n");
 return 0;
 }
 
  char str[100];
  char *str2;
  str2 = new char [100];
  int i =  0 ;
 
   while(fgets(str, sizeof str, fp) != NULL)
   {
    printf("%s\n", str); 
    str[i] = malloc(strlen(str)+1);
    strcpy(str[i],str);
    i++;
   }
  fclose(fp);
 
  system("pause");
  return 0;
}
не помогает

Добавлено через 1 час 51 минуту
может что-то заменить или добавить?

Добавлено через 1 час 38 минут
Уже по разному попробывал,что-то я понять не могу((
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
18.11.2011, 23:09
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    FILE *fp;
    char *lines[1000];
    char str[100];
    int i;
    
    fp = fopen("text1.txt", "r");
    if (fp == NULL) {
        fprintf(stderr, "Не удалось открыть файл!\n");
        return 1;
    }
 
    i = 0;
    while (fgets(str, sizeof str, fp) != NULL) {
        printf("%s\n", str); 
        if (i < 1000) {
            lines[i] = (char *) malloc(strlen(str) + 1);
            if (lines[i] != NULL)
                strcpy(lines[i], str);
            i++;
        }
    }
    fclose(fp);
 
    getchar();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.11.2011, 23:09
Помогаю со студенческими работами здесь

Сортировка строк
Берем матрицу (для проверки) 1 5 7 4 4 2 8 9 3 На выходе получаем (см. скриншот) 1 5 7 8 9 3 4 4 2 А должно быть 8 9 3

Сортировка строк
Упорядочить строки массива по невозрастанию значений последних элементов строк.

Сортировка строк
Есть n (1&lt;= n &lt;=100) строк у которых записано последовательность только чисел (например строка 0876 ). Нужно отсортировать их так, что-бы...

Сортировка строк
Сколько букв &quot;У&quot; в введенном слове стоит на четных местах?

сортировка строк
Помогите пожалйста,очень надо... Отсортировать строки текста по возрастанию и убыванию длин слов. В тексте несколько строк.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru