Исправить программу на С

 
0
 
C++
ava
Ajelika | 19.12.2016, 16:50
Подсчитать количество слов, начинающихся на большую букву и со-держащих хотя бы один арифметический знак.
Но 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;
}
Kommentare (23)
ava
baldman88 | 19.12.2016, 18:08 #
Что такое count, и где он срабатывает?  :crazy 
ava
Ajelika | 19.12.2016, 18:31 #
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 буква большая и в слове есть арифметический знак.Но если ввести слово без большой буквы но с ариф. знаком то условие тоже срабатывает.Что надо в коде поменять? 
ava
likehood | 19.12.2016, 20:44 #
Цитата (Ajelika @  19.12.2016,  18:31 findReferencedText)
Но если ввести слово без большой буквы но с ариф. знаком то условие тоже срабатывает.

Кстати, если ввести слово, начинающееся с большой буквы, но без арифметических знаков, то функция тоже вернёт единицу. Дело в том, что оператор return завершает работу функции, а значит последующий код не будет выполняться.
Вместо return в шестой строке тебе нужно сохранить факт того, что слово начинается с большой буквы, в отдельную переменную. И далее в седьмой строке использовать эту переменную в операторе if.
ava
Ajelika | 19.12.2016, 21:13 #
likehood, напиши это на моем коде как правильно изменить 
ava
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;
}

ava
baldman88 | 19.12.2016, 23:37 #
Цитата (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;

}


На первом же слове будет сегфолт.
ava
likehood | 19.12.2016, 23:49 #
Цитата (baldman88 @  19.12.2016,  23:37 findReferencedText)
На первом же слове будет сегфолт.

Имеется в виду обращение к str[i-1]? Да, это действительно сомнительное место, эту часть я не проверял.
ava
Ajelika | 20.12.2016, 10:24 #
likehood, Если вводить первое слово, сначала пробел а потом слово, то если в слове у меня нет ни большой буквы и ариф. знака то программа виснет.Как исправить?
ava
likehood | 20.12.2016, 10:45 #
В восьмой строке нужно поменять местами части условия:

if (strchr(signs, *str++) && capital)
ava
Ajelika | 20.12.2016, 11:03 #
likehood,  Если ввожу например слова через пробел: hdbbfh dhbhfbh hdbfhb Yebf+
то 3 первых слова не подходят  , а последнее слово удовлетворяет условию и должно вывести "1".Но выводит все нули: "0000" . Как исправить?
ava
likehood | 20.12.2016, 11:51 #
Цитата (Ajelika @  20.12.2016,  11:03 findReferencedText)
Как исправить?

Что исправить? Где полный код программы?
ava
Ajelika | 20.12.2016, 11:53 #
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);
}
}

ava
likehood | 20.12.2016, 12:15 #
Попробуй закомментировать 51-ю строку и посмотри правильно ли выводятся слова.
ava
Ajelika | 20.12.2016, 12:21 #
likehood, 51 строчка относиться к другой функции, а 54 да, к той что нужна.Я вроде понял проблему: если я например ввожу первое слово не удовлетворяющее условию(jfngjfg) то count принимает значение "0", когда ввожу втрое слово удовлетворяющее условию(Yhebhfb+) то снова выводит "0" потому что count так и остался равен "0". Как исправить всё равно не знаю ?    
ava
likehood | 20.12.2016, 12:35 #
Цитата (Ajelika @  20.12.2016,  12:21 findReferencedText)
51 строчка относиться к другой функции

Да, я в курсе. Я просто хотел посмотреть какие слова будут выводиться, чтобы знать, что подаётся
на вход функции f.
ava
Ajelika | 20.12.2016, 12:37 #
likehood, если ее закомментировать, то результат тот же
ava
likehood | 20.12.2016, 12:40 #
Разумеется. Вопрос в том, какие слова будут выводиться.
ava
Ajelika | 20.12.2016, 12:50 #
likehood, вот:
ava
likehood | 20.12.2016, 13:04 #
Странно. Почему-то не срабатывает 52-я сточка. Где отдельные слова?
ava
Ajelika | 20.12.2016, 13:17 #
likehood,  не выводит потому что не встретил  в слове  две рядом одинаковые буквы 
ava
likehood | 20.12.2016, 13:19 #
А если всё же закомменитровать 51-ю строку.
ava
Ajelika | 20.12.2016, 13:31 #
likehood, если ее закоментировать, и ввести такое слово в котором есть два одинаковых символа стоящих рядом , то не выведет ничего

später ergänzt:
Так ведь у нас проблема то с функцией в строчке 54-55 
ava
likehood | 20.12.2016, 20:26 #
Цитата (Ajelika @  20.12.2016,  13:31 findReferencedText)
то не выведет ничего

То есть переменная word ссылается на пустую строку. Значит где-то в строках 41-49 есть ошибка.
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden