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

Нужно написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
Gabberr
 Аватар для Gabberr
101 / 101 / 17
Регистрация: 13.10.2009
Сообщений: 402
12.10.2010, 18:56     Нужно написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел #1
Здравствуйте!
Нужно написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел.
С файлами и строками в с++ сталкиваюсь в первый раз,по этому даже не знаю что и детать,помогите плиз!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2010, 18:56     Нужно написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел
Посмотрите здесь:

Написать программу,которая считывает текст из файла и выводит на экран только строки,не содержащие двух значных чисел C++
Написать программу, которая считывает текст из файла и выводит на экран только строки, содержащие двузначные числа. C++
C++ Написать программу, которая считывает текст из файла и выводит на экран только предложения, не содержащие запятых.
C++ Написать программу,которая считывает текст из файла и выводит на экран только предложения,содержащие введенное с клавиатуры слово.
Написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.10.2010, 04:06     Нужно написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел #2
C++
1
2
3
4
5
6
7
8
    ifstream in;
    char line[1000];
 
    ...
 
    while (in.getline(line, 1000))
        if (has_dig2num(line))
            cout << line << endl;
C++
1
bool has_dig2num(const char *line);
C++
1
2
3
4
5
6
7
bool has_dig2num(const char *line)
{
    for ( ; *line != '\0'; line++)
        if (isdigit(*line) && isdigit(*(line + 1)))
            return true;
    return false;
}
потестировать функцию
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
25
26
27
28
29
30
31
32
#include <iostream>
 
using namespace std;
 
bool has_dig2num(const char *line);
 
int main(void)
{
    const char *lines[] = {
        "abcd", "efgh", "abcd7", "efgh7",
        "ab88cd", "11efgh", "11abcd11", "efgh11",
        "ab8c8d", "1efgh1", "11", "1", ""
    };
    
    for (int i = 0; i < (int) (sizeof lines / sizeof lines[0]); i++) {
        cout.width(10);
        cout << lines[i]
             << "    -    "
             << has_dig2num(lines[i])
             << endl;
    }
    
    return 0;
}        
 
bool has_dig2num(const char *line)
{
    for ( ; *line != '\0'; line++)
        if (isdigit(*line) && isdigit(*(line + 1)))
            return true;
    return false;
}
Код
[guest@localhost tests]$ ./t1
      abcd    -    0
      efgh    -    0
     abcd7    -    0
     efgh7    -    0
    ab88cd    -    1
    11efgh    -    1
  11abcd11    -    1
    efgh11    -    1
    ab8c8d    -    0
    1efgh1    -    0
        11    -    1
         1    -    0
              -    0
[guest@localhost tests]$
Gabberr
 Аватар для Gabberr
101 / 101 / 17
Регистрация: 13.10.2009
Сообщений: 402
13.10.2010, 15:47  [ТС]     Нужно написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел #3
Спасибо большое!буду разбираться)
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
14.10.2010, 12:53     Нужно написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел #4
Цитата Сообщение от accept Посмотреть сообщение
C++
1
2
bool has_dig2num(const char *line)
{...}
Эдак она и трёх и четырёхзначные числа ловить будет
Вот чуть устойчивее, и то с приколами - к примеру 3.14 не пропустит
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <cctype>
 
bool has2digits(const char * s){
    int num;
    while ( *s ){
        if ( isdigit(*s) ){
            if ( ( num = atoi(s) ) > 9 && num < 100 )
                return true;
            else
                while ( isdigit(*++s) )
                    ;
        }
        else
            ++s;
    }
 
    return false;
}
 
int main(){
    std::string buf;
    std::cout << "Name for input file: ";
    std::cin >> buf;
 
    std::ifstream ifs(buf.c_str());
    if ( ! ifs.is_open() ){
        std::cerr << "Can't open input file!" << std::endl;
        return 1;
    }
    while ( std::getline(ifs, buf) )
        if ( ! has2digits(buf.c_str()) )
            std::cout << buf << std::endl;
    if ( ifs.bad() ){
        std::cerr << "Error reading file!" << std::endl;
        ifs.close();
        return 1;
    }
 
    ifs.close();
    return 0;
}
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.10.2010, 13:28     Нужно написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел #5
Цитата Сообщение от easybudda Посмотреть сообщение
Эдак она и трёх и четырёхзначные числа ловить будет
да, точно

