Написать программу, упорядочивающую массив строк в порядке возрастания длины их первого слова методом пузырьковой сортировки - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток, Прошу помочь с задачей:

Написать программу, упорядочивающую массив строк в порядке возрастания длины их первого слова методом пузырьковой сортировки. Использовать указатели на строки.

Я пытаюсь сделать так: в цикле ввожу строки, затем в нём же создаю еще один цикл(для обращения к символам), в котором проверяю условие: если данный элемент массива( символ ) не является пробелом, к переменной 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;
        }
Очистил буфер входного потока везде, осталось только доделать... Но break юзать как-то нехорошо, нам говорили. И почему не получалось первым способом?

Вот итог:

#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));
}
Но программа нестабильная...Не знаю, почему. Пытался юзать fgets( .. ) также вылетает. Таким образом,

осталось два вопроса

: 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) );
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы:
    • stdlib.h для функций работы с памятью и сканирования
    • printf.h для функции вывода на экран
    • string.h для работы со строками
    • locale.h для установки локали
  2. Определяем функцию bubble(), которая будет сортировать массив строк
  3. В функции main() считываем количество строк и сохраняем его в переменную nn
  4. Создаем массивы a и mas, выделяем под них память
  5. Считываем строки и сохраняем их в массив mas
  6. Вычисляем длину первого слова каждой строки и сохраняем ее в массив a
  7. Вызываем функцию bubble(), передавая ей массив a и массив mas
  8. Выводим отсортированные строки на экран
  9. В функции bubble() производим сортировку массива a по возрастанию
  10. Перемещаем строки в массиве mas в соответствии с изменениями в массиве a
  11. Выводим отсортированные строки на экран

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.375 из 5
Похожие ответы