С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

Строки, нужно подправить код - C++

10.06.2013, 20:26. Просмотров 326. Ответов 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
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <list>
#include <string>
#include <sstream>
#include <iterator>
#include <algorithm>
using namespace std; 
typedef std::istream_iterator<std::string> ii;
 
int main()
{
    cout << "Put line: ";
    string line, new_line;
    getline(cin, line);
 
    stringstream str(line);
    list<string> w((ii(str)), ii());
 
    for (list<string>::iterator p = w.begin(); p != w.end(); )
    {
        if (isdigit((*p)[0]))
        {
            new_line += *p++;
            new_line.push_back(' ');
            continue;
        }
        unsigned i = 1;
        bool state = false;
        list<string>::iterator tmp = p++;
        for ( ; i < tmp->size(); ++i)
        {
            if (isdigit((*tmp)[i]))
            {
                w.erase(tmp);
                state = true;
                break;
            }
        }
        if (!state)
        {
            new_line += *tmp;
            new_line.push_back(' ');
        }
    }
 
    cout << new_line << endl;
    system("pause");
}
все работает. но:
во-первых, преподовательница сказала, что нельзя испольовать String, stringstream str(line)

вместо этого сказала про Char*

и во вторых, использовать фукнции

кто может помочь? времени в обрез ,а самому еще нужно несолько лаб доделать, исправте, пожалуйста
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2013, 20:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Строки, нужно подправить код (C++):

Нужно подправить код - C++
Здравствуйте. Нужно, что бы после завершения программы, оно не выходило, а что бы появилась надпись: Хотите сыграть еще? И если нажать на...

нужно подправить - C++
нужно изменить этот код так ,что бы программа смогла &quot;выжить&quot; в разных ситуациях 1 если знаменатель = 0 и не могу никак понять что...

