Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
DenDen46
0 / 0 / 0
Регистрация: 04.07.2015
Сообщений: 27
1

Ввести строку, вывести слова по алфавиту

17.10.2017, 23:23. Просмотров 236. Ответов 10
Метки нет (Все метки)

Задание: Ввести строку, вывести слова по алфавиту.
Прошли только условия, циклы и массивы. Если можно, сделать самым простым способом и с комментариями, чтобы понял даже начинающий. И из библиотек использовать можно только stdio.h

Добавлено через 12 минут
Можно, например, вот этот код переделать под мою задачу?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stdio.h"
 
int
main()
{
    char n;
    char str[100];
    printf("Write the string: ");
    scanf("%s", str);
    n = str[0];
    for (n = 0; str[n]; n++)
    {
        if (str[n] != '0' && str[n] != ' ')
        {
            printf("%c", str[n]);
        }
 
    }
    printf("\n");
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.10.2017, 23:23
Ответы с готовыми решениями:

Ввести строку, вывести слова по алфавиту
Здравствуйте. Помогите пожалуйста написать программу которая из введенной строки выводит слова по...

Ввести строку и вывести слова по алфавиту
Помогите, пожалуйста. Мы только начали изучать язык С, а я очень тупая.

Ввести строку и слово, удалить все вхождения слова и вывести строку
Нужно написать программу только со стандартной библиотекой <stdio.h> Помогите, пожалуйста :3

Ввести строку и слово, удалить все вхождения слова и вывести строку
Доброго времени суток всем ! написал лр2 (Ввести строку и слово, удалить все вхождения слова и...

Ввести строку и слово, удалить все вхождения слова и вывести строку
Написал код. Вот условие: "Ввести строку и слово, удалить все вхождения слова и вывести строку." ...

10
easybudda
Модератор
Эксперт CЭксперт С++
10210 / 6109 / 1536
Регистрация: 25.07.2009
Сообщений: 11,618
18.10.2017, 02:28 2
Цитата Сообщение от DenDen46 Посмотреть сообщение
Можно, например, вот этот код переделать под мою задачу?
Легко! То, что внутри main(), удалить и по-другому написать. Две последних строчки можно оставить. Но учитывая
Цитата Сообщение от DenDen46 Посмотреть сообщение
И из библиотек использовать можно только stdio.h
это будет очень длинный и унылый код. Нужно завести двухмерный массив, в котором строки - максимальное количество слов (задать константой), а столбцы - максимальное количество букв в слове (тоже задать константой). Читать из ввода по символу, заполняя слова в массиве и не забывая, что при встрече пробельного символа нужно очередное слово "закрывать" символом '\0' и переходить к заполнению следующего. При этом проверять границы массивов, чтобы за них не выйти. Когда все слова получены, сравнивать их друг с дружкой по символу и менять одно с другим в зависимости от результата сравнения - получится замороченная сортировка пузырьком к примеру. Писать всю эту галиматью на С скучно. Вот так интереснее:
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
#include <glib.h>
#include <stdio.h>
 
#define DELIM " \t\n"
 
gboolean print_word(gpointer wrd, gpointer cnt, gpointer dummy) {
    int i;
    
    for ( i = 0; i < GPOINTER_TO_INT(cnt); ++i )
        g_print("%s ", (const char*)wrd);
    
    return FALSE;
}
 
int main(void) {
    char buf[BUFSIZ];
    
    while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' ) {
        char ** wrd, ** words = g_strsplit_set(buf, DELIM, -1);
        GTree * pairs = g_tree_new((GCompareFunc)g_strcmp0);
        
        for ( wrd = words; *wrd; ++wrd )
            if ( **wrd )
                g_tree_replace(pairs, *wrd, GINT_TO_POINTER(GPOINTER_TO_INT(g_tree_lookup(pairs, *wrd)) + 1));
        
        g_print("Sorted: ");
        g_tree_foreach(pairs, print_word, NULL);
        g_print("\n");
        
        g_tree_destroy(pairs);
        g_strfreev(words);
    }
    
    return 0;
}
Код
$ gcc sort_words.c -o sort_words `pkg-config --cflags --libs glib-2.0`

$ ./sort_words
String: jingle bells jingle bells jingle all the way
Sorted: all bells bells jingle jingle jingle the way
String:

$
1
DenDen46
0 / 0 / 0
Регистрация: 04.07.2015
Сообщений: 27
18.10.2017, 13:22  [ТС] 3
Цитата Сообщение от easybudda Посмотреть сообщение
Вот так интереснее:
Я понимаю, что так интереснее. Но у меня попросту не примут задание с использованием тех тем, которые мы не проходили, да и объяснить решение которого я не смогу

Добавлено через 3 часа 0 минут
Мне предложили вариант:
Циклически выбирать символ с наименьшим кодом и записывать его в новый массив. И так до того момента, пока слова в первом массиве не закончатся. Только я не знаю как это реализовать

Добавлено через 26 минут
Только что разговаривал с преподавателем. Он сказал сделать так: находим первую букву во всех словах, сравниваем первые буквы, находим букву с наименьшим индексом и перемещаем слово с этой первой буквой на первую позицию, затем это слово исключаем из следующего перебора.
0
easybudda
Модератор
Эксперт CЭксперт С++
10210 / 6109 / 1536
Регистрация: 25.07.2009
Сообщений: 11,618
18.10.2017, 13:32 4
DenDen46, А если слов, начинающихся на букву с "наименьшим индексом", окажется больше одного?
0
DenDen46
0 / 0 / 0
Регистрация: 04.07.2015
Сообщений: 27
18.10.2017, 17:21  [ТС] 5
DenDen46, А если слов, начинающихся на букву с "наименьшим индексом", окажется больше одного?
В таком случае, как я понимаю, нужно рассматривать следующую букву в слове. С "наименьшим индексом" - это как я понимаю с наименьшим номером в таблице ASKII
0
Michail97
93 / 40 / 23
Регистрация: 18.09.2016
Сообщений: 372
18.10.2017, 17:42 6
1. Вводите в поток ввода предложение, рациональнее использовать getchar()
2. По символу считываете, ведущие пробелы и другое что не является символом буквы пропускаете
3. Записываете каждый символ в массив
4. поле того как закончились символы букв в слове закрываете массив, копируете посимвольно элементы из этого массива в массив строк.
И так дальше.
Когда увидите в конце \n выходите из цикла.
А после сортируйте.
Придётся вам свой strcmp описать
Посимвольно сравнивайте коды букв.
Удачи!
0
DenDen46
0 / 0 / 0
Регистрация: 04.07.2015
Сообщений: 27
18.10.2017, 21:23  [ТС] 7
Цитата Сообщение от Michail97 Посмотреть сообщение
закрываете массив, копируете посимвольно элементы из этого массива в массив строк
Разговаривал с преподавателем на эту тему. Он сказал, что нужен только один массив.
Судя по его словам, я должен ввести массив, программа должна определить где в этом массиве начинаются слова. То есть строка начинается со слова, программа перебирает все буквы в этом слове и доходит до пробела или любого другого разделителя. Это означает, что слово закончилось, нужно пропустить все разделители и дойти до следующей буквы. И так со всеми словами. Так программа должна определить все слова в массиве. А потом программа должна сравнивать эти слова, я так понимаю, посимвольно, и переставлять их по алфавиту. То есть программа перебрала все слома, нашла нужное слово, поставила его на первое место и исключила из следующего перебора. Вроде как-то так
Цитата Сообщение от easybudda Посмотреть сообщение
DenDen46, А если слов, начинающихся на букву с "наименьшим индексом", окажется больше одного?
В таком случае, нужно рассматривать все оставшиеся буквы в слове. Причем, как я понимаю, рассматривать все буквы в слове нужно не только для слов с одинаковой первой буквой, но и для всех других
0
Michail97
93 / 40 / 23
Регистрация: 18.09.2016
Сообщений: 372
18.10.2017, 21:45 8
DenDen46, именно так. Можете сразу копировать в массив строк. Только вначале выделять память под первую строчку нужно, ну и задать константой размер слова.
Цитата Сообщение от DenDen46 Посмотреть сообщение
я должен ввести массив
Не нужно этого делать. С помощью getchar вводите предложение в поток, а потом он и так будет считывать его. Очень таки удобно.
Реализовать у меня нет времени, подумайте как это сделать сами.
Коды букв определить не проблема.
Да и сравнить тоже просто. Ходить в цикле пока какой-нибудь из символов будет( больше или меньше)
0
DenDen46
0 / 0 / 0
Регистрация: 04.07.2015
Сообщений: 27
19.10.2017, 23:51  [ТС] 9
Цитата Сообщение от Michail97 Посмотреть сообщение
getchar вводите предложение в поток, а потом он и так будет считывать его
Пытался сегодня это сделать. Но как сделать цикл, который будет перебирать слова, я не имею никакого понятия
Этот код нам давали на паре как способ ввода строки
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h> 
 
int
main()
{
    char st[50] = { 0 };
    char c;
    int i = 0;
    while (( c = getchar()) != '\n')
    {
        st[i] = c;
        i = i + 1;
    }
    i = 0;
    while (st[i] != 0)
    {
        printf("%c", st[i]);
        i++;
    }
    return 0;
}
0
easybudda
Модератор
Эксперт CЭксперт С++
10210 / 6109 / 1536
Регистрация: 25.07.2009
Сообщений: 11,618
20.10.2017, 00:34 10
Цитата Сообщение от DenDen46 Посмотреть сообщение
Этот код нам давали на паре как способ ввода строки
А проверять выход за границу массива Керниган с Ритчи будут? Введите 50 символов или чуть больше и удивитесь результату!
Цитата Сообщение от DenDen46 Посмотреть сообщение
Разговаривал с преподавателем на эту тему. Он сказал, что нужен только один массив.
Во-первых, если
Цитата Сообщение от DenDen46 Посмотреть сообщение
программа должна определить где в этом массиве начинаются слова
то, надо эти определённые начала слов тоже где-то хранить - в массиве указателей к примеру, а во-вторых
Цитата Сообщение от DenDen46 Посмотреть сообщение
А потом программа должна сравнивать эти слова, я так понимаю, посимвольно, и переставлять их по алфавиту.
переставлять в одном массиве потенциально разные по длине куски - занятие не для слабонервных.
0
Michail97
93 / 40 / 23
Регистрация: 18.09.2016
Сообщений: 372
20.10.2017, 00:55 11
DenDen46, на днях писал код одному ТС.
Вот набросок, память отдавайте сами, ведущие пробелы пропускайте, предусмотрите двойные пробелы
Но , надеюсь, идея считывания будет понятна
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 20
int main()
{
 
    printf( "Enter sentence\n" );
    char al;
    char **mass = NULL;
    char buff[31];
    int i = 0, k = 0;
    while(  ( al = getchar()) )
    {
       buff[i] = al;
       if(  buff[i] == ' ' ||  buff[i] == ',' || buff[i] == '\n')
       {
         buff[i] = '\0';
         mass = (char**)realloc( mass, sizeof(char*)*(k+1) );
         if( !mass ) return 1;
         mass[k] = (char*)calloc( LEN+1, sizeof(char));
         if( !mass[k] ) return 1;
         strcpy( mass[k], buff );
         k += 1;
         if( al == '\n' )break;
         i = 0;
       }
        else
            i++;
    }
 
    for( int i = 0; i < k; i++ )
      puts( mass[i] );
 
    return 0;
}
Добавлено через 5 минут
Вместо strcpy организуйте посимвольное копирование , создайте ещё 2 индексных переменых до цикла[
и деалайте что-то подобное while( mass_1[s++] = mass_2[k++]);
А на сортировку в самом простом случае используйте пузырёк, но strcmp все равно описать надо, как это сделать, я уже говорил
0
20.10.2017, 00:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2017, 00:55

Ввести строку. Вывести слова в алфавитном порядке
нужно написать программу на языке С

Ввести строку, вывести только слова, заканчивающиеся на гласную букву
Ввести строку, вывести только слова, заканчивающиеся на гласную букву. Алгоритм: for-бегает по...

Ввести строку, вывести пословно на экран, но слова в обратном порядке
если можно, с комментариями: Ввести строку, вывести пословно на экран, но слова в обратном порядке.


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru