0 / 0 / 0
Регистрация: 03.07.2016
Сообщений: 5
1

Не выводит сортируемый массив до конца

03.07.2016, 22:17. Показов 1030. Ответов 9
Метки нет (Все метки)

Здраваствуйте, столкнулся с проблемой сравнения значений массива(считываемого из файлов А,В,C,D). В данной программе необходимо ввести значение А, которое сравнивается с В, которое в свою очередь сравнивается с С и выводит соответствующее ему значение D. (сравниваются по сути только В и C. A - это вводной параметр,а D - результат...и наоборот). Проблема возникла именно на этапе сравнения значений А больше 10го элемента. Вместо значений, которые ранее выводились ничего не выводит. (использовал 20 элементов в каждом файле,а B и C файлы были просто цифры от 1 до 20(в В) и в обратном порядке в С).

Это мой первый код связанный с текстовыми данными, так что многое из того, что в нем применено было взято из разных мест(интернет, книги). И реально есть сомнения, что сам подход верен. Если не трудно, могли бы Вы подсказать где не прав, так как уже всю голову сломал и никак понять не могу почему так.
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 <iostream>
#include <conio.h>
#include <cstdio>
#include <fstream>
#include <locale>
#include <iomanip>
#include <stdio.h>
#include <string.h>
 
using namespace std;
 
int main(int argc, char* argv[])
{
    setlocale(LC_ALL,"rus");
 
    cout<<"\t\tПрограмма сортировки данных\n";
 
    char mass1[50],mass2[50],mass3[50],mass4[50]; // буфер промежуточного хранения считываемого из файла текста
    ifstream A("A.txt",ios_base::in); // открыли файл для чтения
    ifstream B("B.txt",ios_base::in);
    ifstream C("C.txt",ios_base::in);
    ifstream D("D.txt",ios_base::in);
 
    cout<<"\n"<<"\t"<<"Введите название элемента для поиска:\t";
    char mod[50],per1[50],per2[50],per3[50],per4[50];
    gets(mod);
    cout<<"\n"<<endl;
 
for (int i=0;i<2000;i++)
    {
    A.getline(mass1, 50); // считали строку из файла
    B.getline(mass2,50);
    C.getline(mass3,50);
    D.getline(mass4,50);
 
    if (strcmp(mod,mass2)==0)
        {
        strcpy(per1,mass1);
        }
    else
    if (strcmp (mod, mass3)==0)
        {
        strcpy(per2,mass4);
        cout<<"Коэф. преобразования:"<<"\t"<<mod<<"\n\nНачальное значение:"<<"\t"<<per1<<"\n\nПреобразованное значение:"<<"\t"<<per2<<endl;  \\Эта часть работает нормально, в отличии от следующей
        }
 
    if (strcmp (mod, mass1)==0)
        {
        strcpy(per3,mass2);}
    if (strcmp (per3, mass3)==0)
        {
        strcpy(per4,mass4);
        cout<<"\t"<<mod<<"\t"<<per3<<"\t"<<per4; \\Здесь не особо дописывал, так как еще исправляю это место
        }
 
    if (strcmp (mod, mass4)==0)
        {
        strcpy(per4,mass3);}
    if (strcmp (per4, mass2)==0)
        {
        strcpy(per3,mass1);
        cout<<"\t"<<mod<<"\t"<<per3<<"\t"<<per4; 
        }
    }
    getch();
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.07.2016, 22:17
Ответы с готовыми решениями:

Проблема не до конца выводит файл
Вот такая проблема не до сначала выводит файл, а его концовку вот код #include &lt;iostream&gt;...

Ввод числа,а компьютер выводит его с конца
Собственно дело обстоит так: мы вводим число(допустим 82) а нам должно будет вывести: 28 Вы уж...

Напишите программу, которая вводит строку и выводит ее, сокращая каждый раз на 1 символ с конца строки
Напишите программу, которая вводит строку и выводит ее, сокращая каждый раз на 1 символ с конца...

написать программу , которая выводит на экран последнее слово строки , вот начала программы, она удаляет все пробелы с конца
помогите написать программу , которая выводит на экран последнее слово строки , вот начала...

9
198 / 198 / 78
Регистрация: 10.07.2012
Сообщений: 405
04.07.2016, 17:25 2
Какая цель всех этих сравнений и копирований?
Что должно получиться в итоге?
0
0 / 0 / 0
Регистрация: 03.07.2016
Сообщений: 5
04.07.2016, 22:12  [ТС] 3
В итоге получим значения А и D(либо наоборот,при обратных действиях).

Цель - реализация самого перехода от А к D.



Изначально было дано задание в следующей (устной)форме:

Есть некий массив одних значений и других, но напрямую их связать можно только с помощью третьего массива, который по сути является переходом от одной системы к другой. (массивы A,B,C и D имеются в текстовой форме. В каждом 20 элементов)

Размышляя над тем, как это можно реализовать я пришел к следующему:
Есть начальные данные, которые вводятся пользователем (это А). В и С в данном случае это параметры, которые позволяют перейти от А к D. Напрямую перевести нельзя и потому нужны эти преобразования(из условия). Фактически введя некое значение А мы находим соответствующий этому А - В. А поскольку у нас параметры С и D могут быть в разброс, то необходимо еще определить и найти в какой строке находится подходящее С и сопоставить с соответствующему ей значению D.
0
198 / 198 / 78
Регистрация: 10.07.2012
Сообщений: 405
05.07.2016, 08:08 4
В случае чисел больше 10-ти, значение в третьем массиве находится раньше, чем во втором.
Поэтому, переменная per1 оказывается незаполненной.

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

Добавлено через 20 минут
Вот что получилось:
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
#include <iostream>
#include <algorithm>
#include <conio.h>
#include <cstdio>
#include <fstream>
#include <locale>
#include <iomanip>
#include <stdio.h>
#include <vector>
 
using namespace std;
 
vector<string> ReadFile(string name)
{
    string s;
    vector<string> result;
    ifstream fs(name, ios_base::in);
    while (getline(fs, s))
        result.push_back(s);
    return result;
}
 
int GetIndex(const vector<string>& arr, string val)
{
    vector<string>::const_iterator it = find(arr.begin(), arr.end(), val);
    if (it == arr.end())
        return -1;
    return distance(arr.begin(), it);
}
 
int main(int argc, char* argv[])
{
    setlocale(LC_ALL, "rus");
 
    cout << "\t\tПрограмма сортировки данных\n";
 
    vector<string> a = ReadFile("A.txt");
    vector<string> b = ReadFile("B.txt");
    vector<string> c = ReadFile("C.txt");
    vector<string> d = ReadFile("D.txt");
 
    cout << "\n" << "\t" << "Введите название элемента для поиска:\t";
    string searchElement;
    getline(cin, searchElement);
    cout << "\n" << endl;
 
    int indexB = GetIndex(b, searchElement);
    if (indexB == -1)
    {
        cout << "Элемент не найден" << endl;
        return -1;
    }
 
    cout <<
        "Коэф. преобразования:" << "\t" << searchElement <<
        "\n\nНачальное значение:" << "\t" << a[indexB] <<
        "\n\nПреобразованное значение:" << "\t" << c[indexB] << endl;
 
    getch();
    return 0;
}
1
0 / 0 / 0
Регистрация: 03.07.2016
Сообщений: 5
05.07.2016, 13:13  [ТС] 5
Благодарю Vort_, за Ваш ответ. Пытаясь осмыслить предложенный Вами вариант, я столкнулся с проблемой, что программа на все введенные значения ("A" и "D") выдает "Элемент не найден". А при введении "B" и "С" работает.

Ранее, до компиляции возникла проблема с 17й строкой(компилятор ругался на нее, но как я понял дело в самом компиляторе (gcc)) и я дописал "name" до такого вида "name.c_str()". После этого все запустилось,но результат стал именно такой, как был описан выше.
0
198 / 198 / 78
Регистрация: 10.07.2012
Сообщений: 405
05.07.2016, 13:43 6
Я пытался повторить результат исходной программы
Из того, что она ищет по второму массиву (if (strcmp(mod,mass2)==0)), сделал вывод, что именно это и задумывалось.
В итоге, переделал вот так:
1. Введенное значение (назовём его X) ищется в массиве B, в результате находится его индекс.
2. По индексу в массиве B выбираю элементы из массива A и C и вывожу их на экран.

Можно сделать и как-то по-другому.
Но надо бы для этого расписать алгоритм в терминах "поиска индекса по элементу" и "поиска элемента по индексу" - ведь именно это требуется, верно?

Добавлено через 4 минуты
Ещё подозреваю, что может потребоваться сделать перевод строки в число, это тоже можно реализовать при необходимости.
Насчёт gcc - всё верно, именно так и надо было исправить.
0
198 / 198 / 78
Регистрация: 10.07.2012
Сообщений: 405
05.07.2016, 13:57 7
Вот работа моей программы в виде схемы:
Миниатюры
Не выводит сортируемый массив до конца  
0
0 / 0 / 0
Регистрация: 03.07.2016
Сообщений: 5
06.07.2016, 22:12  [ТС] 8
Здравствуйте, Vort_

Да, алгоритм поиска значения по В именно такой, кроме одного момента...если В=Х,то и С должно быть равно Х(то есть если судить по картинке ответ должен быть: е(А) 5(В) 5(С) pp(D).

О поиске "индекса по элементу" и "элемента по индексу" думаю ставить вопрос с моей стороны было бы не совсем корректно,так как индекс элемента больше относится к его расположению в массиве и принадлежности к тому или иному формату(числовой или буквенный).Конечно могу быть неправ,но примерно такое представление имею.Тут же больше подходит "поиск по значению элемента". И логика примерно такая, как на картинке(в ней конкретный завал, так как В находится,но не сравнивается с С, хоть и заданы два по очереди условия IF и последовательность скобочек соблюдена), хотя поиск по B и C отдельно также имеет место.

О переводе строки в число уже была мысль,но сложность в том, что там и числа и буквы вперемешку(
Миниатюры
Не выводит сортируемый массив до конца  
0
198 / 198 / 78
Регистрация: 10.07.2012
Сообщений: 405
07.07.2016, 08:26 9
Лучший ответ Сообщение было отмечено troxer как решение

Решение

Если элементы массивов B и C являются вспомогательными параметрами, то зачем программа начинает с их поиска?
Это меня и сбило с толку.

В общем, сделал я вариант с A <-> D:
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 <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <algorithm>
#include <locale>
 
using namespace std;
 
vector<string> ReadFile(string name)
{
    string s;
    vector<string> result;
    ifstream fs(name.c_str(), ios_base::in);
    while (getline(fs, s))
        result.push_back(s);
    return result;
}
 
int GetIndex(const vector<string>& arr, string val)
{
    vector<string>::const_iterator it = find(arr.begin(), arr.end(), val);
    if (it == arr.end())
        return -1;
    return distance(arr.begin(), it);
}
 
int main(int argc, char* argv[])
{
    setlocale(LC_ALL, "rus");
 
    vector<string> a = ReadFile("A.txt");
    vector<string> b = ReadFile("B.txt");
    vector<string> c = ReadFile("C.txt");
    vector<string> d = ReadFile("D.txt");
 
    cout << "Введите X: ";
    string x;
    getline(cin, x);
 
    string r;
    int indexA = GetIndex(a, x);
    if (indexA != -1)
    {
        int indexC = GetIndex(c, b[indexA]);
        if (indexC != -1)
            r = d[indexC];
    }
    if (r.length() == 0)
    {
        int indexD = GetIndex(d, x);
        if (indexD != -1)
        {
            int indexB = GetIndex(b, c[indexD]);
            if (indexB != -1)
                r = a[indexB];
        }
    }
    if (r.length() == 0)
    {
        cout << "Ошибка" << endl;
        return -1;
    }
    cout << "Результат: " << r << endl;
    cin.ignore();
    return 0;
}
1
0 / 0 / 0
Регистрация: 03.07.2016
Сообщений: 5
07.07.2016, 12:03  [ТС] 10
Спасибо огромное Vort_!!! Конечно как новичку мало что понятно, но тут уж буду работать и разбираться Еще раз спасибо
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.07.2016, 12:03
Помогаю со студенческими работами здесь

Как массив перебирать с конца?
Нужно найти сумму последних пяти элементов массива меньших 5. Правильно ли я сделала? И как массив...

Как массив перебирать с конца?
Простой цикл for(i=0;i&lt;n;i++) начинает перебирать массив с первого элемента по последний а как...

Считывание до конца потока в числовой массив
Здравствуйте. Проблема с Как реализовать считывание до конца потока из файла вместе со scanf()...

Новичёк в ступоре, вывести массив с конца
Помогите пожалуйста новичку с массивами, только 2ой день на C++ Необходимо вывести элементы...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru