Строка: Если все символы 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, указывающее на успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д