Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Замена одного массива другим


Автор: Winterlord 1.12.2008, 21:51
Здравствуйте уважаемые программисты. Как заменить значения элементов исходного массива a1, a2,...an на новые значения a`1,a`2,...a`n, используя правило, что a`i равно сумме n членов аj-х при i=j.?
Тоесть 1-й элемент нового массива будет равен сумме всех элементов кроме первого, второй: сумме элементов кроме первого и второго и так далее....
Если можете, помогите плз. Заранее благодарен

Автор: Dov 1.12.2008, 22:31
А последний чему равен?

Автор: Winterlord 1.12.2008, 22:40
Ну весь массив вводится произвольно, следовательно и последний элемент произвольный...

Автор: Dov 1.12.2008, 23:00
Я имею ввиду, чему будет равен последний элемент нового массива?

Добавлено через 26 секунд
чему он должен быть равен?

Автор: Rififi 1.12.2008, 23:03
это делается с использованием обычного двойного цикла...

... ну или при помощи лямбда-выражений из библиотеки http://www.boost.org примерно так... smile 

Код
#include <algorithm>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/numeric.hpp>
#include <boost/lambda/bind.hpp>

int main()
{
    namespace lm = boost::lambda;
    namespace ll = lm::ll;

    const size_t N = 5;
    int arr[N] = { 1, 2, 3, 4, 5 };
    int check[] = { 2+3+4+5, 3+4+5, 4+5, 5, 0 };

    size_t idx = 0;
    std::transform(arr, arr + N, arr, 
        lm::bind(
            lm::protect(
                lm::bind(
                    ll::accumulate(),
                    lm::_1,
                    lm::_2,
                    0)),
        arr + ++lm::var(idx), arr+N));

    bool bEqual = memcmp(arr, check, sizeof(int) * N) == 0;

    return (0);
}

Автор: Winterlord 1.12.2008, 23:15
Dov, Хороший вопрос... Скорее всего 0.

Rififi, если не сложно, распиши плз как ты это сделал, ато не совсем понятно)Да и лучше с помощью обычного двойного цикла) ато с лямбда-выражениями пока проблемы^^

Вообще мб я ошибся в написании формулы, так что вот скрин на всякий случай:
http://www.radikal.ru


Автор: Dov 1.12.2008, 23:20
Цитата(Winterlord @  1.12.2008,  22:15 Найти цитируемый пост)
Скорее всего 0.


Winterlord, тогда так:
Код
int main()
{
    int arr[] = {1, 2, 3, 4, 5};
    int i, sum = 0;
    int N = sizeof arr / sizeof(int); 

    for(i = 0; i < N; i++)
        sum += arr[i];

    for(i = 0; i < N; i++)
    {
        sum -= arr[i];
        arr[i] = sum;        
    }

    return 0;
}


Добавлено через 2 минуты и 31 секунду
Цитата(Winterlord @  1.12.2008,  22:15 Найти цитируемый пост)
Вообще мб я ошибся в написании формулы, так что вот скрин на всякий случай:

Как это по-русски читается?  Намекни...  smile 

Автор: Winterlord 1.12.2008, 23:29
Цитата(Dov @ 1.12.2008,  23:20)
Как это по-русски читается?  Намекни...  smile

Ну может я ошибся в написании корявым языком формулы) я написал "a`i равно сумме n членов аj-х при i=j", а может на самом деле это по другому читается)

Добавлено @ 23:38
Dov, Всё-таки не совсем прально. Должны получаться значения: 14,12,9,5,0 (если последний исходный массив был 1,2,3,4,5), а получается 12,9,5,0,0

Автор: Dov 1.12.2008, 23:40
Winterlord, смешной ты хлопец.  smile    Ты пойми, если ты спрашиваешь, то ты и должен объяснить народу чего ты хочешь, а не наоборот. Как же ты хочешь, что бы тебе помогли, если сам не знаешь, что тебе нужно?  smile

