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

Считать число из файла, разбить его на цифры и заменить значения некоторых цифр на противоположное

03.02.2020, 12:53. Показов 1087. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите написать программу. Нужно считать число из текстового файла и разбить его на несколько одинарных массивов по n (n выбирается пользователем) цифр и заменить в каждом массиве несколько цифр на противоположные (количество чисел также выбирается пользователем). После того как цифры заменены, записать их в числовом виде в другом файле. Например в текстовом файле записано число 12345678901234567890. Пользователь вводит, что n равно 5, а количество чисел для замены 2. получившиеся массивы должны быть примерно такие {1, 2, 3, -4, -5}{6,-7,-8,9,0}{-1,-2,3,4,5}{6,7,8,-9,0}. А запись в файле должна быть в виде 123-4-56-7-890-1-2345678-90. Заранее благодарю.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.02.2020, 12:53
Ответы с готовыми решениями:

Заданное число заменить на число, которое получается из исходного значения записью его цифр в обратном порядке
В подпрограммах не должно присутствовать ввода исходных данных (например, с помощью Readln) и...

Как считать определённое количество цифр заданного числа (считать число до заданной цифры)?
как считать число 12345 до символа 5? То есть 1234 присвоить другой переменной?.:wall:

Ввести число n, разбить число на цифры, и найти сумму этих цифр
Здравствуйте.Очень нужно сделать задание, кто может? Заранее спасибо!!! Ввести число n, разбить...

Разбить число на цифры и посчитать количество цифр, равных 3 (цикл while)
сделать с помощью цикла while() разбить число на разряды посчитать количество цифр 3 среди...

4
Модератор
2639 / 1751 / 920
Регистрация: 16.10.2013
Сообщений: 5,067
Записей в блоге: 14
03.02.2020, 13:01 2
igordmitriev111, каким образом определять номера цифр для замены на противоположные ?
0
0 / 0 / 0
Регистрация: 03.02.2020
Сообщений: 10
03.02.2020, 13:03  [ТС] 3
номера цифр определяются случайно
0
Модератор
2639 / 1751 / 920
Регистрация: 16.10.2013
Сообщений: 5,067
Записей в блоге: 14
06.02.2020, 11:16 4
igordmitriev111, в данной задаче есть острые углы, которые могут сломать правильность работы. Чтобы программа, которую я скину ниже работала корректно, учитывайте следующее:
  • n должно быть больше или равно количеству цифр для замены k (например, 5 и 2, как в вашем примере);
  • если последняя подгруппа цифр в файле оказалась по количеству меньше чем кол-во цифр для замены k, то данная подгруппа записывается в файл без модификаций;
  • параметры n и k задал вручную. Если понадобится пользовательский ввод - переделаете, там нетрудно.

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
#include <iostream>
#include <ctime>
#include <fstream>
#include <vector>
using namespace std;
 
bool unique(int x, int* arr, int size) {
    for(int i = 0; i < size; i++) {
        if(x == arr[i]) return false;
    }
    return true;
}
 
int *numbers(int n, int k) {
    int *result = new int[k];
    int x;
    result[0] = rand() % n;
    for(int i = 1; i < k; i++) {
        do {
            x = rand() % n;
        } while(!unique(x, result, i));
        result[i] = x;
    }
    return result;
}
 
int main() {
    srand(time(NULL));
    ifstream fin("in.txt");
    ofstream fout("out.txt");
    vector <vector <int> > vv;
    vector <int> v;
    char c;
    int n = 5, k = 2, num, cnt = 0;
    int *x = new int[k];
    
    if(fin.is_open() && fout.is_open()) {
        while(fin.get(c)) {
            num = c - '0';
            v.push_back(num);
            if(cnt < n - 1) {
                ++cnt;
            } else {
                cnt = 0;
                x = numbers(n, k);
                for(int i = 0; i < k; i++) {
                    v[x[i]] = -v[x[i]];
                }
                vv.push_back(v);
                v.clear();
            }
        }
        fin.close();
        if(!v.empty()){
            if(v.size() >= k) {
                x = numbers(v.size(), k);
                for(int i = 0; i < k; i++) {
                    v[x[i]] = -v[x[i]];
                }
            }
            vv.push_back(v);
        }
        for(vector <int> vec : vv) {
            for(int number : vec) {
                fout << number;
            }
        }
        fout.close();
    } else {
        cerr << "failed to open files";
    }
    delete[] x;
    return 0;
}
входной файл: 12345678901234567890123
выходной файл: 1-234-5-67890123-4-5-67-890-1-23
0
515 / 407 / 188
Регистрация: 08.04.2013
Сообщений: 1,739
06.02.2020, 22:07 5
для случая когда все числа в файле положительные, без доп проверок на совпадение r1 и r2, без массива
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
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int main() {
    
  setlocale(LC_ALL, "Rus");   
    
  ifstream fin("in.txt", ios::in  | ios::ate  );//ios::ate    при открытии переместить указатель в конец файла
  ofstream fout("out.txt", ios::out);
  if (!fin) { cout << " Ошибка открытия файла! " << endl; return 1; }
  long len = fin.tellg();  // узнаем длину по положению указателя
 
  char *buf = new char [len + 1];
  fin.seekg(0, ios::beg); // на начало файла
  fin.read(buf,len);
  buf[len]='\0';
  long n = 0, i = 0, j = 0;   
  long m ; //будем делить на блоки по                                
  
  cout <<"Разбить на блоки по " ;
  cin >> m;
    
    int y = 0;                              
    while (buf[i]) {
           
        if(i%m==0 && i>0) {
            string str1="";
            int r1= rand()%m;
            int r2= rand()%m;
           
            for (j = n,y =0; j < i; ++j,++y)
            {
                if (y==r1 || y==r2) str1+='-';
                str1+=buf[j];
            }
            cout << str1;
            fout << str1;
            n = i ;  cout << endl;
         }
         ++i;
    }
    
    fin.close();
    fout.close();
    delete buf; 
 // getchar();
  return 0;
}
Добавлено через 14 минут
есть недостаток, обрезает конец буфера , надо доработать условия

Добавлено через 1 час 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
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
int main() {
    
  setlocale(LC_ALL, "Rus");   
  srand(time(0));   
  ifstream fin("in.txt", ios::in  | ios::ate  );//ios::ate    при открытии переместить указатель в конец файла
  ofstream fout("out.txt", ios::out);
  if (!fin) { cout << " Ошибка открытия файла! " << endl; return 1; }
  long len = fin.tellg();  // узнаем длину по положению указателя
 
  char *buf = new char [len + 1];
  fin.seekg(0, ios::beg); // на начало файла
  fin.read(buf,len);
  buf[len]='\0';
  long n = 0, i = 1, j = 0;   
  long m ; //будем делить на блоки по                                
  
  cout <<"Разбить на блоки по " ;
  cin >> m;
    int y = 0;                              
    while (buf[i-1]) {
           
        if(i%m==0) {
            string str1="";
            int r1= rand()%m;
            int r2= rand()%m;
 
            for (j = n,y =0; j < i; ++j,++y)
            {
                if (y==r1 || y==r2) str1+='-';
                str1+=buf[j];
               // fout <<buf[j];     //cout << buf[j];
            }
            cout << str1;
            fout << str1;
            n = i ;  cout << endl;
         }
         ++i;
    }
    string strOst="";
    if (len%m) for (j = n; j < len; ++j)
    {
        strOst+=buf[j];
    }
    cout << strOst;
    fout << strOst; // выводим остаток без обработки
    fin.close();
    fout.close();
    delete buf; 
 // getchar();
  return 0;
}
0
06.02.2020, 22:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.02.2020, 22:07
Помогаю со студенческими работами здесь

Разбить число n на цифры и напечатать их в столбик. Вычислить сумму последних m цифр
Составьте программу, которая разбивает число n на цифры и печатает их в столбик. Получить сумму m...

Считать текст из файла и заменить цифры на слова
Помогите пожалуйста, не понимаю как сделать: Написать программу, которая считывает текст из файла...

. Игрок А объявляет двузначное число от 01 до 99. Игрок В меняет местами его цифры и прибавляет полученное число к сумме его цифр. Полученный результа
. Игрок А объявляет двузначное число от 01 до 99. Игрок В меняет местами его цифры и прибавляет...

Заменить данное натуральное число на число, которое получается из исходного записью его цифр в обратном порядке. Например, дано число 156, нужно получ
Вобщем,если не сложно,именно саму функцию помочь написать,ибо я просто не могу понять:) ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru