Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 03.07.2016
Сообщений: 5

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

03.07.2016, 22:17. Показов 1278. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.07.2016, 22:17
Ответы с готовыми решениями:

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

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

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

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

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



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

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

Размышляя над тем, как это можно реализовать я пришел к следующему:
Есть начальные данные, которые вводятся пользователем (это А). В и С в данном случае это параметры, которые позволяют перейти от А к D. Напрямую перевести нельзя и потому нужны эти преобразования(из условия). Фактически введя некое значение А мы находим соответствующий этому А - В. А поскольку у нас параметры С и D могут быть в разброс, то необходимо еще определить и найти в какой строке находится подходящее С и сопоставить с соответствующему ей значению D.
0
 Аватар для Vort_
200 / 200 / 78
Регистрация: 10.07.2012
Сообщений: 409
05.07.2016, 08:08
В случае чисел больше 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  [ТС]
Благодарю Vort_, за Ваш ответ. Пытаясь осмыслить предложенный Вами вариант, я столкнулся с проблемой, что программа на все введенные значения ("A" и "D") выдает "Элемент не найден". А при введении "B" и "С" работает.

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

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

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

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

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

О переводе строки в число уже была мысль,но сложность в том, что там и числа и буквы вперемешку(
Миниатюры
Не выводит сортируемый массив до конца  
0
 Аватар для Vort_
200 / 200 / 78
Регистрация: 10.07.2012
Сообщений: 409
07.07.2016, 08:26
Лучший ответ Сообщение было отмечено 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  [ТС]
Спасибо огромное Vort_!!! Конечно как новичку мало что понятно, но тут уж буду работать и разбираться Еще раз спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.07.2016, 12:03
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru