Форум программистов, компьютерный форум CyberForum.ru

Не правильно работает код (отсортировать по алфавиту массив строк) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Sylar9
-20 / 55 / 2
Регистрация: 04.09.2011
Сообщений: 1,888
Записей в блоге: 1
14.07.2012, 09:50     Не правильно работает код (отсортировать по алфавиту массив строк) #1
Вот задача: Отсортировать по алфавиту массив строк и вывести на экран, учитывать первый символ.

Пример:

Входные данные:
3 //количество строк
Анна
Василий
башня принцессы

Выходные:
Анна
башня принцессы
Василий
(STL пользоваться нельзя)
вот код:
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
#include <iostream>
#include <string>
using namespace std;
void bubbleSort(char*, int);
int main()
{
    char str[100];
    cin.get(str, 100, '$');
    int n = sizeof(str); 
    cout << "Massiv do sotr" << endl;
    cout << n << endl;
    for(int i=0; i<n; i++)
    cout << str[i];
    bubbleSort(str, n);
    cout << "Massiv polse sotr" << endl;
    for(int i=0; i<n; i++)
    cout << str[i];
 
 
system("pause");
return 0;
}
void bubbleSort(char* arr, int size)
{
    int tmp, i, j;
 
    for(i = 0; i < size - 1; ++i)
    {            
        for(j = 0; j < size - 1; ++j)
        {     
            if (arr[j + 1] < arr[j]) 
            {
                tmp = arr[j + 1]; 
                arr[j + 1] = arr[j]; 
                arr[j] = tmp;
            }
        }
    }
}
вот скрин работы программы
что в это коде не правильно ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.07.2012, 09:50     Не правильно работает код (отсортировать по алфавиту массив строк)
Посмотрите здесь:

Как записать правильно? Программа работает но код наверно не верен. C++
C++ Отсортировать массив символьных строк по алфавитному порядку?
C++ Не правильно работает код
C++ с++ не получается правильно отсортировать динамический массив указателей на структуру по номеру группы
Почему правильно работает код? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yleart
 Аватар для yleart
60 / 45 / 1
Регистрация: 07.10.2011
Сообщений: 139
14.07.2012, 10:23     Не правильно работает код (отсортировать по алфавиту массив строк) #2
Прочитай про <string> и <cstring> они отличаются..
Ты просто объявил массив char, а надо было
C++
1
std::string str[100];
И считывать, например, так:
C++
1
2
for(int i = 0; i < 100; ++i)
std::cin >> str[i]
считывание было бы до первого перевода строки, т.е. вся строка, хранилась бы в 1 элементе массива str, причем этот элемент тоже является массивом.
Sylar9
-20 / 55 / 2
Регистрация: 04.09.2011
Сообщений: 1,888
Записей в блоге: 1
14.07.2012, 11:14  [ТС]     Не правильно работает код (отсортировать по алфавиту массив строк) #3
Цитата Сообщение от yleart Посмотреть сообщение
Прочитай про <string> и <cstring> они отличаются..
Ты просто объявил массив char, а надо было
C++
1
std::string str[100];
И считывать, например, так:
C++
1
2
for(int i = 0; i < 100; ++i)
std::cin >> str[i]
считывание было бы до первого перевода строки, т.е. вся строка, хранилась бы в 1 элементе массива str, причем этот элемент тоже является массивом.
а как прервать ввод с помощью символа ? в это программе ?
Troll_Face
 Аватар для Troll_Face
599 / 399 / 4
Регистрация: 26.04.2012
Сообщений: 2,070
14.07.2012, 11:32     Не правильно работает код (отсортировать по алфавиту массив строк) #4
Цитата Сообщение от Sylar9 Посмотреть сообщение
а как прервать ввод с помощью символа ? в это программе ?
C++
1
2
while (cin>>str[i]!='$')
i++
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.07.2012, 11:35     Не правильно работает код (отсортировать по алфавиту массив строк) #5
Цитата Сообщение от yleart Посмотреть сообщение
И считывать, например, так:
C++
1
2
for(int i = 0; i < 100; ++i)
std::cin >> str[i]
считывание было бы до первого перевода строки
это считывание до первого разделителя(пробела/табуляции/перевода строки)
считывание до перевода строки:
C++
1
 std::getline(cin, str[i]);
Sylar9
-20 / 55 / 2
Регистрация: 04.09.2011
Сообщений: 1,888
Записей в блоге: 1
14.07.2012, 11:58  [ТС]     Не правильно работает код (отсортировать по алфавиту массив строк) #6
Цитата Сообщение от Jupiter Посмотреть сообщение
это считывание до первого разделителя(пробела/табуляции/перевода строки)
считывание до перевода строки:
C++
1
 std::getline(cin, str[i]);
компилятор ругается на !=? и не могу понять там должно быть два цикла
C++
1
2
3
for(int i = 0; i < 100; ++i)
while (cin>>str[i]!='$')
i++;
?
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
14.07.2012, 12:11     Не правильно работает код (отсортировать по алфавиту массив строк) #7
Может пригодится мой вариант решения

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
#include <iostream>  
using namespace std;
 
int main() 
{ 
    char str[] = " Real Arsenal Chelsea Barcelona "; 
    char* ptr;    
    char temp[10];
    char matrix[4][10];  
    int i = 0, j;
 
    ptr = strtok(str, " "); 
 
    while(ptr!=NULL) 
    {  
        for ( j = 0; j < strlen(ptr); j++) 
            matrix[i][j] = ptr[j]; 
        matrix[i][j] = '\0'; 
        i++;
        ptr = strtok(NULL, " "); 
    } 
 
    for ( i = 0; i < 4; i++) 
        for ( j = i+1; j < 4; j++)  
            if(strcmp(matrix[i], matrix[j]) > 0) 
            { 
                strcpy(temp, matrix[i]); 
                strcpy(matrix[i], matrix[j]); 
                strcpy(matrix[j], temp); 
            } 
   
            for ( i = 0; i < 4; i++) 
                cout << matrix[i] << " "; 
}
Sylar9
-20 / 55 / 2
Регистрация: 04.09.2011
Сообщений: 1,888
Записей в блоге: 1
14.07.2012, 12:47  [ТС]     Не правильно работает код (отсортировать по алфавиту массив строк) #8
Вот я код исправил но одна проблема осталась, все слитно выодит как можно исправить ?
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
#include <iostream>
#include <cstring>
#include <locale.h>
using namespace std;
void bubbleSort(char*, int);
int main()
{
    setlocale(LC_ALL, "Rus");
    char str[100];
    int n = 0; 
    cout << "Введите строку, конец ввода символ $" << endl;
    for(int i=0; i<100; i++)
    {
        cin >> str[i]; 
        if(str[i] == '$') break;
        else ++n;
    }
    cout << "Массив до сортировки ...." << endl;
    cout << n << endl;
    for (int i=0; i<n; i++)
        cout << str[i];
    cout << "Массив после сортировки ...." << endl;
    bubbleSort(str, n);
    for (int i=0; i<n; i++)
    cout << str[i];
 
 
 
    system("pause");
    return 0;
}
void bubbleSort(char* arr, int size)
{
  char tmp;
  int i, j;
  for(i=0; i<size-1; ++i)
  {
    for (j=0; j<size-1; ++j)
    {
      if(arr[j+1] < arr[j])
      {
        tmp = arr[j+1];
        arr[j+1] = arr[j];
        arr[j] = tmp;
 
       }
    }
  
  }
 
}
Добавлено через 10 минут
Вот рабочий код:
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
#include <iostream>
#include <string>
#include <locale.h>
using namespace std;
void bubbleSort(string*, int);
int main()
{
    setlocale(LC_ALL, "Rus");
    string str[100];
    int n = 0; 
    cout << "Введите строку, конец ввода символ $" << endl;
    for(int i=0; i<100; i++)
    {
        cin >> str[i]; 
        if(str[i] == '$') break;
        else ++n;
    }
    cout << "Массив до сортировки ...." << endl;
    cout << n << endl;
    for (int i=0; i<n; i++)
        cout << str[i];
    cout << "Массив после сортировки ...." << endl;
    bubbleSort(str, n);
    for (int i=0; i<n; i++)
    cout << str[i];
 
 
 
    system("pause");
    return 0;
}
void bubbleSort(string* arr, int size)
{
  char string;
  int i, j;
  for(i=0; i<size-1; ++i)
  {
    for (j=0; j<size-1; ++j)
    {
      if(arr[j+1] < arr[j])
      {
        tmp = arr[j+1];
        arr[j+1] = arr[j];
        arr[j] = tmp;
 
       }
    }
  
  }
 
}
только не могу понять как прервать ввод данные здесь
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.07.2012, 12:56     Не правильно работает код (отсортировать по алфавиту массив строк) #9
Цитата Сообщение от Sylar9 Посмотреть сообщение
Вот рабочий код:
Как рабочий, если здесь:
if(str[i] == '$') break;
строка с символом сравнивается.
И в функции bubbleSort(), наверное, нужно не
char string;
, а string tmp;
Sylar9
-20 / 55 / 2
Регистрация: 04.09.2011
Сообщений: 1,888
Записей в блоге: 1
14.07.2012, 13:12  [ТС]     Не правильно работает код (отсортировать по алфавиту массив строк) #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Как рабочий, если здесь: строка с символом сравнивается.
я не могу понять как прервать ввод с помощью символа $, подскажите плиз очень нужно целый день сижу не фига в голову не лезит

Добавлено через 11 минут
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
#include <iostream>
#include <string>
#include <locale.h>
using namespace std;
void bubbleSort(string*, int);
int main()
{
    setlocale(LC_ALL, "Rus");
    string str[100];
    int n = 0; 
    cout << "Введите строку, конец ввода символ $" << endl;
    for(int i=0; i<100; i++)
    {
        cin >> str[i]; 
        if(str[i] == '$') break; // Здесь не правельно, я не знаю как править ввод с помощью символа 
        else ++n;
    }
    cout << "Массив до сортировки ...." << endl;
    cout << n << endl;
    for (int i=0; i<n; i++)
        cout << str[i];
    cout << "Массив после сортировки ...." << endl;
    bubbleSort(str, n);
    for (int i=0; i<n; i++)
    cout << str[i];
 
 
 
    system("pause");
    return 0;
}
void bubbleSort(string* arr, int size)
{
  char string;
  int i, j;
  for(i=0; i<size-1; ++i)
  {
    for (j=0; j<size-1; ++j)
    {
      if(arr[j+1] < arr[j])
      {
        tmp = arr[j+1];
        arr[j+1] = arr[j];
        arr[j] = tmp;
 
       }
    }
  
  }
 
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2012, 13:33     Не правильно работает код (отсортировать по алфавиту массив строк)
Еще ссылки по теме:

Отсортировать массив по убыванию, затем добавить недостающий элемент и отсортировать массив по возрастанию C++
Отсортировать имена по алфавиту C++
C++ Как правильно объявить массив строк c++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.07.2012, 13:33     Не правильно работает код (отсортировать по алфавиту массив строк) #11
Добавлено через 1 минуту
Цитата Сообщение от Sylar9 Посмотреть сообщение
я не могу понять как прервать ввод с помощью символа $, подскажите плиз очень нужно целый день сижу не фига в голову не лезит
Исправить, то, что я написал.
код
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
#include <iostream>
#include <string>
#include <locale.h>
using namespace std;
void bubbleSort(string*, int);
int main()
{
    setlocale(LC_ALL, "Rus");
    string str[100];
    int n = 0; 
    cout << "Введите строку, конец ввода символ $" << endl;
    for(int i=0; i<100; i++)
    {
        cin >> str[i]; 
        if(str[i] == "$") break;
        else ++n;
    }
    cout << "Массив до сортировки ...." << endl;
    cout << n << endl;
    for (int i=0; i<n; i++)
        cout << str[i];
    cout << "Массив после сортировки ...." << endl;
    bubbleSort(str, n);
    for (int i=0; i<n; i++)
    cout << str[i];
 
    system("pause");
    return 0;
}
 
void bubbleSort(string* arr, int size)
{
  string tmp;
  int i, j;
  for(i=0; i<size-1; ++i)
  {
    for (j=0; j<size-1; ++j)
    {
      if(arr[j+1] < arr[j])
      {
        tmp = arr[j+1];
        arr[j+1] = arr[j];
        arr[j] = tmp;
      }
    }
  }
}
.

Добавлено через 11 минут
Но программа у вас сортирует не массив строк, а слова.

Добавлено через 7 минут
Вот так, нормально будет:
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
#include <iostream>
#include <string>
#include <locale.h>
using namespace std;
 
void bubbleSort(string*, int);
 
int main()
{
    setlocale(LC_ALL, "Rus");
    string str[100];
    int n = 0; 
    cout << "Введите строку, конец ввода символ $" << endl;
    for(int i=0; i<100; i++)
    {
        
        getline(cin, str[i]);
        if(str[i] == "$") break;
        else ++n;
    }
    cout << "Массив до сортировки ...." << endl;
    cout << n << endl;
    for (int i=0; i<n; i++)
        cout << str[i] << endl;
    cout << "Массив после сортировки ...." << endl;
    bubbleSort(str, n);
    for (int i=0; i<n; i++)
    cout << str[i] << endl;
 
    system("pause");
    return 0;
}
 
void bubbleSort(string* arr, int size)
{
  string tmp;
  int i, j;
  for(i=0; i<size-1; ++i)
  {
    for (j=0; j<size-1; ++j)
    {
      if(arr[j+1] < arr[j])
      {
        tmp = arr[j+1];
        arr[j+1] = arr[j];
        arr[j] = tmp;
      }
    }
  }
}
Для прерывания ввода, в пустой строке ввести $.
Yandex
Объявления
14.07.2012, 13:33     Не правильно работает код (отсортировать по алфавиту массив строк)
Ответ Создать тему
Опции темы

Текущее время: 05:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru