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

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

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

Координаты нахождения массива A в массиве B - C++

31.05.2012, 16:33. Просмотров 577. Ответов 6
Метки нет (Все метки)

Доброго времени суток)
Помогите пожалуйста решить и разобраться в сложной задаче, а то завтра сдавать уже в виде курсовой работы(((

Условие:
В бинарный файл записаны массивы A(m) и B(n). Структура файла следующая: сначала хранятся m и n, а затем массивы A и B. Утверждается, что массив A(m) целиком (последовательность) встречается в массиве B(n), n>m. Найти место массива A в массиве B или показать, что его в массиве B нет. Вывести координаты нахождения массива A в массиве B.

help me plz)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2012, 16:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Координаты нахождения массива A в массиве B (C++):

В двухмерном массиве найти максимальный и минимальный элементы и их координаты в массиве - C++
"В двухмерном массиве, размещенном в куче и заполненном случайными вещественными значениями, определить максимальных и минимальный элемент...

Проверка нахождения числа в массиве - C++
Составить программу с использованием массивов и указателей (На C) Составить программу которая проверяет находится ли введённое с...

Шаблон нахождения максимального элемента в массиве - C++
Доброго всем дня.. В общем проблема. Ничерта не могу понять в шаблонах (С++). Суть задания - создание шаблона для нахождения...

Программа нахождения четных чисел в массиве. - C++
В одномерном массиве нужно найти количество четных чисел(желательно с помощью функции). Заранее благодарен!

Способы нахождения повторяющихся чисел в массиве? - C++
Одна из задач, составить программу, которая позволяет одинаковые числа в массиве. По моей логике - должна работать, но не работает. ...

Написать функцию нахождения нечетных чисел в массиве - C++
Задан массив целых чисел. Вывести на экран элементы, являющиеся нечетными числами. Реализовать для двух функции одна для int массива другая...

6
Catstail
Модератор
22915 / 11281 / 1833
Регистрация: 12.02.2012
Сообщений: 18,493
31.05.2012, 17:21 #2
1) Каков тип данных в массивах А и B?
2) Можно ли залить массивы в память или нужно работать только с файлами?
0
click93
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 3
31.05.2012, 18:22  [ТС] #3
не знаю) мне уже помогли решить)

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include <iostream>
#include <stdio.h>
#include <time.h>
 
#define FileName "file.bin"
 
 
int m, n; //объявляет переменную
int * a;  //* - Указатель
int * b;
 
void MakeFile() //void - ничего не возвращает  //создает файл бинарный с 2 массивами
{
//создает файл бинарный
    m= 6;   //m и n колличество переменных в массивах a и b
    n= 15;
    a= new int[m];
    b= new int[n];
//присваивание значение массиву
    a[0]= 23;
    a[1]= 54;
    a[2]= 12;
    a[3]= 4;
    
    a[4]= 0;
    a[5]= 28;
 
 
    b[0]= -1;
    b[1]= -65;
    b[2]= 87;
    b[3]= 100;
    b[4]= 23;
    b[5]= 54;
    b[6]= 12;
    b[7]= 4;
    b[8]= 0;
    b[9]= 28;
    b[10]= 81;
    b[11]= 2;
    b[12]= 1;
    b[13]= 89;
    b[14]= 1000;
 
    FILE* f= fopen(FileName, "wb");  //открывает файл для записи в бирарном режиме (двоичном) "wb"
 
    fwrite(&m, 1, sizeof(int), f);  //записывает файл
    fwrite(&n, 1, sizeof(int), f);  
 
    fwrite(a, m, sizeof(int), f);
    fwrite(b, n, sizeof(int), f);
 
    fclose(f);  //закрывает файл
}
 