обновил

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
 
using namespace std;
 
bool has_dig2num(const char *line);
 
int main(void)
{
    const char *lines[] = {
        "abcd", "efgh", "abcd7", "efgh7",
        "ab88cd", "11efgh", "11abcd11", "efgh11",
        "ab888cd", "111efgh", "11abcd111", "efgh111",
        "ab8c8d", "1efgh1", "1111", "111", "11", "1", ""
    };
    
    for (int i = 0; i < (int) (sizeof lines / sizeof lines[0]); i++) {
        cout.width(10);
        cout << lines[i]
             << "    -    "
             << has_dig2num(lines[i])
             << endl;
    }
    
    return 0;
}        
 
bool has_dig2num(const char *line)
{
    for ( ; *line != '\0'; line++)
        if (isdigit(*line) && *(line + 1) != '\0') {
            int i = 0;
            while (isdigit(*line)) {
                if (++i > 2)
                    return false;
                line++;
            }
            if (i == 2)
                return true;
        }
    return false;
}
Код
[guest@localhost tests]$ ./t2
      abcd    -    0
      efgh    -    0
     abcd7    -    0
     efgh7    -    0
    ab88cd    -    1
    11efgh    -    1
  11abcd11    -    1
    efgh11    -    1
   ab888cd    -    0
   111efgh    -    0
 11abcd111    -    1
   efgh111    -    0
    ab8c8d    -    0
    1efgh1    -    0
      1111    -    0
       111    -    0
        11    -    1
         1    -    0
              -    0
[guest@localhost tests]$
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
14.10.2010, 13:33     Нужно написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел #6
Цитата Сообщение от accept Посмотреть сообщение
abcd7 - 1
efgh7 - 1
а почему на этих строках сработала?
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
15.10.2010, 01:52     Нужно написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел #7
обновил

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
 
using namespace std;
 
bool has_dig2num(const char *line);
 
int main(void)
{
    const char *lines[] = {
        "abcd", "ab7cd", "abcd7", "1efgh1",
        "11efgh", "ab88cd", "efgh11", "11abcd11",
        "111efgh", "ab888cd", "efgh111","111abcd111",
        "11abcd111", "111efgh11",
        "1111", "111", "11", "1", ""
    };
    
    for (int i = 0; i < (int) (sizeof lines / sizeof lines[0]); i++) {
        cout.width(10);
        cout << lines[i]
             << "    -    "
             << has_dig2num(lines[i])
             << endl;
    }
    
    return 0;
}        
 
bool has_dig2num(const char *line)
{
    for ( ; *line != '\0'; line++)
        if (isdigit(*line) && *(line + 1) != '\0') {
            int i;
            for (i = 0; isdigit(*line) && ++i <= 2; line++)
                ;
            if (i == 2)
                return true;
        }
    return false;
}
Код
[guest@localhost tests]$ ./t2
      abcd    -    0
     ab7cd    -    0
     abcd7    -    0
    1efgh1    -    0
    11efgh    -    1
    ab88cd    -    1
    efgh11    -    1
  11abcd11    -    1
   111efgh    -    0
   ab888cd    -    0
   efgh111    -    0
111abcd111    -    0
 11abcd111    -    1
 111efgh11    -    1
      1111    -    0
       111    -    0
        11    -    1
         1    -    0
              -    0
[guest@localhost tests]$
, терь по ходу конечный вариант, удалил ещё дубликаты в тесте

Добавлено через 11 часов 30 минут
не, 11111 воспринимает как 11

Добавлено через 27 минут
по ходу нельзя её в три строчки написать
сделал более общую

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdio.h>
#include <ctype.h>
 
#define arrelsize(a) sizeof (a) / sizeof (a)[0]
#define ROUNDSMAX  10
 
int has_ndignum(const char *s, size_t n);
 
int main(void)
{
    int i, j;
    
    const char *lines[] = {
        "",
        "abc",
        "1",
        "11",
        "111",
        "1abc",
        "abc1abc",
        "abcabc1",
        "111abcabc",
        "abc111abc",
        "abcabc111",
        "1ab11ab111",
        "abc1ab11ab111abc",
        "abc1ab11ab111"
    };
    
    for (i = 0; i <= ROUNDSMAX; i++) {
        printf("%3d:\n", i);
        for (j = 0; j < arrelsize(lines); j++)
            printf(
                "%20s - %d\n",
                lines[j],
                has_ndignum(lines[j], i)
            );
    }
    
    return 0;
}
 
int has_ndignum(const char *s, size_t n)
{
    size_t count = 0;
    enum { YES = 1, NO = 0 } innum = NO;
    
    if (n == 0)
        return 0;
    for ( ; *s != '\0'; s++) {
        if (!innum && isdigit(*s)) {
            innum = YES;
            count = 0;
        }
        if (innum && isdigit(*s))
            count++;
        if (innum && !isdigit(*s)) {
            if (count == n)
                break;
            innum = NO;
        }
    }
    if (innum && count == n)
        return 1;
    return 0;
}
вывод с разными n

Код
[guest@localhost ndignum]$ ./ndignum
  0:
                     - 0
                 abc - 0
                   1 - 0
                  11 - 0
                 111 - 0
                1abc - 0
             abc1abc - 0
             abcabc1 - 0
           111abcabc - 0
           abc111abc - 0
           abcabc111 - 0
          1ab11ab111 - 0
    abc1ab11ab111abc - 0
       abc1ab11ab111 - 0
  1:
                     - 0
                 abc - 0
                   1 - 1
                  11 - 0
                 111 - 0
                1abc - 1
             abc1abc - 1
             abcabc1 - 1
           111abcabc - 0
           abc111abc - 0
           abcabc111 - 0
          1ab11ab111 - 1
    abc1ab11ab111abc - 1
       abc1ab11ab111 - 1
  2:
                     - 0
                 abc - 0
                   1 - 0
                  11 - 1
                 111 - 0
                1abc - 0
             abc1abc - 0
             abcabc1 - 0
           111abcabc - 0
           abc111abc - 0
           abcabc111 - 0
          1ab11ab111 - 1
    abc1ab11ab111abc - 1
       abc1ab11ab111 - 1
  3:
                     - 0
                 abc - 0
                   1 - 0
                  11 - 0
                 111 - 1
                1abc - 0
             abc1abc - 0
             abcabc1 - 0
           111abcabc - 1
           abc111abc - 1
           abcabc111 - 1
          1ab11ab111 - 1
    abc1ab11ab111abc - 1
       abc1ab11ab111 - 1
  4:
                     - 0
                 abc - 0
                   1 - 0
                  11 - 0
                 111 - 0
                1abc - 0
             abc1abc - 0
             abcabc1 - 0
           111abcabc - 0
           abc111abc - 0
           abcabc111 - 0
          1ab11ab111 - 0
    abc1ab11ab111abc - 0
       abc1ab11ab111 - 0
  5:
                     - 0
                 abc - 0
                   1 - 0
                  11 - 0
                 111 - 0
                1abc - 0
             abc1abc - 0
             abcabc1 - 0
           111abcabc - 0
           abc111abc - 0
           abcabc111 - 0
          1ab11ab111 - 0
    abc1ab11ab111abc - 0
       abc1ab11ab111 - 0
  6:
                     - 0
                 abc - 0
                   1 - 0
                  11 - 0
                 111 - 0
                1abc - 0
             abc1abc - 0
             abcabc1 - 0
           111abcabc - 0
           abc111abc - 0
           abcabc111 - 0
          1ab11ab111 - 0
    abc1ab11ab111abc - 0
       abc1ab11ab111 - 0
  7:
                     - 0
                 abc - 0
                   1 - 0
                  11 - 0
                 111 - 0
                1abc - 0
             abc1abc - 0
             abcabc1 - 0
           111abcabc - 0
           abc111abc - 0
           abcabc111 - 0
          1ab11ab111 - 0
    abc1ab11ab111abc - 0
       abc1ab11ab111 - 0
  8:
                     - 0
                 abc - 0
                   1 - 0
                  11 - 0
                 111 - 0
                1abc - 0
             abc1abc - 0
             abcabc1 - 0
           111abcabc - 0
           abc111abc - 0
           abcabc111 - 0
          1ab11ab111 - 0
    abc1ab11ab111abc - 0
       abc1ab11ab111 - 0
  9:
                     - 0
                 abc - 0
                   1 - 0
                  11 - 0
                 111 - 0
                1abc - 0
             abc1abc - 0
             abcabc1 - 0
           111abcabc - 0
           abc111abc - 0
           abcabc111 - 0
          1ab11ab111 - 0
    abc1ab11ab111abc - 0
       abc1ab11ab111 - 0
 10:
                     - 0
                 abc - 0
                   1 - 0
                  11 - 0
                 111 - 0
                1abc - 0
             abc1abc - 0
             abcabc1 - 0
           111abcabc - 0
           abc111abc - 0
           abcabc111 - 0
          1ab11ab111 - 0
    abc1ab11ab111abc - 0
       abc1ab11ab111 - 0
[guest@localhost ndignum]$


Manjak
 Аватар для Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
16.10.2010, 01:08     Нужно написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел #8
"Усложняем" (с)

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
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <algorithm>
#include <fstream>
#include <string>
#include <functional>
 
using namespace std;
using namespace std::placeholders;
 
int main()
{
    string sBuffer;
    string::iterator itrNumPos,
             itrFolowingSmb;
    ifstream fileStrm("example.txt", ios::in);
 
    while (getline(fileStrm, sBuffer).good())
    {
        itrFolowingSmb = sBuffer.begin();
        while((itrNumPos = adjacent_find(itrFolowingSmb, sBuffer.end(), bind(logical_and<int>(), 
                                                bind(isdigit, _1),
                                                bind(isdigit, _2)))) 
               != sBuffer.end())
        {
            itrFolowingSmb = find_if(itrNumPos, sBuffer.end(), bind(logical_not<int>(), bind(isdigit, _1)));
            if (distance(itrNumPos, itrFolowingSmb) == 2)
            {
                cout << "Found: " << sBuffer << endl;
            }
        }
    }
    
    system("pause");
    return EXIT_SUCCESS;
}
Добавлено через 19 минут
Невнимательно немного прочитал условие
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
16.10.2010, 05:09     Нужно написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел #9
Код
t.cpp:22: ошибка: ‘placeholders’ is not a namespace-name
...
[guest@localhost tests]$ g++ -v 2>&1 | grep gcc
gcc версия 4.4.3 (GCC) 
[guest@localhost tests]$
что-то не запустилось
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
16.10.2010, 06:16     Нужно написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел #10
упрощаем
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
25
#include <stdio.h>
#include <ctype.h>
 
int have_2d_num(const char * s){
    int cnt = 0;
    while ( 1 ){
        if ( isdigit(*s) )
            ++cnt;
        else { 
            if ( cnt == 2 )
                return 1;
            if ( *s == '\0' )
                return 0;
            cnt = 0;
        }
        ++s;
    }
}
        
int main(void){
    char buf[BUFSIZ];
    while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' )
        printf("%scontains of 2 digits number.\n", have_2d_num(buf) ? "" : "don't ");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2010, 11:30     Нужно написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел
Еще ссылки по теме:

Написать программу, которая считывает текст из файла и выводит на экран только предложения, не содержащие запятых C++
C++ Написать программу, которая считывает текст из файла и выводит на экран строки, содержащие двоичные числа
Написать программу, которая считывает текст из файла и выводит на экран только предложения, содержащие введенн C++

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

Или воспользуйтесь поиском по форуму:
Manjak
 Аватар для Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
16.10.2010, 11:30     Нужно написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел #11
Цитата Сообщение от accept Посмотреть сообщение
[CODE]
что-то не запустилось
bind, placeholders - это уже возможности нового стандарта(взятые из Boost.Bind) Пока есть в студии 2010

easybudda, на примитивах не интересно писать
Yandex
Объявления
16.10.2010, 11:30     Нужно написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел
Ответ Создать тему
Опции темы

Текущее время: 12:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru