Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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