Написать программу, упорядочивающую массив строк в порядке возрастания длины их первого слова методом пузырьковой сортировки - 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
- Выводим отсортированные строки на экран