Отсортировать массив методом пузырька - C (СИ)

  1. Здравствуйте, помогите пожалуйста разобраться в сортировке пузырьком (вроде теоретически она должна работать правильно, но не работает) Само задание звучит так: Задать динамический одномерный массив, размером n. Отсортировать данный массив методом пузырька. Все законченные части программы оформить в виде функций.C1 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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 #include<stdio.h> #include<stdlib.h>   //прототипы функций: int *mem(int n); void vvod(int *mas, int n); void sort(int *mas, int n); void vyvod(int *mas, int n);   void main() {       int n;     int *mas;     printf ("Vvedite razmer massiva n=");     scanf("%d", &n);     mas=mem(n);     printf("\nVvedite elementy massiva:");     vvod(mas, n);     sort(mas, n);     printf("\nOtsortirovannyi massiv:"); }   // функция выделения памяти под массив int *mem(int n) {     int *m;     m=(int*)calloc(n, sizeof(int));     if(m==NULL)     {         printf("\NDostato4nogo kolli4estva pamjati pod massiv net");         return m;     }     return m; }   //функция ввода массива void vvod(int *mas, int n) {     for(int i=0; i<n; i++)         scanf("%d", (mas+i)); }     // функция сортировки void sort(int *mas, int n) {     int tmp;     for(int i=0; i<n-1; i++)     {         for(int j=n-2; j>=i; j--)         {if(*(mas+j)>*(mas(j+1)))             tmp=*(mas+j);                         {*(mas+j)=*(mas(j+1));              *(mas(j+1))=tmp;             }         }     } }   // функция вывода на экран void vyvod(int *mas, int n) {     for(int i=0; i<n; i++)     printf("%5d", *(mas+i)); }


textual

Код к задаче: «Отсортировать массив методом пузырька - C (СИ)»

#include<stdio.h>
#include<stdlib.h>
 
//прототипы функций:
int *mem(int n);
void vvod(int *mas, int n);
void sort(int *mas, int n);
void vyvod(int *mas, int n);
 
void main()
{
 
    int n;
    int *mas;
    printf ("Vvedite razmer massiva n=");
    scanf("%d", &n);
    mas=mem(n);
    printf("\nVvedite elementy massiva:");
    vvod(mas, n);
    sort(mas, n);
    printf("\nOtsortirovannyi massiv:");
    vyvod(mas,n);
    system("pause");
}
 
// функция выделения памяти под массив
int *mem(int n)
{
    int *m;
    m=(int*)calloc(n, sizeof(int));
    if(m==NULL)
    {
        printf("\NDostato4nogo kolli4estva pamjati pod massiv net");
        return m;
    }
    return m;
}
 
//функция ввода массива
void vvod(int *mas, int n)
{
    for(int i=0; i<n; i++)
        scanf("%d", (mas+i));
}
 
 
// функция сортировки
void sort(int *mas, int n)
{
    int tmp;
    for(int i=0; i<n-1; i++)
    {
        for(int j=n-2; j>=i; j--)
        {
            if(mas[j]>mas[j+1]){
            tmp=mas[j];
            
            mas[j]=mas[j+1];
             mas[j+1]=tmp;
            }
            
        }
    }
}
 
// функция вывода на экран
void vyvod(int *mas, int n)
{
    for(int i=0; i<n; i++)
    printf("%5d", *(mas+i));
}

СДЕЛАЙТЕ РЕПОСТ

10   голосов, оценка 4.100 из 5



