Упорядочить элементы символьного массива - C (СИ)
Формулировка задачи:
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <string.h>
int PROVERKA(char*, int*);
void SortBubble(char*, int*);
int main(int argc, char *argv[])
{
setlocale(LC_ALL, "");
int n;
printf("Введите размер массива: ");
scanf("%d", &n);
char *arr = (char *) calloc(n, sizeof(char));
puts("Введите массив");
fflush(stdin);
gets(arr);
*(arr + n)='\0';
if (PROVERKA ( arr, &n) != 0){
puts("Массив не алфавитно-цифравой");
return 0;
}
SortBubble( arr, &n);
free(arr);
return 0;
}
int PROVERKA(char *arr, int *n)
{
int k=0;
for(int i=0; i<*n; i++){
if (isalnum(*(arr + i))==0)
k++;
}
return k;
}
void SortBubble(char *array, int *num)
{
for(int i=0;i<*num;i++){
for(int j=0;j<*num;j++)
if(*(array+j)>*(array+j+1)){
char tmp = *(array+j);
*(array+j) = *(array+j+1);
*(array+j+1) = tmp;
}
}
puts(array);
}Решение задачи: «Упорядочить элементы символьного массива»
textual
Листинг программы
void SortBubble(char *array, int *num)
{
for(int i=0;i<*num;i++){
for(int j=0;j<*num;j++) // мне кажется что надо здесь до *num - 1 потому что при j = *num - 1 | *(array+j+1))
if(*(array+j)>*(array+j+1)){ // указывает на '\0' и другие значения будут правее этого значения
char tmp = *(array+j); // следовательно будет получаться что символ конца строки находится вначале
*(array+j) = *(array+j+1); // поэтому и не выводит строку
*(array+j+1) = tmp;
}
}
puts(array);
}
Объяснение кода листинга программы
В этом коде реализована сортировка пузырьком для символьного массива.
- Входные данные:
array: указатель на начало символьного массива.num: указатель на количество элементов в массиве.
- Перебираем все элементы массива с помощью двух вложенных циклов.
- Внешний цикл: итерируемся от 0 до
*num. - Внутренний цикл: итерируемся от 0 до
*num, но не включая*num - 1(так как индексы массива начинаются с 0, а не с 1).
- Внешний цикл: итерируемся от 0 до
- Проверяем, если текущий элемент больше следующего, то меняем их местами.
- Создаем временную переменную
tmp, которая содержит значение текущего элемента. - Меняем значение текущего элемента на значение следующего элемента.
- Меняем значение следующего элемента на значение
tmp(т.е. на предыдущее значение текущего элемента).
- Создаем временную переменную
- После завершения внутреннего цикла, выводим отсортированный массив на экран с помощью
puts(array). - Возвращаем управление, не указывая, что функция должна возвращать.