Строка: Если все символы A входят в B, то упорядочить символы B в порядке, обратном алфавитному... - C (СИ)
Формулировка задачи:
Даны строки A и B. Если все символы A входят в B и в B есть повторяющиеся сим-волы, то упорядочить символы B в порядке, обратном к алфавитному, удалив повторяющиеся символы, и удалить русские буквы из A; в остальных случаях удалить из A символы, не входящие в B и продублировать цифры в B.
Собственно с массивами чисел и их обработкой разобрался вчера, переделав кучу вариантов различных задач, теперь же проблема в строках. Читал про функции для работы с ними, но как решить эту задачу через них, не совсем представляю.
P.S. Такой уж я человек, что только разобрав код, могу понять как делать подобное )
Попытался по примерам подобных программ написать часть своей, но после ввода сток ничего не происходит, просто мигает курсор и окно не исчезает
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int i,j,k,e,lb;
char A[80],B[80],min;
printf("Enter the string A:");
gets(A);
printf("Enter the string B:");
gets(B);
char VerifA1[]="АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя";
e=0;
for(i=strlen(A)-1;i>=0;i--)
{
if(A[i] == B[i])
{
e=1;
}
}
i=0;
int e1=0;
while(i<=strlen(B)-1)
{
for(j=strlen(B)-1;j>i;j--)
{
if(B[i]!=B[j])
{
e1=1;
}
i++;
}
}
if ((e = 1) && (e1 = 1))
{
for(i=strlen(A)-1;i>=0;i--)
{
if(strchr(VerifA1,A[i])!=NULL)
{
for(j=i;j<strlen(A);j++)
{
A[j]=A[j+1];
}
}
}
for(i=0;i<=strlen(B)-2;i++)
{
min=B[i];
k=i;
for(j=i+1;j<=strlen(B)-1;j++)
{
if(B[j]<min)
{
min=B[j];
k=j;
}
}
B[k]=B[i];
B[i]=min;
}
i=0;
while(i<=strlen(B)-1)
{
for(j=strlen(B)-1;j>i;j--)
{
if(B[i]==B[j])
{
for(k=j;k<strlen(B);k++)
{
B[k]=B[k+1];
}
}
}
i++;
}
}
printf("A:");
puts(A);
printf("B:");
puts(B);
return 0;
}Решение задачи: «Строка: Если все символы A входят в B, то упорядочить символы B в порядке, обратном алфавитному...»
textual
Листинг программы
#include <stdio.h>
int is_rus(char );
void delete_rus(char *);
int main()
{
char A[] = "I Я hear слыхал theдre's щ rumors ходят слухи on the в этих, uh как их,
Internets... интернетах";
delete_rus(A);
puts(A);
return 0;
}
int is_rus(char c)
{
char azbuka[]="АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя";
for(int i = 0; azbuka[i]; i++)
if(c == azbuka[i])
return 1;
return 0;
}
void delete_rus(char *str)
{
char *start, *end;
for ( ; *str; str++){
if(is_rus(*str)){
start = str;
end = start + 1;
while(*end && is_rus(*end))
end++;
while(*end)
*start++ = *end++;
*start = '\0';
}
}
}
Объяснение кода листинга программы
- В функции
is_rusопределяется, является ли символ русским. - В функции
delete_rusищется первый русский символ в строке. - Если русский символ найден, то он помечается как удаляемый.
- В цикле происходит перебор символов строки, начиная с последнего.
- Если текущий символ является русским, то он удаляется путем замены на следующий нерусский символ.
- Если русский символ не найден, то он помечается как не удаляемый.
- В конце строки добавляется нулевой символ.
- В функции
mainвызывается функцияdelete_rusдля строкиA. - Затем выводится измененная строка
A. - В конце программы возвращается значение 0, указывающее на успешное выполнение программы.