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

в каком направлении действовать при написании программы - C++

Восстановить пароль Регистрация
 
tanya2505
1 / 1 / 0
Регистрация: 24.05.2011
Сообщений: 68
12.01.2012, 18:37     в каком направлении действовать при написании программы #1
дано задание:
"Проверить, является ли выражение, состоящее только из прописных букв заданной строки, палиндромом. Если да, то напечатать полученный палиндром. В противном случае вывести строку, состоящую из символов исходной строки с удаленными прописными символами."
подскажите пожалуйста, с чего начать программу
хоть что-нибудь подскажите, буду очень благодарна
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.01.2012, 18:37     в каком направлении действовать при написании программы
Посмотрите здесь:

C++ Прошу помочь в написании программы
C++ Посодействуйте в написании программы!
C++ Помогите в написании программы
C++ Помощь в написании программы
Помочь в написании программы. (С матрицами) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
12.01.2012, 18:53     в каком направлении действовать при написании программы #2
tanya2505, суть задания не совсем понятна. То есть
aBcdEfGEhB -> BEGEB
AbcDe -> bce
так должно получиться?

И язык программирования укажите - для С и С++ решения будут разные.
tanya2505
1 / 1 / 0
Регистрация: 24.05.2011
Сообщений: 68
12.01.2012, 19:11  [ТС]     в каком направлении действовать при написании программы #3
easybudda, ну например исходная строка 1rK4ABAfgK, результат KABAK или BuRAtino, utino не палиндром

Добавлено через 13 минут
easybudda, на С++
lemegeton
 Аватар для lemegeton
2911 / 1340 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
12.01.2012, 19:27     в каком направлении действовать при написании программы #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ну можно и так.
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
#include <iostream>
#include <string>
#include <iterator>
 
bool isPalyndrom(const std::string &string) {
  if (string.size() == 0) return false;
  std::string::const_iterator i = string.begin();
  std::string::const_iterator j = string.end() - 1;
  while (i < j)
    if (*i++ != *j--)
      return false;
  return true;
};
 
template<class InputIterator, class OutputIterator, class Predicate>
OutputIterator copy_if(InputIterator first, InputIterator last,
  OutputIterator result, Predicate predicate) {
  for (; first != last; ++first)
    if (predicate(*first))
      *result++ = *first;
  return result;
}
 
bool isCapital(char c) {
  return (c >= 'A' && c <= 'Z');
}
 
bool isNotCapital(char c) {
  return !isCapital(c);
}
 
std::string getOnlyCapital(const std::string &string) {
  std::string result;
  copy_if(string.begin(), string.end(),
    std::back_inserter<std::string>(result), isCapital);
  return result;
}
 
std::string getNoCapital(const std::string &string) {
  std::string result;
  copy_if(string.begin(), string.end(),
    std::back_inserter<std::string>(result), isNotCapital);
  return result;
}
 
int main(int argc, char *argv[]) {
//  std::string word = "1rK4ABAfgK";
  std::string word = "BuRAtino";
 
  std::string capitals = getOnlyCapital(word);
  if (isPalyndrom(capitals))
    std::cout << capitals << std::endl;
  else
    std::cout << getNoCapital(word) << std::endl;
}
tanya2505
1 / 1 / 0
Регистрация: 24.05.2011
Сообщений: 68
12.01.2012, 19:50  [ТС]     в каком направлении действовать при написании программы #5
lemegeton, пишет- не найден файл iterator и ошибку в синтаксисе выдает в 5 строчке
lemegeton
 Аватар для lemegeton
2911 / 1340 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
12.01.2012, 20:08     в каком направлении действовать при написании программы #6
Цитата Сообщение от tanya2505 Посмотреть сообщение
lemegeton, пишет- не найден файл iterator и ошибку в синтаксисе выдает в 5 строчке
Ну дык приведите ошибку-то.

Это чем вы компилируете таким, что нет iterator'а? Borlan C?
tanya2505
1 / 1 / 0
Регистрация: 24.05.2011
Сообщений: 68
12.01.2012, 20:25  [ТС]     в каком направлении действовать при написании программы #7
lemegeton, я думаю, что из-за отсутствия файла iterator, возникают все ошибки и т.д
unable to open include file 'iterator'
declaration sintax error 2 раза в 5 и 15 строчке
Borland C
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
13.01.2012, 00:40     в каком направлении действовать при написании программы #8
Цитата Сообщение от tanya2505 Посмотреть сообщение
на С++
Цитата Сообщение от tanya2505 Посмотреть сообщение
Borland C
На таком С++ лучше уже ничего не писать. Вот Вам на С
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
#include <stdio.h>
#include <string.h>
#include <ctype.h>
 
#define WORD_LEN 128
#define WORD_MASK "%127s"
 
int is_palindrome(const char * s) {
    const char * t = s + strlen(s) - 1;
    
    while ( s < t && *s == *t ) {
        ++s;
        --t;
    }
    
    return ( s >= t );
}
 
char * remove_if_not(char * s, int (*test_func)(int)) {
    char * r = s;
    
    while ( *s ) {
        if ( ! test_func(*s) )
            memmove(s, s+1, strlen(s));
        else
            ++s;
    }
    
    return r;
}
 
char * change_func(char * s) {
    static char buf[WORD_LEN];
    char * pb, * ps;
    
    for ( pb = buf, ps = s; *ps; ++ps )
        if ( isupper(*ps) )
            *pb++ = *ps;
    *pb = '\0';
    
    if ( is_palindrome(buf) )
        return remove_if_not(s, isupper);
    else
        return remove_if_not(s, islower);
}
 
int main(void){
    char wrd[WORD_LEN];
    
    while ( printf("Word: ") && scanf(WORD_MASK, wrd) == 1 )
        printf("Result: %s\n", change_func(wrd));
    
    return 0;
}
Выход - Ctrl+Z и Enter нажать.
в каком направлении действовать при написании программыВроде работает...
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
13.01.2012, 12:34     в каком направлении действовать при написании программы #9
lemegeton, перечитал Вашу программу - нашёл косяк в своей.
Исправлю чуть позже...
lemegeton
 Аватар для lemegeton
2911 / 1340 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
13.01.2012, 14:28     в каком направлении действовать при написании программы #10
Вы про это?
C
1
           return remove_if_not(s, islower);
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
13.01.2012, 14:43     в каком направлении действовать при написании программы #11
Цитата Сообщение от lemegeton Посмотреть сообщение
Ты про это?
ага.
Вот исправленная:
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
67
#include <stdio.h>
#include <string.h>
#include <ctype.h>
 
#define WORD_LEN 128
#define WORD_MASK "%127s"
 
int is_palindrome(const char * s) {
    const char * t = s + strlen(s) - 1;
        
    while ( s < t && *s == *t ) {
        ++s;
        --t;
    }
        
    return ( s >= t );
}
 
char * remove_if(char * s, int (*test_func)(int)) {
    char * r = s;
    
    while ( *s ) {
        if ( test_func(*s) )
            memmove(s, s+1, strlen(s));
        else
            ++s;
    }
    
    return r;
}
 
char * remove_if_not(char * s, int (*test_func)(int)) {
    char * r = s;
        
    while ( *s ) {
        if ( ! test_func(*s) )
            memmove(s, s+1, strlen(s));
        else
            ++s;
    }
        
    return r;
}
 
char * change_func(char * s) {
    static char buf[WORD_LEN];
    char * pb, * ps;
        
    for ( pb = buf, ps = s; *ps; ++ps )
        if ( isupper(*ps) )
            *pb++ = *ps;
    *pb = '\0';
        
    if ( is_palindrome(buf) )
        return remove_if_not(s, isupper);
    else
        return remove_if(s, isupper);
}
 
int main(void){
    char wrd[WORD_LEN];
        
    while ( printf("Word: ") && scanf(WORD_MASK, wrd) == 1 )
        printf("Result: %s\n", change_func(wrd));
        
    return 0;
}
lemegeton
 Аватар для lemegeton
2911 / 1340 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
13.01.2012, 14:50     в каком направлении действовать при написании программы #12
Другой вариант модификации кода от 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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdio.h>
#include <string.h>
#include <ctype.h>
 
#define WORD_LEN 128
#define WORD_MASK "%127s"
 
int is_palindrome(const char * s) {
        const char * t = s + strlen(s) - 1;
        
        while ( s < t && *s == *t ) {
                ++s;
                --t;
        }
        
        return ( s >= t );
}
 
char * remove_if_not(char * s, int (*test_func)(int)) {
        char * r = s;
        
        while ( *s ) {
                if ( ! test_func(*s) )
                        memmove(s, s+1, strlen(s));
                else
                        ++s;
        }
        
        return r;
}
 
int isnotupper(int c) {
        return !isupper(c);
}
 
char * change_func(char * s) {
        static char buf[WORD_LEN];
        char * pb, * ps;
        
        for ( pb = buf, ps = s; *ps; ++ps )
                if ( isupper(*ps) )
                        *pb++ = *ps;
        *pb = '\0';
        
        if ( is_palindrome(buf) )
                return remove_if_not(s, isupper);
        else
                return remove_if_not(s, isnotupper);
}
 
 
int main(void){
        char wrd[WORD_LEN];
        
        while ( printf("Word: ") && scanf(WORD_MASK, wrd) == 1 )
                printf("Result: %s\n", change_func(wrd));
        
        return 0;
}

Не по теме:

Кстати, никогда не задумывался, что isupper принимает int.

tanya2505
1 / 1 / 0
Регистрация: 24.05.2011
Сообщений: 68
13.01.2012, 15:11  [ТС]     в каком направлении действовать при написании программы #13
спасибо большое! в понедельник я видать повешусь на экзамене..с такими то программами
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
13.01.2012, 15:28     в каком направлении действовать при написании программы #14
Цитата Сообщение от lemegeton Посмотреть сообщение
Другой вариант
Не не заглавная буква? Ну да, можно и так...


Цитата Сообщение от tanya2505 Посмотреть сообщение
в понедельник я видать повешусь на экзамене..с такими то программами
А что с ними не так? Не понятно - спрашивайте (только не "что в каждой строчке происходит")...
tanya2505
1 / 1 / 0
Регистрация: 24.05.2011
Сообщений: 68
13.01.2012, 15:45  [ТС]     в каком направлении действовать при написании программы #15
easybudda, сложные просто0 у нас на экзамене полегче буду, типа сумму вычислить или функцию..что там говорить, если даже такие элементарные программы не получаются))
кучу учебников пересмотрела-все бестолку))
R136a1
 Аватар для R136a1
142 / 111 / 15
Регистрация: 14.04.2011
Сообщений: 261
13.01.2012, 16:15     в каком направлении действовать при написании программы #16
если ещё актуально, вот полегче вариант
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
#include <stdio.h>
#include <string.h>
#include <ctype.h>
 
int testPolindrom(char [], int, int);
 
int main()
{
    char t[128];
    char capital[128];
    int i;
    int j = 0;
 
    gets(t);
 
    for(i = 0; i < strlen(t); i++)
        if(isupper(t[i]))
        {
            capital[j] = t[i];
            j++;
        }
 
    capital[j] = 0;
 
    if(strlen(capital) % 2 != 0 && testPolindrom(capital,0,strlen(capital)-1))
        printf("%s\n",capital);
    else
    {
        for(i = 0; i < strlen(t); i++)
            if(islower(t[i]))
                printf("%c",t[i]);
 
        printf("\n");
    }
 
    return 0;
}
 
int testPolindrom(char t[], int begin, int end)
{
    if(begin < end)
    {
        if(t[begin] != t[end])
            return 0;
 
        testPolindrom(t,begin+1,end-1);
    }
    else
        return 1;
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
13.01.2012, 16:25     в каком направлении действовать при написании программы #17
R136a1,
Код
$ ./R136a1
xxxABCCBAxxx
xxxxxx
R136a1
 Аватар для R136a1
142 / 111 / 15
Регистрация: 14.04.2011
Сообщений: 261
13.01.2012, 16:33     в каком направлении действовать при написании программы #18
упс
в 25 строчке косяк

исправил

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
#include <stdio.h>
#include <string.h>
#include <ctype.h>
 
int testPolindrom(char [], int, int);
 
int main()
{
    char t[128];
    char capital[128] = {0};
    int i;
    int j = 0;
 
    gets(t);
 
    for(i = 0; i < strlen(t); i++)
        if(isupper(t[i]))
        {
            capital[j] = t[i];
            j++;
        }
 
    capital[j] = 0;
 
    if(strlen(capital) > 1 && testPolindrom(capital,0,strlen(capital)-1))
        printf("%s\n",capital);
    else
    {
        for(i = 0; i < strlen(t); i++)
            if(islower(t[i]))
                printf("%c",t[i]);
 
        printf("\n");
    }
 
    return 0;
}
 
int testPolindrom(char t[], int begin, int end)
{
    if(begin < end)
    {
        if(t[begin] != t[end])
            return 0;
 
        testPolindrom(t,begin+1,end-1);
    }
    else
        return 1;
}
lemegeton
 Аватар для lemegeton
2911 / 1340 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
14.01.2012, 02:33     в каком направлении действовать при написании программы #19
Ну можно попробовать еще ужать.
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 <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
 
int isPalyndrom(const char *string) {
  if (*string == '\0') return 0;
  const char *i = string;
  const char *j = string + strlen(string) - 1;
  while (i < j)
    if (*i++ != *j--)
      return 0;
  return 1;
};
 
int isNotUpper(int c) {
  return !isupper(c);
}
 
char *strcpyif(char *destination, const char *source, int (*predicate)(int)) {
  char *result = destination;
  for (; *source != '\0'; ++source)
    if (predicate(*source))
      *destination++ = *source;
  *destination = '\0';
  return result;
}
 
int main(int argc, char *argv[]) {
  char string[] = "BxxxxxCB";
  char buffer[sizeof(string)];
  strcpyif(buffer, string, isupper);
  if (!isPalyndrom(buffer))
    strcpyif(buffer, string, isNotUpper);
  printf("%s\n", buffer);
  return 0;
};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2012, 03:39     в каком направлении действовать при написании программы
Еще ссылки по теме:

C++ Разобраться в написании программы
В каком направлении следует развиваться программисту C++ C++
При написании программы по нахождению минимума на экран ничего не выводится, почему? C++

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
14.01.2012, 03:39     в каком направлении действовать при написании программы #20
Цитата Сообщение от lemegeton Посмотреть сообщение
Ну можно попробовать еще ужать.
Ну или вообще без выпендрёжа
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
#include <stdio.h>
#include <string.h>
#include <ctype.h>
 
#define WRD_LEN 128
#define WRD_MASK "%127s"
 
int main(void){
    char wrd[WRD_LEN], pal[WRD_LEN], * pWrd, * pHead, * pTail;
    
    while ( printf("Word: ") && scanf(WRD_MASK, wrd) == 1 ){
        for ( pWrd = wrd, pHead = pTail = pal; *pWrd; ++pWrd )
            if ( isupper(*pWrd) )
                *pTail++ = *pWrd;
    
        while ( --pTail > pHead && *pTail == *pHead )
            ++pHead;
    
        if ( pTail <= pHead ){
            for ( pWrd = wrd; *pWrd; ){
                if ( ! isupper(*pWrd) )
                    memmove(pWrd, pWrd+1, strlen(pWrd));
                else
                    ++pWrd;
            }
        }
        else {
            for ( pWrd = wrd; *pWrd; ){
                if ( isupper(*pWrd) )
                    memmove(pWrd, pWrd+1, strlen(pWrd));
                else
                    ++pWrd;
            }
        }
        
        printf("Result: %s\n", wrd);
    }
    
    return 0;
}
но так не интересно
Yandex
Объявления
14.01.2012, 03:39     в каком направлении действовать при написании программы
Ответ Создать тему
Опции темы

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