Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Frankie
0 / 0 / 0
Регистрация: 30.05.2013
Сообщений: 6
#1

Найти ошибку - C++

25.06.2013, 14:03. Просмотров 366. Ответов 10
Метки нет (Все метки)

Не могу найти ошибку в программе, не ищет букву "а", в некоторых случаях подсчет не правильный. Программа должна найти и подсчитать в строке кол-во букв "а" в первом слове.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<iomanip.h>
 
void main()
{
    int a = 0;
    char q;
    cout << "vvedite predlojenie ";
    cin >> q;
    for(int i = 0; i < q; i++)
        {
         if(q == 'a') a++;
         if(q == ' ') ;
        }
    if(a == 0) cout << "Net bukvi 'a' v 1 slove: " <<  endl;
    else cout << "kolichestvo bukv  'a' v 1 slove: " << a << endl   ;
    getch();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2013, 14:03     Найти ошибку
Посмотрите здесь:

найти ошибку C++
C++ найти ошибку
C++ Найти ошибку
Найти ошибку C++
Найти ошибку C++
C++ Найти ошибку
найти ошибку C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
iv-a
15 / 15 / 0
Регистрация: 25.06.2013
Сообщений: 63
25.06.2013, 14:12     Найти ошибку #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<iomanip.h>
 
void main()
{
    int a = 0;
    char q[100];
    cout << "vvedite predlojenie ";
    cin >> q;
    for(int i = 0; i < strlen(q); i++)
        {
         if(q[i] == 'a') a++;
         if(q[i] == ' ') ;
        }
    if(a == 0) cout << "Net bukvi 'a' v 1 slove: " <<  endl;
    else cout << "kolichestvo bukv  'a' v 1 slove: " << a << endl   ;
    getch();
}
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.06.2013, 14:15     Найти ошибку #3
C++
1
2
3
4
5
6
7
8
9
10
11
    int a = 0;
    char q[100];
    cout << "vvedite predlojenie ";
    cin >> q;
    for(int i = 0; i < strlen(q); i++)
    {
         if(q[i] == 'a') a++;
    }
    if(a == 0) cout << "Net bukvi 'a' v 1 slove: " <<  endl;
    else cout << "kolichestvo bukv  'a' v 1 slove: " << a << endl;
    getch();
AndLap
0 / 0 / 0
Регистрация: 29.04.2013
Сообщений: 9
25.06.2013, 14:34     Найти ошибку #4
@Frankie, Вот работающий код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
using namespace std;
int main()
{
    int counter = 0;
    char q[100];
    cout << "vvedite predlojenie ";
    cin >> q;
    for(int i = 0; q[i] != ' '; i++)
        {
         if(q[i] == 'a')
         counter++;
        }
    if(counter == 0) cout << "Net bukvi 'a' v 1 slove" <<  endl;
    else cout << "kolichestvo bukv  'a' v 1 slove: " << counter << endl   ;
 
    return 0;
}
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.06.2013, 15:55     Найти ошибку #5
Добавлено через 1 минуту
Цитата Сообщение от AndLap Посмотреть сообщение
Вот работающий код
А проверяли? Код как раз неработающий. cin >> читает одно слово (до пробела) из введённого предложения. Поэтому пробела не будет, а значит и выхода из цикла.
MrGluck
Ворчун
Эксперт CЭксперт С++
6643 / 3834 / 505
Регистрация: 29.11.2010
Сообщений: 10,149
25.06.2013, 19:02     Найти ошибку #6
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <string>
#include <algorithm>
 
int main()
{
    std::string str;
    std::getline(std::cin, str, ' ');
    std::cout << "Counter: " << std::count(str.begin(), str.end(), 'a') << std::endl;
}
AndLap
0 / 0 / 0
Регистрация: 29.04.2013
Сообщений: 9
28.06.2013, 12:50     Найти ошибку #7
@alsav22, Программа рабочая, да операция ">>" считает, что пробел это нулевой символ, но ведь нам и нужно первое слово
Программа должна найти и подсчитать в строке кол-во букв "а" в первом слове.
Чтобы читалось все предложение, можно сделать так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
using namespace std;
int main()
{
    int counter = 0;
    const int max = 100;
    char q[max];
    cout << "vvedite predlojenie ";
    cin.get(q, max);
    for(int i = 0; q[i] != ' '; i++)
        {
         if(q[i] == 'a')
         counter++;
        }
    if(counter == 0) cout << "Net bukvi 'a' v 1 slove" <<  endl;
    else cout << "kolichestvo bukv  'a' v 1 slove: " << counter << endl   ;
 
    return 0;
}
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.06.2013, 14:09     Найти ошибку #8
Цитата Сообщение от AndLap Посмотреть сообщение
да операция ">>" считает, что пробел это нулевой символ,
Ничего она не считает, просто читает до первого пробельного символа (который в слово не попадает).
Цитата Сообщение от AndLap Посмотреть сообщение
Программа рабочая
На скрине результат работы вашей программы (якобы рабочей).
Миниатюры
Найти ошибку  
AndLap
0 / 0 / 0
Регистрация: 29.04.2013
Сообщений: 9
28.06.2013, 14:28     Найти ошибку #9
@alsav22, у меня она работает Найти ошибку, вы конечно правы, я с вами не спорю, что по хорошему так писать нельзя, просто некоторые компиляторы пропускают эту ошибку и я решил особо не морочиться , но всё равно выше я уже показал код который должен работать везде.
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.06.2013, 14:30     Найти ошибку #10
Код из 7 поста уже лучше, будет правильно работать, если в предложении не одно слово. Если одно, то та же история: пробела в считаном слове не будет и цикл будет продолжаться до тех пор (будет выход за пределы массива), пока в памяти не попадётся код пробела, или пока не призойдёт исключение. Чтобы это было видно, сделайте вывод i после завершения цикла (если не будет исключения) и посмотрите:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;
 
int main()
{
    int counter = 0;
    const int max = 100;
    char q[max];
    cout << "vvedite predlojenie ";
    cin.get(q, max);
    int i;
    for(i = 0; q[i] != ' '; i++)
        {
         if(q[i] == 'a')
         counter++;
        }
    if(counter == 0) cout << "Net bukvi 'a' v 1 slove" <<  endl;
    else cout << "kolichestvo bukv  'a' v 1 slove: " << counter << endl;
    
    cout << i << endl;
    
    system("pause");
    return 0;
}
Миниатюры
Найти ошибку  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2013, 14:39     Найти ошибку
Еще ссылки по теме:

C++ Найти ошибку
найти ошибку C++
найти ошибку:) C++
найти ошибку C++
C++ Найти Ошибку БД

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.06.2013, 14:39     Найти ошибку #11
Цитата Сообщение от AndLap Посмотреть сообщение
просто некоторые компиляторы пропускают эту ошибку
Для компилятора это (выход за границу массива) не ошибка. Компиляторы это не отслеживают. Это ошибка времени выполнения. Тот, кто делает код, должен за этим следить.

Добавлено через 5 минут
Решение очень простое: не нужно к пробелу привязывать выход из цикла:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <cstdlib>
using namespace std;
 
int main()
{
    int counter = 0;
    char q[100];
    cout << "vvedite predlojenie ";
    cin >> q;
    
    for(int i = 0; i < strlen(q); i++)
        {
         if(q[i] == 'a')
         counter++;
        }
    if(counter == 0) cout << "Net bukvi 'a' v 1 slove" <<  endl;
    else cout << "kolichestvo bukv  'a' v 1 slove: " << counter << endl   ;
    
    system("pause");
    return 0;
}
Yandex
Объявления
28.06.2013, 14:39     Найти ошибку
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru