Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Исправить программу на С 
:(
    Опции темы
Ajelika
Дата 19.12.2016, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.12.2016

Репутация: нет
Всего: нет



Подсчитать количество слов, начинающихся на большую букву и со-держащих хотя бы один арифметический знак.
Но count срабатывает когда в слове есть арифметический знак но нет большой буквы 1.Как исправить?
Код

int f(const char* str)
{
    static const char* signs = "+-/*%";
    int i;
    for(i=0; str[i] != '\0'; i++)
    if (isupper(str[i])&&(str[i-1]==' ')) return 1;
    while(*str) if (strchr(signs, *str++)) return 1;
    return 0;
}

PM MAIL   Вверх
baldman88
Дата 19.12.2016, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: 1
Всего: 7



Что такое count, и где он срабатывает?  smile 
PM MAIL   Вверх
Ajelika
Дата 19.12.2016, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.12.2016

Репутация: нет
Всего: нет



baldman88, ах да забыл 
Код

int f(const char* str)
{
    static const char* signs = "+-/*%";
    int i;
    for(i=0; str[i] != '\0'; i++)
    if (isupper(str[i])&&(str[i-1]==' ')) return 1;
    while(*str) if (strchr(signs, *str++)) return 1;
    return 0;
}
if (f(word))
{ count++;}
 нужно чтобы условие сработало если 1 буква большая и в слове есть арифметический знак.Но если ввести слово без большой буквы но с ариф. знаком то условие тоже срабатывает.Что надо в коде поменять? 
PM MAIL   Вверх
likehood
Дата 19.12.2016, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: нет
Всего: 24



Цитата(Ajelika @  19.12.2016,  18:31 Найти цитируемый пост)
Но если ввести слово без большой буквы но с ариф. знаком то условие тоже срабатывает.

Кстати, если ввести слово, начинающееся с большой буквы, но без арифметических знаков, то функция тоже вернёт единицу. Дело в том, что оператор return завершает работу функции, а значит последующий код не будет выполняться. 
Вместо return в шестой строке тебе нужно сохранить факт того, что слово начинается с большой буквы, в отдельную переменную. И далее в седьмой строке использовать эту переменную в операторе if.

PM MAIL   Вверх
Ajelika
Дата 19.12.2016, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.12.2016

Репутация: нет
Всего: нет



likehood, напиши это на моем коде как правильно изменить 
PM MAIL   Вверх
likehood
Дата 19.12.2016, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: нет
Всего: 24



Код

int f(const char* str)
{
    static const char* signs = "+-/*%";
    int i;
    bool capital = false;
    for(i=0; str[i] != '\0'; i++)
    if (isupper(str[i])&&(str[i-1]==' ')) capital = true;
    while(*str) if (capital && strchr(signs, *str++)) return 1;
    return 0;
}


PM MAIL   Вверх
baldman88
Дата 19.12.2016, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: 1
Всего: 7



Цитата(likehood @ 19.12.2016,  22:10)
Код

int f(const char* str)
{
    static const char* signs = "+-/*%";
    int i;
    bool capital = false;
    for(i=0; str[i] != '\0'; i++)
    if (isupper(str[i])&&(str[i-1]==' ')) capital = true;
    while(*str) if (capital && strchr(signs, *str++)) return 1;
    return 0;
}

На первом же слове будет сегфолт.
PM MAIL   Вверх
likehood
Дата 19.12.2016, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: нет
Всего: 24



Цитата(baldman88 @  19.12.2016,  23:37 Найти цитируемый пост)
На первом же слове будет сегфолт.

Имеется в виду обращение к str[i-1]? Да, это действительно сомнительное место, эту часть я не проверял.
PM MAIL   Вверх
Ajelika
Дата 20.12.2016, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.12.2016

Репутация: нет
Всего: нет



likehood, Если вводить первое слово, сначала пробел а потом слово, то если в слове у меня нет ни большой буквы и ариф. знака то программа виснет.Как исправить?
PM MAIL   Вверх
likehood
Дата 20.12.2016, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: нет
Всего: 24



В восьмой строке нужно поменять местами части условия:
Код

if (strchr(signs, *str++) && capital)

PM MAIL   Вверх
Ajelika
Дата 20.12.2016, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.12.2016

Репутация: нет
Всего: нет



likehood,  Если ввожу например слова через пробел: hdbbfh dhbhfbh hdbfhb Yebf+
то 3 первых слова не подходят  , а последнее слово удовлетворяет условию и должно вывести "1".Но выводит все нули: "0000" . Как исправить?
PM MAIL   Вверх
likehood
Дата 20.12.2016, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: нет
Всего: 24



Цитата(Ajelika @  20.12.2016,  11:03 Найти цитируемый пост)
Как исправить?

Что исправить? Где полный код программы?
PM MAIL   Вверх
Ajelika
Дата 20.12.2016, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.12.2016

Репутация: нет
Всего: нет



likehood
Код


#include <iostream>
#include <cctype>
#include <cstring>
#include <stdio.h>
#define DELIMITERS " .,:;?!\n\t"
#define ARIF "+-/*%"
#define N 1024

int f(const char* str)
{
    static const char* signs = "+-/*%";
    int i;
    bool capital = false;
    for(i=0; str[i] != '\0'; i++)
    if (isupper(str[i])&&(str[i-1]==' ')) capital = true;
    while(*str) if (strchr(signs, *str++) && capital) return 1;
    return 0;
}


int Check(char *s)
{
int i, count;
for(i = count = 0; s[i] != '\0'; i++)
if (isalpha(s[i])&&s[i]==s[i+1])// Если в слове есть две рядом одинаковые буквы то печатаю это слово.
     printf("%s\n",s);


}

int main( )
{
char s[N];
char *word;
int i, j, flag[256] = {0},count=0;
fgets(s, N, stdin);
for (i = 0; DELIMITERS[i]; i++)
flag[DELIMITERS[i]] = 1;
for (i = 0; s[i] && flag[s[i]]; i++)
;
while (s[i])
{
word = s + i;
while (s[i] && !flag[s[i]])
i++;
j = i;
while (s[i] && flag[s[i]])
i++;
s[j] = '\0';

if (Check(word))
{(puts(word));}

if (f(word))
{count++;}



printf("%d",count);
}
}


PM MAIL   Вверх
likehood
Дата 20.12.2016, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: нет
Всего: 24



Попробуй закомментировать 51-ю строку и посмотри правильно ли выводятся слова.
PM MAIL   Вверх
Ajelika
Дата 20.12.2016, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.12.2016

Репутация: нет
Всего: нет



likehood, 51 строчка относиться к другой функции, а 54 да, к той что нужна.Я вроде понял проблему: если я например ввожу первое слово не удовлетворяющее условию(jfngjfg) то count принимает значение "0", когда ввожу втрое слово удовлетворяющее условию(Yhebhfb+) то снова выводит "0" потому что count так и остался равен "0". Как исправить всё равно не знаю ?    
PM MAIL   Вверх
likehood
Дата 20.12.2016, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: нет
Всего: 24



Цитата(Ajelika @  20.12.2016,  12:21 Найти цитируемый пост)
51 строчка относиться к другой функции

Да, я в курсе. Я просто хотел посмотреть какие слова будут выводиться, чтобы знать, что подаётся
на вход функции f.
PM MAIL   Вверх
Ajelika
Дата 20.12.2016, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.12.2016

Репутация: нет
Всего: нет



likehood, если ее закомментировать, то результат тот же
PM MAIL   Вверх
likehood
Дата 20.12.2016, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: нет
Всего: 24



Разумеется. Вопрос в том, какие слова будут выводиться.
PM MAIL   Вверх
Ajelika
Дата 20.12.2016, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.12.2016

Репутация: нет
Всего: нет



likehood, вот:

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  123.png 102,86 Kb
PM MAIL   Вверх
likehood
Дата 20.12.2016, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: нет
Всего: 24



Странно. Почему-то не срабатывает 52-я сточка. Где отдельные слова?

Добавлено через 2 минуты и 35 секунд
Может забыла закомментировать 51-ю строку.
PM MAIL   Вверх
Ajelika
Дата 20.12.2016, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.12.2016

Репутация: нет
Всего: нет



likehood,  не выводит потому что не встретил  в слове  две рядом одинаковые буквы 
PM MAIL   Вверх
likehood
Дата 20.12.2016, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: нет
Всего: 24



А если всё же закомменитровать 51-ю строку.
PM MAIL   Вверх
Ajelika
Дата 20.12.2016, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.12.2016

Репутация: нет
Всего: нет



likehood, если ее закоментировать, и ввести такое слово в котором есть два одинаковых символа стоящих рядом , то не выведет ничего

Добавлено через 58 секунд
Так ведь у нас проблема то с функцией в строчке 54-55 
PM MAIL   Вверх
likehood
Дата 20.12.2016, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: нет
Всего: 24



Цитата(Ajelika @  20.12.2016,  13:31 Найти цитируемый пост)
то не выведет ничего

То есть переменная word ссылается на пустую строку. Значит где-то в строках 41-49 есть ошибка.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1012 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.