В символьной строке оставить только те слова, которые состоят только из разных букв - C (СИ)
Формулировка задачи:
Мне дали такое задание В символьной строке оставить только те слова, которые состоят только из разных букв.
Но сказали что нельзя использовать два массива и использовать только стандартные функции
Однако если вы можете используя другие пожалуйста объясните что они делают( т.к. я первокурсник и знаю не много) Вот сам код но он не верен т.к. работает не всегда
Листинг программы
- #include<stdio.h>
- void main(void)
- {
- char line[1000];
- int i, j, a, b, flag;
- i = 0;
- j = 0;
- a = i;
- flag = 0;
- printf("Enter the string:\n");
- gets(line);
- while (line[i] != '\0')
- {
- if (line[i] == ' ' || line[i] == '.' || line[i] == ',' || line[i] == '!' || line[i] == '?' || line[i] == '\t')
- {
- if (flag == 0)
- {
- while (a != i)
- {
- line[j] = line[a];
- j++;
- a++;
- }
- }
- else
- {
- line[j] = line[i];
- flag = 0;
- }
- j++;
- i++;
- a = i;
- }
- else
- {
- b = i + 1;
- while (line[b] != ' ' && line[b] != '.' && line[b] != ',' && line[b] != '!' && line[b] != '?' && line[b] != '\t' && line[b] != '\0' && flag != 1)
- {
- if (line[i] == line[b])
- {
- flag = 1;
- }
- b++;
- }
- i++;
- }
- }
- if (flag == 0)
- {
- while (a != i)
- {
- line[j] = line[a];
- j++;
- a++;
- }
- }
- else
- {
- line[j] = line[i];
- flag = 0;
- }
- line[j] = line[i];
- printf("Summary line:\n");
- puts(line);
- }
Решение задачи: «В символьной строке оставить только те слова, которые состоят только из разных букв»
textual
Листинг программы
- #include <stdio.h>
- int main()
- {
- char s[80];
- int i = 0, j, k, m, flag = 0, xflag = 0;
- puts("Input line");
- fgets(s, 80, stdin);
- while(s[i]){
- if(s[i] != ' ' && flag == 0){
- flag = 1;
- k = i;
- }
- if(flag == 1 && (s[i] == ' ' || s[i] == '.' || s[i] == '\n' || s[i] == ',')){
- for(j = k; j < i - 1; j++){
- for(m = k + 1; m < i; m++){
- if(s[j] == s[m] && j != m){
- xflag = 1;
- }
- }
- }
- if(xflag == 0){
- for(j = k; j < i; j++)
- printf("%c",s[j]);
- printf(" ");
- }
- xflag = 0;
- flag = 0;
- }
- i++;
- }
- return 0;
- }
Объяснение кода листинга программы
В этом коде:
- Объявлены переменные:
s
- символная строка, в которую вводится текст с клавиатуры;i
,j
,k
,m
- счётчики для обработки текста;flag
- флаг, который отслеживает первое вхождение символа в строку;xflag
- флаг, который отслеживает одинаковые символы в строке.
- Ввод строки с клавиатуры.
- В цикле обрабатывается каждый символ в строке. Если текущий символ не пробел и флаг равен 0, то:
- устанавливается флаг
flag
равным 1; - сохраняется индекс первого символа в строке.
- устанавливается флаг
- Если флаг равен 1 и текущий символ является пробелом или знаком препинания, то:
- в цикле проходят по всем символам от индекса
k
доi-1
, которые не являются пробелами, знаками препинания или текущим символом; - в цикле проверяют каждый символ на равенство текущему символу и его индексу;
- если найден такой символ, то устанавливается флаг
xflag
равным 1.
- в цикле проходят по всем символам от индекса
- Если флаг
xflag
равен 0, то:- в цикле проходят по всем символам от индекса
k
доi-1
и выводят каждый символ; - после вывода символа добавляют пробел.
- в цикле проходят по всем символам от индекса
- После цикла устанавливают флаг
xflag
равным 0 и флагflag
равным 0. - Цикл продолжается до тех пор, пока не будет введен символ новой строки.
- Программа завершается, возвращая 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д