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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.83
maniac0192
17 / 17 / 3
Регистрация: 27.11.2011
Сообщений: 141
#1

Вейвлет Хаара 2.Ввод и вывод. - C++

30.11.2011, 15:18. Просмотров 4238. Ответов 32
Метки нет (Все метки)

Есть две программы. 1-ая это прямое преобразование Хаара. 2-ая это собственно обратное. Что нужно бы сделать. Нужно считать файл input.dat проделать преобразования 1-ой программой, и получить файл output.dat в которое выводиться это преобразование. Затем взять файл ounput.dat и проделать обратное преобразование 2-ой программой и вывести в файл output2.dat, чтобы потом можно было сравнить с файлом input.dat. вывод должен происходить в столбик. Число элементов массива в каждом файле можно записать в начале. И самый главный вопрос, можно ли сделать так, чтобы при вводе появлялась консоль, в которой бы запрашивалась имя входного и выходного файла. Искал в интернете ничего про это не нашел, кроме того что в UNIX можно перенаправлять потоки и таким образом это реализовывать. А как это сделать для WINDOWS не очень понятно. может кто подскажет где про это можно почитать, или даст какой нибудь пример кода...или просто подсказку. Если нужно код 1ой и 2ой программы выложу.
Заранее спасибо за помощь!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2011, 15:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вейвлет Хаара 2.Ввод и вывод. (C++):

Заменить в программе, переводящую строку в двоичный код, консольный ввод/вывод на файловый ввод/вывод - C++
Добрый день! Помогите, пожалуйста, с программой. Программа считывает строку с клавиатуры и переводит её в двоичный код. затем наоборот...

Поменять консольный ввод-вывод на файловый ввод-вывод - C++
вот у меня калькулятор как мне сделать что б числа вводились из файла и результат записывался в новый файл ? // ОБРАТНАЯ...

Запись выражений, ввод–вывод информацииЗапись выражений, ввод–вывод информации - C++
Задача 2.1. Пользуясь только операцией умножения, вычислить (A в 7-ой степени) за четыре операции. Задача 2.2. Очистить экран,...

Файловый ввод-вывод, ввод с клавиатуры и обработка массива структур - C++
Добрый вечер)) У меня небольшой вопрос. Почему первые буквы (в названии книг) не выводит на экран? Само задание: О каждой книге ...

Каскады хаара - C++
Всем привет. Кто нибудь пожалуйста дайте ссылку для скачивания cvhaartraining.lib, очень нужна эта библа. Заранее спасибо!

Товарищи помогите с вейвлетом Хаара - C++
#include <iostream> #include <time.h> using namespace std; int main () { int n; std::cout << "Enter n:\n>"; ...

32
HighPredator
5545 / 1858 / 346
Регистрация: 10.12.2010
Сообщений: 5,444
Записей в блоге: 2
01.12.2011, 21:42 #16
Так же через cout. Текст я смотрю вы пытались им в последнем коде выводить. Выведите еще и значения.
0
maniac0192
17 / 17 / 3
Регистрация: 27.11.2011
Сообщений: 141
01.12.2011, 21:50  [ТС] #17
текст выводится, а вот значения из input нет(((((((что делать не пойму. а может вы посоветуете попроще переписать ввод вывод через файлы программы
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 <iostream>
using namespace std;
 
int main ()
{
    int n;
std::cout << "Enter n:\n>";
std::cin >> n;
float* a = new float[n];
for (int k = 0; k <= n-1; k++)
{
    std::cin >> a[k];
}
int m;
float *b=new float [m];
float *c=new float [m];
m = n/2;
 
for (int j=0; j<m ; j++)
{
        b[j]=(a[2*j]-a[2*j+1])/2;
        c[j]=(a[2*j]+a[2*j+1])/2;
}
 
std::cout<<"raznost: ";
for(int j=0; j<m;j++)
{
      std::  cout<<b[j]<<endl<<" ";
}
 
std::cout<<"\n";
std::cout<<"summa: ";
for(int j=0; j<m;j++)
{
        std::cout<<c[j]<<endl<<" ";
}
std::cout<<"\n";
//system("PAUSE");
return 1;
}
0
HighPredator
5545 / 1858 / 346
Регистрация: 10.12.2010
Сообщений: 5,444
Записей в блоге: 2
01.12.2011, 22:24 #18
Цитата Сообщение от maniac0192 Посмотреть сообщение
что делать не пойму
Учите матчасть. То есть. Потоковый ввод вывод в консольных приложениях с++ (ключевые слова cin/cout). Только после этого садитесь за файлы. Почему такой ответ? Смотрите ваш код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void OutArray(float b[],float c[])
{
  std::cout<<"raznost: ";
  for(int j=0; j<m;j++)
  {
        f2<<b[j]<<endl<<" ";
  }
 
  std::cout<<"\n";
  std::cout<<"summa: ";
  for(int j=0; j<m;j++)
  {
         f2<<c[j]<<endl<<" ";
  }
  std::cout<<"\n";
}
Цитата Сообщение от maniac0192 Посмотреть сообщение
текст выводится, а вот значения из input нет(((((((что делать не пойму
В данной подпрограмме у вас вообще нет вывода числовых значений на экран через cout. А поскольку это вам неочевидно, то знания имеет смысл подтянуть. Это вам поможет в дальнейшем точнее понимать суть вашей проблемы.

Не по теме:

Заметил, что форум чего-то на зимнем времени Ау! Администрация!

0
maniac0192
17 / 17 / 3
Регистрация: 27.11.2011
Сообщений: 141
02.12.2011, 00:29  [ТС] #19
я понимаю что это потоковый ввод и вывод, я просто не убрал эту чушь при переделывании кода.
0
HighPredator
5545 / 1858 / 346
Регистрация: 10.12.2010
Сообщений: 5,444
Записей в блоге: 2
02.12.2011, 10:15 #20
Выложите код с которым работаете в данный момент и постарайтесь максимально кратко и четко сформулировать вопрос, избегая большого количества посторонней информации.
0
maniac0192
17 / 17 / 3
Регистрация: 27.11.2011
Сообщений: 141
02.12.2011, 15:06  [ТС] #21
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 <iostream>
using namespace std;
int main ()
{
        int n; 
        std::cout << "Enter n:\n>";
        std::cin >> n;
        float* a = new float[n];
        std::cout<<"massiv a:\n";
        for (int i = 0; i <= n-1; i++)
        {
           std::cin >> a[i];
        }
        float* b = new float[n];
        std::cout<<"massiv b:\n";
        for (int j = 0; j <= n-1; j++)
        {
            std::cin >> b[j];
        }
         float* c = new float [n*2];
        std::cout<<"ishodnii: \n ";
        for(int k = 0, i = 0; i < n; k+=2, i++)
        {
                  c[k] = a[i] + b[i];
                  c[k+1] = a[i] - b[i];
        }
 
        for(int k=0; k<n*2; k++)
        {
                std:: cout<<c[k]<<endl<<" ";       
        }
        //system("pause");
}
вот код, хочу сделать так, чтобы я вводил массив не с клавиатуры а читал его из файла input.txt, а результат полученных преобразований выводил в файл output.txt. И в файлах всё должно быть записано в столбик. а не в строку.
0
HighPredator
5545 / 1858 / 346
Регистрация: 10.12.2010
Сообщений: 5,444
Записей в блоге: 2
02.12.2011, 17:26 #22
Что мешает? Например так можно:
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
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
        int n; 
        int i;
        ifstream in("input.txt");
        if(!in)
        {
            cout<<"Input file not found!"<<endl;
            return 1;
        }
        in>>n;
        float* a = new float[n];
        float* b = new float[n];        
        float* c = new float[n*2];
        for(i=0;i<n;i++)
        {
            in>>a[i];
            in>>b[i];
        }
        in.close();
        ofstream out("output.txt");
        if(!out)
        {
            cout<<"Unable to create output file!"<<endl;
            delete []a;
            delete []b;
            delete []c;
            return 1;
        }
        out<<n*2<<endl;
        for(int k = 0, i = 0; i < n; k+=2, i++)
        {
                  c[k] = a[i] + b[i];
                  c[k+1] = a[i] - b[i];
                  out<<c[k]<<endl<<c[k+1]<<endl;
 
        } 
        out.close();
        delete []a;
        delete []b;
        delete []c;
        return 0;
}
Добавлено через 35 секунд

Не по теме:

Ничего себе табуляция уехала...

1
maniac0192
17 / 17 / 3
Регистрация: 27.11.2011
Сообщений: 141
04.12.2011, 04:33  [ТС] #23
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
#include <iostream>
#include<fstream>
using namespace std;
 
int main ()
{
    int n;
    int i;
                ifstream in("input.txt");
                if(!in)
                {
                        cout<<"Input file not found!"<<endl;
                        return 1;
                }
                in>>n;
                
float* a = new float[n];
float *b=new float [n/2];
float *c=new float [n/2];
 
for (int k = 0; k <= n-1; k++)
{
    in>> a[k];
}
in.close();
                ofstream out("output.txt");
                if(!out)
                {
                        cout<<"Unable to create output file!"<<endl;
                        delete []a;
                        delete []b;
                        delete []c;
                        return 1;
                }
                out<<n*2<<endl;
                
for (int j=0; j<n/2 ; j++)
{      
         c[j]=(a[2*j]+a[2*j+1])/2;
         b[j]=(a[2*j]-a[2*j+1])/2;
        
        out<<c[j]<<endl<<b[j]<<endl;
}
                out.close();
                delete []a;
                delete []b;
                delete []c;
                return 0;
}
Большое спасибо за оказанную помощь, применил то же самое для прямого преобразования, всё работает. Извеняюсь за ещё один, наверное уже последний вопрос...вот код программы, и на выходе в файл output я получаю 2 массива. допустим на вод идёт последовательность 220, 211, 212, 218, 217, 214, 210, 202.
на выходе получу две (215.5, 215, 215.5, 206) и (4.5, -3, 1.5, 4). А можно ли сделать так, чтобы операция
C++
1
2
c[j]=(a[2*j]+a[2*j+1])/2;
         b[j]=(a[2*j]-a[2*j+1])/2;
повторилась для каждого из полученных массивов,т.е. теперь из (215.5, 215, 215.5, 206) получим (215.25, 210.75) (0.25, 4.75). из (4.5, -3, 1.5, 4) аналогично, и повторялась она для каждого нового полученного массива........это трудно написать??как подступиться к такой задаче.......??? Спасибо, если хоть чем то поможете....

Добавлено через 27 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for (int count = SIZE; count > array.Length / (2 * level); count /= 2)
            {
                // Рассчитать полусуммы и разности, занести во временные массивы сумм и разностей
                for (int i = 0; i < count / 2; i++)
                {
                    avg[i] = (array[2 * i] + array[2 * i + 1]) / 2;
                    diff[i] = array[2 * i] - avg[i];
                }
 
                // Перенести суммы и разности в итоговый массив
                for (int i = 0; i < count / 2; i++)
                {
                    array[i] = avg[i]; // В первую половину
                    array[i + count / 2] = diff[i]; // Во вторую половину
                }
            }
на самом деле, мне бы просто этот код перенести в C++. И оставить использование файлов...

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
for (int j=0; j<n/2 ; j++)
{      
         c[j]=(a[2*j]+a[2*j+1])/2;
         b[j]=(a[2*j]-a[2*j+1])/2;
        
        out<<c[j]<<endl<<b[j]<<endl;
}
переделывая вот этот код..
0
HighPredator
5545 / 1858 / 346
Регистрация: 10.12.2010
Сообщений: 5,444
Записей в блоге: 2
04.12.2011, 12:09 #24
Можно. Просто считывайте два массива и над каждым делайте то, что нужно. Только помните, что данная реализация всегда дает с одного исходного два преобразованных массива.
0
maniac0192
17 / 17 / 3
Регистрация: 27.11.2011
Сообщений: 141
05.12.2011, 19:06  [ТС] #25
да я понял, может вы сможете мне объяснить, как я могу сделать так, чтобы у маня следующее преобразование выводилось в соседний столбик, и пробывал я делать это для каждого измения, но не получается, выдаёт тот же массив, с теми же коэффицентами((я чесно не знаю как это реализовать(

Добавлено через 24 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for(int m = n/2; m > n/(2*level); m /=2 )
  {
for (int j=0; j<n/2 ; j++)
{      
         c[j]=(a[2*j]+a[2*j+1])/2; 
       
        out<<c[j]<<endl;
}
}
for(int m = n/2; m > n/(2*level); m /=2 )
  {
for (int j=0; j<n/2 ; j++)
{      
         b[j]=a[2*j]-c[j];
       
        out<<b[j+n/2]<<endl;
}
}
вот я не прав сдесь, не пойму в чём лажаю, вроде аналогично сделал

Добавлено через 17 часов 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
for(int count = n; count>m/4; count /=2)
{
        for (int j=0; j<n/2 ; j++)
            {        
                     c[j]=(a[2*j]+a[2*j+1])/2;
                     b[j]=(a[2*j]-a[2*j+1])/2;
            }
        for(int j=0; j<count/2;j++)
            {
                 out<<c[j]<<endl<<b[j]<<endl;
             }
}
всё равно не правильно выдаёт, хотя правильно считает первый раз

Добавлено через 40 минут
получается что преобразование делается 1 раз, а потом повторяется только вывод, но уже меньшего количества элементов

Добавлено через 37 секунд
и m = n/2
0
maniac0192
17 / 17 / 3
Регистрация: 27.11.2011
Сообщений: 141
07.12.2011, 00:25  [ТС] #26
Так, с прямым разобрался, осталось только один лишний коэффицент убрать и всё, а вот как реализовать алгоритм обратного????
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
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
        int n; 
                int i;
                ifstream in("output.txt");
                if(!in)
                {
                        cout<<"Input file not found!"<<endl;
                        return 1;
                }
                in>>n;
        float* a = new float[n];
                float* b = new float[n];        
        float* c = new float[2*n];
                for(i=0;i<n;i++)
                {
                        in>>a[i];
                        in>>b[i];
                }
                in.close();
                ofstream out("output1.txt");
                if(!out)
                {
                        cout<<"Unable to create output file!"<<endl;
                        delete []a;
                        delete []b;
                        delete []c;
                        return 1;
                }
                out<<n<<endl;
        for(int k = 0, i = 0; i < n/4; k+=2, i++)
        {
                  c[k] = a[i] + b[i];
                  c[k+1] = a[i] - b[i];
                  out<<c[k]<<endl<<c[k+1]<<endl;
 
        } 
                out.close();
                delete []a;
                delete []b;
                delete []c;
                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
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include<fstream>
using namespace std;
 
int main ()
{
    int n;
    int i;
                ifstream in("input.txt");
                if(!in)
                {
                        cout<<"Input file not found!"<<endl;
                        return 1;
                }
                in>>n;
                
float* a = new float[n];
float *b=new float [n/2];
float *c=new float [n/2];
 
for (int k = 0; k <= n-1; k++)
{
    in>> a[k];
}
in.close();
                ofstream out("output.txt");
                if(!out)
                {
                        cout<<"Unable to create output file!"<<endl;
                        delete []a;
                        delete []b;
                        delete []c;
                        return 1;
                }
                out<<2*(n-1)<<endl;
do
{
  float *c=new float [n/2];
  float *b=new float [n/2];
  for (int j=0; j<n/2; j++)
      {        
               c[j]=(a[2*j]+a[2*j+1])/2;
               b[j]=(a[2*j]-a[2*j+1])/2;
               out<<c[j]<<" "<<" "<<" "<<" "<<" "<<b[j]<<endl;
      }
               delete []a;
               delete []b;
               b=c;
               a=c;
               n=n/2;
}
               while(n>=1);
                out.close();
                delete []c;
                return 0;
}
0
HighPredator
5545 / 1858 / 346
Регистрация: 10.12.2010
Сообщений: 5,444
Записей в блоге: 2
07.12.2011, 14:09 #27
Цитата Сообщение от maniac0192 Посмотреть сообщение
как реализовать алгоритм обратного?
У вас есть формулы расчетов коэффицентов для преобразования Хаара. Из двух получившихся рядов коэффициентов можно составить формулу расчета исходных значений сигнала.
0
Driim
7 / 7 / 0
Регистрация: 29.03.2011
Сообщений: 81
07.12.2011, 17:09 #28
Может конечно не в тему. Но зачем городить такие сложности, если есть программа 1 и 2, то почему бы не написать *.bat файл в котором задать последовательность запуска программ а имя входных и выходных файлов просто как переменные нести?!
0
HighPredator
5545 / 1858 / 346
Регистрация: 10.12.2010
Сообщений: 5,444
Записей в блоге: 2
07.12.2011, 17:12 #29
Driim, понимаете, можно сделать все, что угодно. На данном этапе более рационально решать актуальные задачи, а подобную "косметику" нанести всегда успеется.
0
maniac0192
17 / 17 / 3
Регистрация: 27.11.2011
Сообщений: 141
07.12.2011, 17:44  [ТС] #30
Нет, я не про это, смотрите, во второй программе там всё чётко возвращается, исходный массив находится, просто в прямом разложении я получаю кучу массивов, разных. А могу я получать их в обратном преобразовании тоже пошагово как в прямом, т.е было (215.25, 210.75) (0.25, 4.75) получил (215.5, 215, 215.5, 206) , а из массива разностей тоже было 2, а получил (4.5, -3, 1.5, 4). записал в файл, а потом взял полученые, опять 2 и получил новый.
И можете рассказать, что за BAT файл, просто чтобы почитать посмотреть, вдруг как раз пригодится потом..

Добавлено через 3 минуты
И еще маленький вопрос, как сделать так чтобы после каждого преобразования у меня отступалась строка чтобы коэффициенты полученные при преобразовании как бы групировались
0
07.12.2011, 17:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2011, 17:44
Привет! Вот еще темы с ответами:

Прямое и обратное преобразование Хаара - C++
Здравствуйте. Написал вейвлет-сжатие Хаара, чисто визуально все работало правильно. Для надежности решил написать обратное преобразование и...

Реализовать вывод массива объектов типа Student на консоль (файловый ввод/вывод) - C++
Как сделать чтобы список студентов выводился на экран в конце? #include&lt;iostream&gt; #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; ...

Поиск в массиве структур по заданному полю и вывод в алфавитном порядке (файловый ввод/вывод) - C++
Помогите с функцией void runFile() что бы с файла брал и выводил в алфавитном порядке список товаров, хранящихся больше месяца, стоимость...

Вывод суммы в файл (файловый ввод/вывод) - C++
Добрый день! Я пытался написать программу, которая должна вводить данные из файла №1, потом вычислять их сумму и полученное значение...


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

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

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