int main()  //точка входа в программу
{
    MakeFile();  //вызов функции, создание файла
 
    FILE* f= fopen(FileName, "rb");  //открывает файл для чтения в бинарном режиме
 
    fread(&m, 1, sizeof(int), f);  //читает файл  sizeof(int) - размер переменной типа int 
    fread(&n, 1, sizeof(int), f);
 
    a= new int[m];  //создает новый массив 
    b= new int[n];  //создает новый массив 
 
    fread(a, m, sizeof(int), f);
    fread(b, n, sizeof(int), f);
 
    fclose(f);  //закрывает файл
    //выводим содержимое массивов
    std::cout << "A";   
    for (int i = 0; i < m; i++)
        std::cout << a[i] << " ";
    std::cout << std::endl; // перевод строки
 
    std::cout << "B";
    for (int i = 0; i < n; i++)
        std::cout << b[i] << " ";
    std::cout << std::endl;
    
    int foundres= -1;  //проверяет нашли мы ответ или не нашли (если меньше 0 то не нашли)
    for (int i=0; i<n; i++)  //пробегает по массиву b
    {
        bool found= true;  //bool - буловская переменная типа данных принимает true or false
        int j;  //объявляем переменную j
        for (j=0; j<m && j+i<n; j++)  //цикл по а
        {
            if (a[j]!=b[i+j])  //если а[j] не равно b[j]+j
            {
                found = false;  //массив не найден
                break;  //завершает цикл
            }
        }
 
        if ((found)&&(j==m))  //если нашли то сравниваем j с m
        {
            foundres= i;  //запоминаем позицию i
            break;  //завершает цикл
        }
    }
 
    if (foundres>=0)  //если позиция > или = 0
    {
        std::cout<<"Found in pisition "<<foundres;  //выводит на экран строку
    }else  //иначе
        std::cout<<"Not Found";  //выводит Not Found   //cout - стандартный поток вывода
 
    system ("pause");  //выставляет паузу
    return 0;  //завершает программу
}
Добавлено через 4 минуты
Catstail, можешь помочь с алгоритмом решения? объяснить по порядку что делаем?
типо того что ниже, только про мою задачу) плз) а то я курсовую по этой задачи пишу и остался ток алгаритм и заключение((

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2 Алгоритм решения
Пользователем вводится две строки и знак операции. Затем происходит проверка числа на знак «-» .Если данный знак обнаруживается в первом или во втором числе, то знак «обрезается», а флаг isFirstNumberNegative и/или isSecondNumberNegative меняет значение на true (изначально значения флагов – false). Далее обнуляется рабочий массив, т.е. происходит его инициализация. Потом проверка условий для знака операции от зависимости введенных чисел:
1.  Если знак операции «-» и числа отрицательные – знак операции не меняется.
2.  Если знак операции  «-» и второе число отрицательное – знак операции меняется на «+».
3.  Если знак операции «+» и второе число отрицательное – знак меняется на «-».
4.  Если знак операции «-» и первое число отрицательно – знак операции меняется на «+».
5.  Если знак операции «+» и первое число отрицательно – знак операции меняется на «-».
Так же при проверки этих условий изменяется значение флага числа с true на false. 
Затем находится длина строк с помощью функции length. Выясняется какое из чисел больше через оператор if при этом, если второе число больше первого: числа меняются местами и флаги тоже. Если числа одинаковой длины выполняется алгоритм для сравнения чисел порязрядово и так же меняется значение чисел и флаги местами при условии ,если второе число больше первого ( а так же переменной isSecondNumberGreater присваевается значение true).
Вводится в рабочий массив значение первого числа из строки путем вычитания из i символа строки символа '0', так как в строке хранятся символы от 0 до 9, то путем вычитание находится код данного числа и записывается в рабочий массив. Далее по множественному оператору выбора switch выбирается знак операции хранимый в переменной opearion. Числа складываются/вычитаются с конца массивов по примеру сложения/вычитания в столбик, если число получается меньше или равно девяти ,то все хорошо –переход к следующим числам, нет – в buffer[i] помещается остатка от числа, а в результат помещается во второй массив buffer[k] и хранит значение 1 (такой же алгоритм и при вычитании).
Проверка и печать знака по условиям:
1.  Если второе число больше первого и первое число отрицательно печать «-».
2.  Если длина строк одинакова и первое число отрицательно, и втрое положительно, то печать знака «-».
3.  Если второе число не больше первого и первое число, и втрое число отрицательны, то печать знака «-».
В остальных случаях печатается знак «+». Далее происходит печать самого массива по оператору for от 0 до n с шагом 1 при условии что значение не 0 и не первое ненулевое значение, потом по условию достижение печать символа.
0
Catstail
Модератор
22915 / 11281 / 1833
Регистрация: 12.02.2012
Сообщений: 18,493
31.05.2012, 18:37 #4
Начало правильное, а дальше - пурга.
0
click93
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 3
31.05.2012, 20:44  [ТС] #5
Catstail, это алгоритм был не к этой задаче, а вообще пример какой должен)
помоги мне с моим алгоритмом) плз)
0
Catstail
Модератор
22915 / 11281 / 1833
Регистрация: 12.02.2012
Сообщений: 18,493
31.05.2012, 21:03 #6
Взял твой-же код и подрихтовал немного. Пургу выкинул:

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include "stdafx.h"
#include "stdio.h"
 
#define FileName "file.bin"
 
int m, n; //объявляет переменную
int * a;  //* - Указатель
int * b;
 
void MakeFile() //void - ничего не возвращает  //создает файл бинарный с 2 массивами
{
    //создает файл бинарный
 
    m= 6;   //m и n колличество переменных в массивах a и b
    n= 15;
    a= new int[m];
    b= new int[n];
 
    //присваивание значение массиву
 
    a[0]= 23;
    a[1]= 54;
    a[2]= 12;
    a[3]= 4;
    a[4]= 0;
    a[5]= 28;
 
 
    b[0]= -1;
    b[1]= -65;
    b[2]= 87;
    b[3]= 100;
    b[4]= 23;  //!!!
    b[5]= 54;
    b[6]= 12;
    b[7]= 4;
    b[8]= 0;
    b[9]= 28;
    b[10]= 81;
    b[11]= 2;
    b[12]= 1;
    b[13]= 89;
    b[14]= 1000;
 
    FILE* f= fopen(FileName, "wb");  //открывает файл для записи в бирарном режиме (двоичном) "wb"
 
    fwrite(&m, 1, sizeof(int), f);  //записывает файл
    fwrite(&n, 1, sizeof(int), f);  
 
    fwrite(a, m, sizeof(int), f);
    fwrite(b, n, sizeof(int), f);
 
    fclose(f);  //закрывает файл
 
    delete a;
    delete b;
 
}
 
int main()  //точка входа в программу
{
    int ipos,k,i;
 
    MakeFile();  //вызов функции, создание файла
 
    FILE* f= fopen(FileName, "rb");  //открывает файл для чтения в бинарном режиме
 
    fread(&m, 1, sizeof(int), f);  //читает файл  sizeof(int) - размер переменной типа int 
    fread(&n, 1, sizeof(int), f);
 
    a= new int[m];  //создает новый массив 
    b= new int[n];  //создает новый массив 
 
    fread(a, m, sizeof(int), f);
    fread(b, n, sizeof(int), f);
 
    fclose(f);  //закрывает файл
 
    // Ищем, с какой позиции массив a входит в массив b
 
    for (ipos=0;ipos<=(n-m);ipos++) // цикл по номеру позиции
    {
        k=0;                        // счетчик совпадений
        for (i=0;i<m;i++)
            if (a[i] != b[ipos+i])  // при первом расхождении
                break;              // выход из внутр. цикла - 
            else                    // увеличиваем ipos
                k++;                // увеличиваем счетчик совпадений
 
        if (k == m)                 // если совпадений ровно m - нашли!
        {
            printf("Position is %d\n",ipos); // печать
            break;                           // выход
        }
    }
 
    // если ни разу не было m совпадений
 
    if (k != m) printf("Position not found\n");
 
    delete a; // удаляем дин. массивы
    delete b;
 
    return 0;  //завершает программу
}
На твоих данных выдает 4, что совершенно верно.
0
-comrade-
355 / 356 / 42
Регистрация: 11.06.2010
Сообщений: 703
31.05.2012, 22:31 #7
Алгоритм Кнута - Морриса - Пратта
0
31.05.2012, 22:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2012, 22:31
Привет! Вот еще темы с ответами:

Рекурсивная функция нахождения наибол. элемента в массиве - C++
Нужно найти с помощью рекурсии наибольший элемент в массиве. Но код выдает ошибку Сам код: #include &lt;iostream&gt; using namespace...

исправить функцию нахождения гласных букв в массиве - C++
Помогите,пожалуйста, исправить функцию, которая суммирует вероятности нахождения букв в строке(строка массив типа char,слова разделены...

Функция нахождения минимального и максимального индекса в массиве - C++
Никак не получается составить функцию, в качестве параметра которой принимаются 3 одномерных массива целых чисел, и которая должна...

Класс vector (поля: координаты, 2 конструктора, метод нахождения длины вектора и метод вывода координат на экран) - C++
Здравствуйте , помогите пожалуйста с заданием. Организовать класс Вектор на плоскости – поля: координаты, 2 конструктора, метод...


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

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

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