Удалить из массива повторяющиеся символы и отсортировать по алфавиту - C (СИ)
Формулировка задачи:
Вообще задание звучит так:
Разработать приложение, выполняющее следующие функции. Ввести с клавиатуры значения элементов символьного одномерного массива. Удалить из него повторяющиеся символы и отсортировать по алфавиту (методом выбора).
Не правильно работает часть программы где нужно удалить повторяющиеся символы
Код:
#include<stdio.h> #include<string.h> #include <conio.h> void main() { char A[11]; int i,j,k,f,n,p; char b; printf("Vvedite massiv A\n"); for(i=0; i<10; i++) { printf("Vvedite A[%d]=",i); scanf("%s", &A[i]); printf("\n"); } printf("vvedenniy massiv\n"); for(i=0; i<10; i++) printf("A[%d]= %c \n",i,A[i]); printf("\nEnten number of elements: "); scanf("%u",&n); printf("\nEnter elements: "); for (i=0; i<n; i++) scanf("%u",&p[i]); for(j=0; j<9; j++) for(i=j+1; i<10; i++) {if(A[j]==A[i]) { A[i]=A[i+1]; } } f=strlen(A); printf("massiv posle udaleniya povtorov \n"); for(i=0; i<f; i++) printf("A[%d]= %c \n",i,A[i]); n=9; for (i = 0; i < n - 1; i++) { for (k = i, j = i + 1; j < n; j++) /* находим в цикле */ if(A[j] < A[k]) /* минимальный элемент */ k = j; /* и запоминаем его номер в k */ b=A[i];A[i]=A[k];A[k]=b; /* меняем местами минимальный и элем., */ } /* с которого начинался цикл */ printf("massiv posle sortirovki \n"); for(i=0; i<f; i++) printf("A[%d]= %c \n",i,A[i]); }
Решение задачи: «Удалить из массива повторяющиеся символы и отсортировать по алфавиту»
textual
Листинг программы
#include <stdio.h> #include <string.h> #define size 128 void erase(char * str,unsigned index){ while (str[index]) //пока str[index] не равен символу конца строки str[index]=str[index+++1]; //присваиваем элементам, начиная с index, следующие за ним элементы } int main(){ char s[size]="\0"; printf("string:\n"); for (int i=-1; s[i++]!='\n'; scanf("%c",&s[i])); //посимвольное считывание, пока не попадется ентер s[strlen(s)-1]='\0'; //удаляем ентер с конца строки... можете более симпатичный ввод сделать, это ужас=) printf("string - %s\n",s); //выводим считанную строку char recsym[size]="\0"; //тут будут лежать повторяющиеся символы for (unsigned i=0,j=0; s[i]; i++) //идем циклом по строке if (strchr(recsym,s[i])) erase(s,i--); else recsym[j++]=s[i]; //если символ есть во второй строке, то удаляем его, иначе заносим в массив повторяющихся символов printf("string without recurrent symbols - %s\n",s); //выводим строку уже без повторяющихся символов for (unsigned i=0; i < strlen(s)-1; i++) //это for (unsigned j=i+1; s[j]; j++) //это тоже if (s[i]>s[j]) {char temp; temp=s[i]; s[i]=s[j]; s[j]=temp;} //и это-сортировка printf("sorted string - %s\n",s); //выводим отсортированную строку return 0; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы с памятью и строками
- Определяем размер массива, который будет использоваться в программе
- Создаем функцию erase, которая удаляет определенный символ из строки, заменяя его на следующий за ним символ
- В функции main считываем строку с помощью scanf и удаляем из нее символ новой строки
- Создаем массив recsym для хранения повторяющихся символов
- Проходим по исходной строке, проверяем наличие каждого символа в массиве recsym, если символ есть - удаляем его из строки с помощью функции erase, иначе добавляем его в массив recsym
- Выводим исходную строку без повторяющихся символов
- Сортируем строку с помощью двух вложенных циклов, сравнивая символы и меняя их местами при необходимости
- Выводим отсортированную строку
- Завершаем программу
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д