Добавлено через 2 минуты и 36 секунд
я, например, не понимаю, что значит i = j. и что такое j вобще?

Автор: Winterlord 1.12.2008, 23:45
Dov, что я не верно сказал?) Посмотри плз что ты не так написал.
Повторюсь, нужно заменить элементы исходного массива а1,а2,...аn на новые значения а`1,a`2,...a`n, используя правило:
http://www.radikal.ru

Автор: Dov 1.12.2008, 23:51
Цитата(Winterlord @  1.12.2008,  22:29 Найти цитируемый пост)
Должны получаться значения: 14,12,9,5,0 (если последний исходный массив был 1,2,3,4,5)


Winterlord, так у меня так и получается. А как ты выводишь?

Автор: Winterlord 1.12.2008, 23:52
Цитата(Dov @  1.12.2008,  23:40 Найти цитируемый пост)
я, например, не понимаю, что значит i = j. и что такое j вобще? 

говоря простым языком, первое число нового массива должно быть суммой всех чисел первого массива, кроме первого числа. Второе число нового массива будет суммой всех чисел первого массива кроме первого и второго, и так далее

Автор: Dov 1.12.2008, 23:57
Цитата(Winterlord @  1.12.2008,  22:52 Найти цитируемый пост)
говоря простым языком, первое число нового массива должно быть суммой всех чисел первого массива, кроме первого числа. Второе число нового массива будет суммой всех чисел первого массива кроме первого и второго, и так далее


Так, вроде бы, так и работает.  smile  

Автор: Winterlord 2.12.2008, 00:01
Цитата(Dov @  1.12.2008,  23:51 Найти цитируемый пост)
Winterlord, так у меня так и получается. А как ты выводишь? 


аааааа, точно)) Да, я непрально выводил. Теперь всё получается, Спасибо тебе огромное, а так же спс Rififi.

Dov, Но на всякий случай, как ты выводишь?

Добавлено через 4 минуты и 13 секунд
и ещё напиши плз что именно ты делаешь вот тут:
Код

 for(i = 0; i < N; i++)
        sum += arr[i];
    for(i = 0; i < N; i++)
    {
        sum -= arr[i];
        arr[i] = sum;        
    }


Добавлено через 7 минут и 15 секунд
просто хочу до конца разобраться...

Автор: Dov 2.12.2008, 00:18
Код
int main()
{
    int arr[] = {1, 2, 3, 4, 5};
    int i, sum = 0;

    // вычисляем размер массива 
    int N = sizeof arr / sizeof(int);

    // подсчитываем сумму всех элементов массива
    for(i = 0; i < N; i++)
        sum += arr[i];
    
    for(i = 0; i < N; i++)
    {
        // вычитаем из суммы текущий элемент, получая сумму оставшихся элементов
        sum -= arr[i];

        // присваиваем текущему элементу новое значение суммы
        arr[i] = sum;

        // выводим на экран
        cout << arr[i] << ' ';
    }

    cout << endl;
    
    return 0;
}

Автор: Winterlord 2.12.2008, 00:22
Dov, Большое тебе спасибо, очень выручил;)

Автор: Winterlord 3.12.2008, 01:08
После доработок и переделываний получился вот такой вот код:
Код

#include <iostream.h>
void main(){
int k,i,j;
const int N=5;
int a[N]={1,2,3,4,5};
for(i=0;i<N;i++){
cout<<a[i]<<endl;
}
cout<<"Solvation: \n";
for (i=0; i<N; i++){
int sum=0;
for (j=i;j<N;j++){
sum +=a[j];
}
a[i]=sum;
}
for(i=0;i<N;i++){
cout<<a[i]<<endl;
}
char ch;
cin>>ch;

}


Уважаемые программисты, подскажите пожалуйста, как сделать так, чтобы мой массив (допустим a[N]={1,2,3,4,5})считывался с txt файла  и изменённый массив записывался туда же или в новый файл? как ни пробую, не получается=(

Автор: Dov 3.12.2008, 20:15
Код
int main()
{
    ifstream    inFile;
    ofstream    outFile;
    int            i, j;
    const int    N    = 5;
    int            a[N];

    inFile.open( "input.txt" );

    for( i = 0; i < N; i++ )
        inFile >> a[i];

    for( i = 0; i < N; i++ )
        cout << a[i] << endl;

    cout << "Solvation: \n";

    outFile.open("output.txt");

    for( i = 0; i < N; i++ )
    {
        int    sum    = 0;
        for( j = i; j < N; j++ )
        {
            sum += a[j];
        }
        a[i] = sum;
    }

    for( i = 0; i < N; i++ )
        outFile << a[i] << ' ';

    for( i = 0; i < N; i++ )
        cout << a[i] << endl;

    inFile.close();
    outFile.close();

    return 0;
}



Winterlord, но должен тебе сказать, что твой "переделанный" алгоритм не выдерживает никакой критики. Почему? Потому что он сумму каждый раз пересчитывает заново. Но, как говорится, хозяин - барин...  smile 

Файл input.txt должен существовать на диске, в папке с этой прогой и иметь такие данные, например: 1 2 3 4 5  
Файл output.txt будет создан этой программой.

Автор: Winterlord 3.12.2008, 22:10
Dov, Большое тебе спасибо уже хз в какой раз) очень помог, теперь вроде всё работает как надо

Автор: Winterlord 9.12.2008, 22:33
Dov, Это снова я=) Если тебе не сложно, подкорректируй пожалуйста ещё чуток программку (код в твоём предыдущем посте). Нужно её разбить на функции, тоесть первая функция чтения с файла, вторая функция сами операции с массивом и третья функция запись в файл. И нужно сделать так, чтобы не указывать в коде количество элементов массива, содержащегося в файле, а программка сама понимала сколько цифр содержит файл, тоесть если в файле 7 элементов, обрабатывала 7, если 10, то 10. Если найдёшь время, сделай плз. Заранее благодарен)

Автор: Winterlord 12.12.2008, 13:07
Проблема уже разрешилась. Всё написал сам

Автор: Winterlord 14.12.2008, 15:06
Проблема решилась, но не до конца. Если в файле больше десяти элементов, то программа читает только 10 элементов, если в файле меньше 10-ти элементов, то прога читает столько, сколько есть. Всё работает.
Не получается сделать так, чтобы когда в файле вообще нет элементов, прога выдавала: "Нет элементов". Компилятор Dev C++. Если кто знает как сделать, напишите плз, бьюсь над этим уже довольно долго
Код

#include <iostream.h>
#include <fstream.h>

int READ (int *a, int *N)
{ int i=0;
ifstream inFile;
 inFile.open("input.txt",ios::in);
if (inFile) {while (!inFile.eof())

    {       //if (inFile.eof()) {break; cout<<"Net Elementov";}
            if (i>*N) {break;}
      inFile>>*(a+i);
      cout<<*(a+i)<<endl;
      i++; 
       }
      if (i==0) {cout<<"net elementov";}
      if (i<*N) {*N=i;}}
      
    cout << "Solvation: \n";
    
    inFile.close();}

int SUM (int *a, int N)
{   
for (int j=0; j<N; j++)
    { int summa=0;
    for(int k=j; k<N; k++)
    {
        summa+=*(a+k);
    }
    *(a+j)=summa;
    }    }

int OUT (int *a, int N)
{ofstream    outFile;
outFile.open("output.txt",ios::out);
for (int z=0; z<N; z++)
    {outFile<<*(a+z)<<endl;
    cout << *(a+z)<<endl;
    }
    outFile.close() ;           }

int main()
{
int N=10;
    int a[N];
    
    READ (&a[0], &N);     
    
    
    SUM (&a[0], N); 
    OUT (&a[0], N);
 int o;
cin>>o;
   

}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)