Похожие ответы
  1. Дали лабу,писать можно только на C. С ним не особо знаком. Вопрос такой. После чтения всех символов из файла, мне нужно отсортировать полученное по алфавиту. Пробую обычным пузырьком, но после него у меня компиль(Visual Studio 2017) ругается на free(text). Немного не понимаю, как я порчу кучу. Может я торможу, подскажите пожалуйста.C1 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 52 53 54 55 56 57 58 59 //19. Задан текстовый файл F1, состоящий из произвольной последовательности буквенных символов. Упорядочить символы в алфавитном порядке, при этом все повторяющиеся символы должны быть удалены, и переписать новый текст в файл F2. #include #include #include #include #include #include   void bubble(char *i, int n);   void main(void) {     SetConsoleCP(1251);     SetConsoleOutputCP(1251);       char *text = NULL;     int size = 0;     FILE *f;     f = fopen("F:\Input.txt", "r");       if (f != NULL)     {         fseek(f, 0, SEEK_END);         size = ftell(f);         fseek(f, 0, SEEK_SET);           text = (char*)malloc(size * sizeof(char));         fread(text, size, 1, f);     }     fclose(f);       bubble(text, strlen(text));     printf("%s", text);       f = fopen("F:\Output.txt", "w");     fwrite(text, 1, size, f);       free(text);     fclose(f);     _getch(); }   void bubble(char *i, int n) {     int a, b;     char t;       for (a = 0; a < n; a++)         for (b = n - 1; b >= a; b--)         {             if (i[b - 1] > i[b])             {                 t = i[b - 1];                 i[b - 1] = i[b];                 i[b] = t;             }         }   }

  1. Задана последовательность из N вещественных чисел. Определить сколько чисел меньше K, равно K и больше K. (массив random )

  1. Нужно написать рекурсивную функцию (программу) которая будет искать минимальный элемент в массиве.

  1. Как с помощью одного цикла отобразить на экране содержимое обоих массивов, при этом первый массив должен отображаться в первой строке, а каждый элемент второго массива должен помещаться под соответствующим элементом первого массива. Чтобы выводилось вот-так, только с помощью одного цикла. 1.00 | 2.00 | 3.00 | 4.00 | 5.00 | 6.00 | 7.00 | 8.00 | 1.00 | 3.00 | 6.00 | 10.00 | 15.00 | 21.00 | 28.00 | 36.00 |C1 2 3 4 5 6 7 8 9 10 11 12     for (index = 0; index < 2; index++)     {         for (index = 0; index < SIZE; index++)             printf("%5.2lf | ", array_one[index]);           printf("\n");           for (index = 0; index < SIZE; index++)             printf("%5.2lf | ", array_two[index]);            printf("\n");     }

  1. Создать массив, заполнить 20 элементами, сложить и вывести на экран все кратные 3Добавлено через 4 минуты Помогите плиз

  1. C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 void save_birnar(){ int i; FILE *fp; fp = fopen( "output.bin", "ab+" ); int N=100; for ( i = 0; i < N; i ++ )     fp = fopen( "output.bin", "ab+" ); // открыть двоичный файл на запись fwrite ( contacts[i].name, sizeof(contact), fp ); fwrite ( contacts[i].last_name, sizeof(contacts), N, fp ); // записать весь массив fwrite ( contacts[i].number, sizeof(contact), N, fp ); fwrite ( contacts[i].viber, sizeof(contact), N, fp ); fclose ( fp ); // закрыть файл   }Столкнулась с проблемой не могу сохранить структуруC1 2 3 4 5 6 7 8 struct contact { char name[30]; char last_name[30]; char number[30]; char viber[10]; int del; } *contacts;в двоичный фаил, не могу пользоваться нормально функцией fwrite. Вопрос, как записать массив структур в фаил и как прочитать потом данный фаил для дальнейшей работы с ним?

  1. Сформировать массив из элементов исходных массивов, больших второго элемента первого массива и положительных элементов второго массива. Требуется сформировать новый массив по заданию. В программе реализовать: 1) генерацию случайным образом элементов исходных массивов; 2) выполнение действия в соответствии с условием задачи; 3) порядок вывода: • исходные массивы, • сформированный массив, если он был сформирован. В противном случае – соответствующее сообщение. Помогите, а то не могу сделать

  1. Сформировать массив M, элементы которого mi = Cni , где: Cni = n! / i! (n - i)! , n = 20; i = 1,2,…, 5 Должно быть минимум две функции, первая - заполнение массива, вторая - вывод массива на экран.

  1. C1 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 #include   double sum2d(int a, int b, const double  mass[a][b]);   int main(void) {     const int YEARS = 5;     const int MONTHS = 12;     const float rain[YEARS][MONTHS] =     {         { 4.3, 4.3, 4.3, 3.0, 2.0, 1.2, 0.2, 0.2, 0.4, 2.4, 3.5, 6.6 },         { 8.5, 8.2, 1.2, 1.6, 2.4, 0.5, 2.0, 9.0, 3.0, 9.1, 4.7, 3.0 },         { 9.1, 8.5, 6.7, 4.3, 2.1, 0.8, 0.2, 0.2, 1.1, 2.3, 6.1, 8.4 },         { 7.2, 9.9, 8.4, 3.3, 1.2, 0.8, 0.4, 0.0, 0.6, 1.7, 4.3, 6.2 },         { 7.6, 5.6, 3.8, 2.8, 3.8, 0.2, 0.0, 0.0, 0.0, 1.3, 2.6, 5.2 },     };       printf("Среднегодовое количество осадков за 5 лет = %f",sum2d(YEARS, MONTHS, rain[YEARS][MONTHS])/YEARS); return 0; }   double sum2d(int a, int b, const double  mass[a][b]) {     int i, j;     int total;     double **pt;     **pt = mass[0][0];       for (i = 0; i < a; ++i)     {         for(j = 0; j < b; ++j)         {             total+=**pt;             ++pt;         }     } return total; }При компиляции помимо куци предупреждений выдается следующие ошибки: rain.c:20:2: error: incompatible type for argument 3 of ‘sum2d’ printf("Среднегодовое количество осадков за 5 лет = %f",sum2d(YEARS, MONTHS, rain[YEARS][MONTHS])/YEARS); ^ rain.c:3:8: note: expected ‘const double (*)[(sizetype)(b)]’ but argument is of type ‘float’ double sum2d(int a, int b, const double mass[a][b]);Добавлено через 23 секунды по заданию считать нужно с применением указателей.

  1. Дан массив размерности n. Заполнить массив случайными числами в диапазоне [-100;100]. Перевернуть массив: a[n-1]↔a[0], a[n-2]↔a[1] и т.д. Для работы с массивом использовать функцию. пример программыC1 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 // Обнулить в массиве отрицательные элементы #define _CRT_SECURE_NO_WARNINGS #include #include #include using namespace std; void func(int *a, int n) {     for (int i = 0; i < n; i++)         if (a[i] < 0) a[i] = 0; } int main() {     int *a;     int n;     srand(time(NULL));     printf("n= ");     scanf("%d", &n);     a = (int*)malloc(n*sizeof(int));     for (int i = 0; i