Удалить из массива повторяющиеся символы и отсортировать по алфавиту - 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
- Выводим исходную строку без повторяющихся символов
- Сортируем строку с помощью двух вложенных циклов, сравнивая символы и меняя их местами при необходимости
- Выводим отсортированную строку
- Завершаем программу