Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2021, 16:36   #1
opsam
Пользователь
 
Регистрация: 24.11.2021
Сообщений: 37
Радость написать программу обработки строк на языке Си

Дан текст.
а) Сократить количество пропусков между словами данного предложения к одному.
б) Заменить регистр букв последнего слова на противоположный.
в) Найти в тексте порядковый номер самого длинного слова.
язык Си
кто то может подсказать как делать? я сам не понимаю, а лабу нужно сдать завтра. буду очень благодарен
opsam вне форума Ответить с цитированием
Старый 24.11.2021, 17:40   #2
opsam
Пользователь
 
Регистрация: 24.11.2021
Сообщений: 37
По умолчанию

я нашел как выполнить пункт а, но не знаю как выполнять остальные
Код:
#include  <stdio.h>
#include <locale.h>
#include <ctype.h>
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
char str[101];
printf ("Введите строку:");
gets(str);
  int j=1;
  for (int i=1; str[i]!=0; i++) {
     if((str[i] == ' ') && (str[i-1]==' ')) continue;
     str[j++] = str[i];
}
    if (str[j-1]==' ') j--;
  str[j] = 0;
  printf("Результат:");  puts(str);
}
opsam вне форума Ответить с цитированием
Старый 24.11.2021, 17:57   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,371
По умолчанию

Цитата:
кто то может подсказать как делать? я сам не понимаю,
Цитата:
сам не понимаю
- это в смысле: "Не понимаю как" или "Не знаю Си"?
Как -
Алгоритм:
1. Принимаем строку.
Описываем дополнительную переменную, которая будет индексом, указывающем позицию, в которую копируем символы.
а) Просматриваем слева направо по символам и копируем во вспомогательную строку (это как вариант, но можно этого и не делать - это будет другая версия алгоритма).
Если пробел, то поднимаем флажок и копируем. Доп. переменную инкрементируем.
Если флажок установлен и пробел, то не копируем.
Если не пробел, то копируем и флажок сбрасываем. Доп. переменную инкрементируем.

б) Если надо оставить в той же строке:
Тоже, что и выше, но место копирования - та же строка.

2. Просматриваем строку с хвоста (в цикле типа while simvol != ' '). Тут, между кавычками - пробел.
Индекс указывает на последний символ строки.
Делаем функцию Upper() над символом и вставляем его в строку.
Декрементируем индекс.
Если пробел, то цикл завершается.


3. Описываем переменные, например, Slovo (текущий номер слова), maxSlovo, maxcount и count. Инициируем их нулями.
Просматриваем строку.
Если символ, то count += 1 (инкремент)
Если пробел, то:
- Slovo += 1; и: cравниваем count с maxcount:
- если count больше maxcount, то: maxcount = count; maxSlovo = Slovo;
- count обнуляем.
Если конец строки, то завершаем обработку и выводим результат.

Так думаю, что алгоритмы 1 и 3 можно сделать в одном цикле.

PS: В вашем алгоритме предполагается, что слова разделены двумя пробелами. А если их будет 3 или 5?
Как-то так, ...

Последний раз редактировалось ViktorR; 24.11.2021 в 17:59.
ViktorR вне форума Ответить с цитированием
Старый 24.11.2021, 18:02   #4
opsam
Пользователь
 
Регистрация: 24.11.2021
Сообщений: 37
По умолчанию

я сам язык Си не особо понимаю, я на первом курсе учусь только, и из за дистанта сложновато немного. Можете как то с самим кодом помочь?
opsam вне форума Ответить с цитированием
Старый 24.11.2021, 18:02   #5
opsam
Пользователь
 
Регистрация: 24.11.2021
Сообщений: 37
По умолчанию

ViktorR, можете с самим кодом пожалуйста помочь?
opsam вне форума Ответить с цитированием
Старый 24.11.2021, 19:34   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,708
По умолчанию

Может быть, нужна не "помощь с кодом", а помощь в изучении языка? Что, раз дистант, то преподы отгородились железной стеной, и у них спросить нельзя непонятки? Тогда можно в форум с конкретными вопросами по языку.
У меня до сих пор убеждение (может быть, устаревшее уже), что задания даются не "абы штоб было", а для проверки усвоения материала. От того, что добрый дядя на халяву решит двоечнику задачу - в голове не прибавится ни одного байта соображаловки.
digitalis вне форума Ответить с цитированием
Старый 24.11.2021, 19:36   #7
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,371
По умолчанию

Цитата:
ViktorR, можете с самим кодом пожалуйста помочь?
Нет, к сожалению.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 24.11.2021, 19:37   #8
opsam
Пользователь
 
Регистрация: 24.11.2021
Сообщений: 37
По умолчанию

digitalis, да я просто по времени не успеваю, мне на завтра сдать уже нужно, а до этого по другим предметам завал был и я не мог этот вопрос подробнее изучить. Поэтому и попросил помощи с кодом тут
opsam вне форума Ответить с цитированием
Старый 24.11.2021, 19:50   #9
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,708
По умолчанию

Сочувствую. Но у меня на компе Си нету, а я привык если уж давать совет, то работающий.
Ну если бы сам написал пункт 1), то никаких трудностей не было бы его модифицировать под другие пункты. Сдул ?
ViktorR - а если там уже верхний регистр? Я смысл задания понял так, что его над перепихнуть в нижний.
opsam Алгоритм тебе ViktorR расписал, основа есть (п.1) - то
Цитата:
За работу, товарищи!
© Н.С.Хрущёв

Последний раз редактировалось digitalis; 24.11.2021 в 19:55.
digitalis вне форума Ответить с цитированием
Старый 24.11.2021, 22:18   #10
opsam
Пользователь
 
Регистрация: 24.11.2021
Сообщений: 37
По умолчанию

у меня получилось выполнить и пункт б
может поможете подсказкой с выполнением пункта в?
Код:
#include  <stdio.h>
#include <locale.h>
#include <ctype.h>
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"rus");
         char str[101];
         printf ("Введите строку:");
      gets(str);
    int j=1;
   for (int i=1; str[i]!=0; i++)
{
     if((str[i] == ' ') && (str[i-1]==' ')) continue;
     str[j++] = str[i];

}
{


  for (unsigned i = 0; i < 101; i++)
     if ('A' <= str[i] && str[i] <= 'Z') str[i] += 'a'-'A';
         else if ('a' <= str[i] && str[i] <= 'z') str[i] += 'A'-'a';

}

     if (str[j-1]==' ') j--;
  str[j] = 0;
  printf("\nРезультат:");  puts(str);


}
opsam вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Составить на языке Турбо Паскаль программу обработки строк и двумерного массива. Wenia Паскаль, Turbo Pascal, PascalABC.NET 11 30.11.2012 09:47
Используя инструкции обработки строк написать программу на языке ассемблера IA-32 StarMoon Помощь студентам 0 02.05.2012 17:16