Подправить код - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; const int n=10; float X; double sum(); int _tmain(int argc,...

Подправить код - C++
#include &lt;iostream&gt; #include &lt;locale&gt; #include &lt;ctype.h&gt; using namespace std; int main () { const int n=20; char s; int k={...

Подправить код - C++
Ввожу строку с 30 символов. Нужно вывести целое число и упорядочить за возростанием Добавлено через 39 секунд пример кода на фортран...

Подправить код - C++
Помогите пожалуйста, нужно подправить код: /* Дана целочисленная квадратная матрица. Опередить: 1) произведение элементов в тех...

7
MikeEl
1 / 1 / 0
Регистрация: 27.03.2012
Сообщений: 52
10.06.2013, 23:37  [ТС] #2
нужно Stringstream и все, что с ним связанно, перевести в char

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
#include <iostream>
#include <list>
#include <string>
#include <sstream>
#include <iterator>
#include <algorithm>
using namespace std; 
typedef istream_iterator<string> ii;
 
int main()
{
    cout << "Put line: ";
    string line, new_line;
    getline(cin, line);
 
    stringstream str(line);
    list<string> w((ii(str)), ii());
 
    for (list<string>::iterator p = w.begin(); p != w.end(); )
    {
        if (isdigit((*p)[0]))
        {
            new_line += *p++;
            new_line.push_back(' ');
            continue;
        }
        unsigned i = 1;
        bool state = false;
        list<string>::iterator tmp = p++;
        for ( ; i < tmp->size(); ++i)
        {
            if (isdigit((*tmp)[i]))
            {
                w.erase(tmp);
                state = true;
                break;
            }
        }
        if (!state)
        {
            new_line += *tmp;
            new_line.push_back(' ');
        }
    }
 
    cout << new_line << endl;
    system("pause");
}
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
11.06.2013, 00:03 #3
у stringstream есть метод str(), который возвращает строку.
а чего вам надо - непонятно. в цикле какая-то муть со словами происходит. разъясните чтоли.
0
MikeEl
1 / 1 / 0
Регистрация: 27.03.2012
Сообщений: 52
11.06.2013, 00:05  [ТС] #4
Цитата Сообщение от DU Посмотреть сообщение
у stringstream есть метод str(), который возвращает строку.
а чего вам надо - непонятно. в цикле какая-то муть со словами происходит. разъясните чтоли.
вот задание:
Из заданной последовательности слов удалить слова, содержащие числа.
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
11.06.2013, 00:16 #5
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
#include <algorithm>
#include <iostream>
#include <iterator>
#include <list>
#include <string>
#include <sstream>
 
using namespace std;
 
typedef istream_iterator<string> ii;
 
int main()
{
  string line = "aaa bbb d222 ccc";
  //cout << "Put line: ";
  //getline(cin, line);
  stringstream str(line);
  
  list<string> w((ii(str)), ii());
  string new_line;
  for (list<string>::iterator p = w.begin(); p != w.end(); ++p)
  {
    if (find_if(p->begin(), p->end(), &isdigit) == p->end())
    {
      new_line += new_line.empty() ? *p : (' ' + *p);
    }
  }
 
  std::cout << "new line = " << new_line << std::endl;
 
  system("pause");
  return 0;
}
1
MikeEl
1 / 1 / 0
Регистрация: 27.03.2012
Сообщений: 52
11.06.2013, 00:20  [ТС] #6
Цитата Сообщение от DU Посмотреть сообщение
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
#include <algorithm>
#include <iostream>
#include <iterator>
#include <list>
#include <string>
#include <sstream>
 
using namespace std;
 
typedef istream_iterator<string> ii;
 
int main()
{
  string line = "aaa bbb d222 ccc";
  //cout << "Put line: ";
  //getline(cin, line);
  stringstream str(line);
  
  list<string> w((ii(str)), ii());
  string new_line;
  for (list<string>::iterator p = w.begin(); p != w.end(); ++p)
  {
    if (find_if(p->begin(), p->end(), &isdigit) == p->end())
    {
      new_line += new_line.empty() ? *p : (' ' + *p);
    }
  }
 
  std::cout << "new line = " << new_line << std::endl;
 
  system("pause");
  return 0;
}
на самом деле, я уже вот с этим кодом работаю:
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
#include <stdio.h>
#include <string.h>
#include <ctype.h>
 
#define DELIM " ,.?!:;"
 
char* find_digit(char* s, size_t n)
{
    size_t i;
    for(i = 0; i < n; ++i)
        if(isdigit(s[i])) return &s[i];
 
    return NULL;
}
 
int main()
{
    size_t n;
    char str[256];
    char* p_str;
 
    printf("input string: ");
    scanf("%255[^\n]", str);
 
    p_str = str;
 
    while(*p_str)
    {
        if(!strchr(DELIM, *p_str))
        {
            n = 0;
            do ++n; while(!strchr(DELIM, p_str[n]));
 
            if(find_digit(p_str, n)) memmove(p_str, p_str + n, strlen(p_str + n) + 1);
            else  p_str+= n;
        }
        else ++p_str;
    }
 
    printf("%s\n", str);
 
    return 0;
}
но вот не могу понять, для чего #define DELIM " ,.?!:;" и как вообще вся программа работает, не могли бы Вы объяснить, пожалуйста?
0
BumerangSP
4287 / 1409 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
11.06.2013, 00:23 #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
#include <iostream>
#include <cstring>
 
char* deleteWordsWithNumbers(char *str)
{
    char newStr[100] = {0};
    char *ptr = strtok(str, ",. ?!");
    do {
        bool isDigit = false;
        for (int i=0; ptr[i]; ++i)
            if (isdigit(ptr[i]))
            {
                isDigit = true;
                break;
            }
        if (!isDigit)
        {
            strcat(newStr, ptr);
            strcat(newStr, " ");
        }
    } while (ptr = strtok(0, ",. ?!"));
    strcpy(str, newStr);
    return str;
}
 
int main()
{
    char str[100] = {0};
    strcpy(str, "fdf dsd2s3d sdd 56ds");
    std::cout << deleteWordsWithNumbers(str) << '\n';
}
 Комментарий модератора 
Темы объединены.
1
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
11.06.2013, 01:17 #8
Цитата Сообщение от MikeEl Посмотреть сообщение
испольовать String, stringstream str(line)
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
 
using namespace std;
 
int main()
{
    string text = "He2llo world! 2Hello world! Fast2Furious World3 444";
    string word;
    istringstream iss(text);
    while (iss >> word)
        if ( any_of( begin(word), end(word), ::isdigit ) &&
            any_of( begin(word), end(word), ::isalpha ) )
            text.erase( text.find(word), word.size() );
    cout << text;
    return 0;
}

Цитата Сообщение от MikeEl Посмотреть сообщение
нельзя испольовать String, stringstream str(line)
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <cstring>
using namespace std;
bool HasDigitAndAlpha(char *text)
{
    int i = 0;
    bool digit = false, alpha = false;
    while (text[i] != '\0') {
        digit = digit || isdigit(text[i]);
        alpha = alpha || isalpha(text[i]);
        if (digit && alpha) return true;
        ++i;
    }
    return digit && alpha;
}
 
int main()
{
    char in_text[256], out_text[256] = {0};
    char *word;
    cin.getline(in_text, sizeof(in_text));
 
    word = strtok(in_text, " ");
    if (!HasDigitAndAlpha(word)) {
        strcat(out_text, word);
        strcat(out_text, " ");
    }
 
    while ( (word = strtok (nullptr, " ")) != nullptr) {
        if (HasDigitAndAlpha(word)) continue;
        strcat(out_text, word);
        strcat(out_text, " ");
    }
 
    cout << out_text;
    return 0;
}
0
11.06.2013, 01:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2013, 01:17
Привет! Вот еще темы с ответами:

Нужно подправить программу - C++
Нужно чтобы программа выводила сообщение &quot;такого элемента нет&quot; если указанной цифры нет в массиве. (массив упорядоченный). Заранее...

массив нужно подправить - C++
Из шести первых отрицательных элементов массива В(30) найти максимальный элемент. она чуток неправильно работает можете помочь исправить:...

Требуется подправить код - C++
Очень долгое время не могу сдать лабораторную работу преподу в универе. Докапывается до ошибок в задаче, а как их исправить не говорит....

Помогите подправить код - C++
Задача. Вводится n-значный массив состоящий из целых элементов. Надо найти произведение четных элементов. Но у меня почему то не работает....


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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