Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик
Статус: Академик
Рейтинг: 9871
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Академик
Рейтинг: 3850
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2460
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1728
Дата выхода:06.03.2012, 00:30
Администратор рассылки:Киселёва Алёна aka Verena (Профессор)
Подписчиков / экспертов:150 / 99
Вопросов / ответов:1 / 1

Консультация # 185528: Доброго времени суток! Дали задание на лабораторную, притом, что на лекциях мы проходим какую-то общую теорию и никакой конкретики. Из всего написали, как делать ввод и всё. Собственно, задание: [QUOTE] Из входного потока вводится непрямоугольная матрица целых чисел [a[i,j]], i=1, ...,m, j=1, ..., n(i)). Значения m и n(i) зар...


Консультация # 185528:

Доброго времени суток!
Дали задание на лабораторную, притом, что на лекциях мы проходим какую-то общую теорию и никакой конкретики.
Из всего написали, как делать ввод и всё.

Собственно, задание:

[QUOTE]
Из входного потока вводится непрямоугольная матрица целых чисел [a[i,j]], i=1, ...,m, j=1, ..., n(i)). Значения m и n(i) заранее не известны и вводятся из входного потока.
Сформировать новую матрицу, поместив в её i-ю строку элементы из i-й строки исходной матрицы, являющиеся палиндромами.
Исходную и полученную матрицы вывести в выходной поток с необходимыми комментариями.
[/QUOTE]

Матрицы вводятся динамически.
Палиндром - выражение, читающееся одинаково с обоих сторон (выражения, типа: "А роза упала на лапу Азора")

Всё, что я смог написать - это списать из тетрадки ввод и подумать над выводом(Вывод надо как-то писать по аналогии с вводом, видимо):

Код :

#include <iostream>
using namespace std;
 
//Для задания непрямоугольной матрицы
struct Line{
        int n;
        double *ar;
Line *matr;
};
 
//Функция ввода
istream&input(int&a){
        while(!(cin>>a)){
                if(cin.eof())
                        break;
                cin.clear();
                cin.ignore();
        }
        return  cin;
}
 
//Ввод количества строк
int input(){
        int n;
        const char*pr="";
        do{
                cout<<pr<<endl;
                pr="error!!!";
                cout<<"enter number of int:";
                input(n);
        }while(n<=0);
        return n;
}
 
//Ввод матрицы
int input(Line*&p){
        int m=input();
        p=new Line[m];
        for(int i=0;i<m;++i){
                p[i].n=input();
                p[i].ar=new double[p[i].n];
                for(int j=0;j<p[i].n,++j)
                        input(p[i].ar[j]);
        }
        return m;
}
 
//Это я начал что-то с выводом предполагать
void output(Line*&p){
        for(int i=0;i<m;++i){
                for(int j=0;j<p[i].n;++j)
                        cout<<p[i].n<<endl;
        }
 
int main(){
 


От Си осталась программа определения палиндрома, выписал из неё функции определения палиндрома, может, как-то поможет (но там ,к тому же использовалась библиотека String.h (Здесь ничего подобного, вроде, не нужно использовать):

Вроде, cin удаляет все пробелы и табуляторы перед словом, поэтому функция проверки на них не нужна.

Код :
//Переворот строки
void reverse (char *from, char *to){
 int i=strlen(from);
 strcpy(to,"");
 while(i -->0)
  strncat(to,&from[i],1);
}
 
//Отвечает, палиндром или нет
int isapal(char *str){
 char tmp1[80],tmp2[80];
 strcpy(tmp1,str);
 compress(str,tmp1);
 reverse (tmp1,tmp2);
 return !strcmp(tmp1,tmp2);
}


Помогите пожалуйста. Желательно с пояснениями, чтобы дальше я хоть мог предположить, как следующие программы делать.

Дата отправки: 29.02.2012, 23:46
Вопрос задал: Безымянный (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует lamed (Академик):

Здравствуйте, Безымянный! G++/Code::Blocks.

Код :
#include <iostream>
#include <vector>
#include <iomanip>

using namespace std;
bool is_pali(const int n)
// Является ли число палиндромом?
{
    int x=n; // сохраняем передаваемое число во временную переменную
    int m=0; // формируем "перевернутое" число
    while (x>0) // есть что добавлять?
    {
        m=m*10+x%10; // по формуле Горнера, но только справа налево
        x/=10; // получем остаток после "отсечения" правой цифры
    }
    return m==n; // "перевенутое" число равно исходному?
}

int main()
{
    size_t m;

    cin>>m; // количество строк
    vector <vector <int> >mat1(m); // матрица
    for (size_t i=0; i!=m; ++i)
    {
        size_t n;

        cin>>n; // количество столбцов
        for (size_t j=0; j!=n; ++j)
        {
            int x;
            cin >> x;
            mat1[i].push_back(x); // увеличиваем размер строки, добавляя элемент
        }
    }

    vector <vector <int> >mat2(m); // результирующая матрица
    for (size_t i=0; i!=m; ++i)
    {
        size_t n = mat1[i].size();
        for (size_t j=0; j!=n; ++j)
            if (is_pali(mat1[i][j])) // если соответствующий элемент i-й строки  1й матрицы - палиндром
                mat2[i].push_back(mat1[i][j]); // добавим его к i- строке 2й мартицы
    }

    for (size_t i=0; i!=mat2.size(); ++i) // печать 2й матрицы
    {
        cout << "i=" << i << "=>" ;
        for (size_t j=0; j!=mat2[i].size(); ++j)
            cout << setw(6) << mat2[i][j];
        cout << endl;
    }

    return 0;
}

Пример. Ввод
Код :
3
4
12 123 121 1221
2
11 11
4
121 121 212 2112

Вывод
Код :
i=0=>   121  1221
i=1=>    11    11
i=2=>   121   121   212  2112

Удачи!

Консультировал: lamed (Академик)
Дата отправки: 05.03.2012, 15:45
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное