Написать программу, упорядочивающую массив строк в порядке возрастания длины их первого слова методом пузырьковой сортировки - C (СИ)
Формулировка задачи:
Доброго времени суток,
Прошу помочь с задачей:
Весь код:
Очистил буфер входного потока везде, осталось только доделать...
Но break юзать как-то нехорошо, нам говорили. И почему не получалось первым способом?
Но программа нестабильная...Не знаю, почему. Пытался юзать fgets( .. ) также вылетает.
Таким образом,
Написать программу, упорядочивающую массив строк в порядке возрастания длины их первого слова методом пузырьковой сортировки. Использовать указатели на строки.
Я пытаюсь сделать так: в цикле ввожу строки, затем в нём же создаю еще один цикл(для обращения к символам), в котором проверяю условие: если данный элемент массива( символ ) не является пробелом, к переменной k прибавляю 1, далее выхожу из меньшего цикла, записываю значение k (длину первого слова введённой только что строки) в другой целочисленный массив. Вроде бы всё в лоб и просто, но не выходит. Ошибаюсь где-то здесь вот здесь:for(j=0;j<z;j++) { if(mas[i][j] !=' ') { k=k+1; } }
int main() { int m,n,i; int z,j; setlocale(LC_CTYPE,"RUS"); printf("Введие количество строк\n"); scanf("%d",&n); int* a=(int*)malloc(sizeof(int)); char **mas=(char**)malloc(sizeof(char*)*n); printf("\nВведие строки:\n"); for (i=0;i<n;i++) { mas[i]=(char*)malloc(sizeof(char)); gets(mas[i]); z=strlen(mas[i]); int k=0; for(j=0;j<z;j++) { if(mas[i][j] !=' ') { k=k+1; } } a[i]=k; } for (int l=0;l<n;l++) printf (" %d ", a[l]); return 0; }
Заменил внутренний цикл на:
for(j=0;j<z;j++) { if(mas[i][j] ==' ') break; k=k+1; }
Вот итог:
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <locale.h> void bubble(int *items,char** mas, int n); int main() { int m,n,i; int z,j; setlocale(LC_CTYPE,"RUS"); printf("Введие количество строк\n"); scanf("%d",&n); int* a=(int*)malloc(sizeof(int)); char **mas=(char**)malloc(sizeof(char*)*n); printf("\nВведие строки:\n"); fflush(stdin); for (i=0;i<n;i++) { mas[i]=(char*)malloc(sizeof(char)); gets(mas[i]); z=strlen(mas[i]); int k=0; for(j=0;j<z;j++) { if(mas[i][j] ==' ') break; k=k+1; } a[i]=k; } bubble(a,mas,n); return 0; } void bubble(int *items,char** mas, int n) { int a, b, t; char* to; int i; for(a=1; a < n; ++a) for(b=n-1; b >= a; --b) { if(items[b-1] > items[b]) { t = items[b-1]; items[b-1] = items[b]; items[b] = t; to = *(mas+b-1); *(mas+b-1)=*(mas+b); *(mas+b)=to; } } printf("\nВвёденные строки отсортированы по длине первого слова в порядке возрастания:\n"); for(i=0;i<n;i++) printf("\n%s\n",*(mas+i)); }
осталось два вопроса
: 1)Почему изначально не получилось( использовать знак неравенства) 2)Почему иногда вылетает?(много циклов?)
UPD
вопрос 2 отпал, память я "криво" выделял...
Решение задачи: «Написать программу, упорядочивающую массив строк в порядке возрастания длины их первого слова методом пузырьковой сортировки»
textual
Листинг программы
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <locale.h> void bubble(int *items,char** mas, int n); int main() { int nn = 125; int n,i,z,j; setlocale(LC_CTYPE,"RUS"); printf( "Введие количество строк\n" ); scanf("%d",&n); int* a=(int*)malloc(sizeof(int)*n); char **mas=(char**)malloc(sizeof(char*)*n); printf( "\nВведите строки:\n" ); fflush(stdin); for (i=0;i<n; i++) { mas[i]=(char*)malloc(sizeof(char)*nn); gets( *(mas+i) ); z=strlen( *(mas+i) ); int k=0; for(j=0;j<z;j++) { if(mas[i][j] ==' ') break; k=k+1; } a[i]=k; } bubble(a,mas,n); return 0; } void bubble(int *items,char** mas, int n) { int a, b, t; char* to; int i; for(a=1; a < n; a++) for(b=n-1; b >= a; b--) { if(items[b-1] > items[b]) { t = items[b-1]; items[b-1] = items[b]; items[b] = t; to = *(mas+b-1); *(mas+b-1)=*(mas+b); *(mas+b)=to; } } printf( "\nВвёденные строки отсортированы по длине первого слова:\n" ); for(i = 0 ; i < n; i++ ) printf("\n%s\n", *(mas+i) ); }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы:
- stdlib.h для функций работы с памятью и сканирования
- printf.h для функции вывода на экран
- string.h для работы со строками
- locale.h для установки локали
- Определяем функцию bubble(), которая будет сортировать массив строк
- В функции main() считываем количество строк и сохраняем его в переменную nn
- Создаем массивы a и mas, выделяем под них память
- Считываем строки и сохраняем их в массив mas
- Вычисляем длину первого слова каждой строки и сохраняем ее в массив a
- Вызываем функцию bubble(), передавая ей массив a и массив mas
- Выводим отсортированные строки на экран
- В функции bubble() производим сортировку массива a по возрастанию
- Перемещаем строки в массиве mas в соответствии с изменениями в массиве a
- Выводим отсортированные строки на экран
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д