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

Как из файла считать коэффициенты квадратного уравнения?

28.06.2017, 12:12. Показов 5494. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача такая:
В файле записано квадратное уравнение вида 5*x^2+6*x-8=0(коэффициенты могут быть любыми).
Необходимо считать из файла коэффициенты a=5, b=6 и c=-8, написать функцию для решения данного квадратного уравнения.
Функцию для решения уравнения я написал, а вот с чтением коэффициентов из файла у меня проблемы. Вот мой код:
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
#include<iostream>
#include<string>
#include<fstream>
#include<cmath>
using namespace std;
void Equation(double a, double b, double c)
{
    double x1 = 0;
    double x2 = 0;
    double D = 0;
    D = pow(b,2) - 4 * a * c;
    if (D < 0)
    {
        cout << "The equation has no roots " << endl;
    }
    else if (D == 0)
    {
        x1 = -b / (2 * a);
        cout << "The equation has one root: " << x1 << endl;
    }
    else if (D > 0)
    {
        x1 = (-b + sqrt(D)) / 2 * a;
        x2 = (-b - sqrt(D)) / 2 * a;
        cout << "The equation has two different roots: x1 = " << x1 <<", x2 = "<<x2<< endl;
    }
}
int main()
{
    double a = 0;
    double b = 0;
    double c = 0;
 
    system("pause");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.06.2017, 12:12
Ответы с готовыми решениями:

Как вписать в формулу квадратного уравнения вводимые коэффициенты
Помогите пожалуйста решить проблему и вписать в формулу квадратного уравнения вводимые коэффициенты...

Коэффициенты квадратного уравнения
Здравствуйте еще раз. Опять мой 29 вариант. Это задание я решил и неоднократно проверил, но ответ...

Вычислить коэффициенты квадратного уравнения
int main() { double x1, x2; double p, q; printf(&quot;Enter 2 number x1, x2,:\n&quot;); ...

Вычислить коэффициенты квадратного уравнения
Задаем уравнение в строковом формате (типа: 2*x+3*x*x+1=0) как вычислить коэффициенты?

23
7790 / 6557 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
28.06.2017, 12:23 2
В чём проблема-то? Числа считываешь, символы пропускаешь.
0
0 / 0 / 0
Регистрация: 24.06.2017
Сообщений: 6
28.06.2017, 12:39  [ТС] 3
Я тогда считаю и степень x, хотя она мне не нужна. К тому же если я буду пропускать символы, как я узнаю знак числа. И вообще как распределить потом эти числа на a, b и c. Вдруг коэффициент a состоит не из одной цифры, а из 2,3 и т.д.?
0
12 / 12 / 10
Регистрация: 04.06.2017
Сообщений: 99
28.06.2017, 12:40 4
NoLife, нужно подключить библиотеки
C++
1
2
#include <fstream>
#include <vector>
Вот код:
C++
1
2
3
4
5
6
7
8
9
    std::vector<int> num;
    char buff;
    
    std::ifstream input("input.txt");
    while(!input.eof()){
        input.get(buff);
        if(isdigit(buff)) num.push_back(buff-'0');
    }
    input.close();
Функция isdigit как раз и проверяет является ли аргумент десятичной цифрой. buff-'0' такая запись, для того чтобы корректно преобразовывало char в int (посмотри таблицу ASCII).
0
7790 / 6557 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
28.06.2017, 13:13 5
savenkodenys, да зачем? Обычный ввод числа остановится на посторонних символах.
C++
1
2
3
double a, b, c;
char ch;
input >> a >> ch >> ch >> ch >> ch >> b >> ch >> ch >> c;
Или можно ignore(), если пробелов точно нет.
0
12 / 12 / 10
Регистрация: 04.06.2017
Сообщений: 99
29.06.2017, 13:49 6
nmcf, твой вариант не совсем подходит
Цитата Сообщение от NoLife Посмотреть сообщение
Вдруг коэффициент a состоит не из одной цифры, а из 2,3 и т.д.?
0
7790 / 6557 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
29.06.2017, 20:32 7
Да хоть из пяти, если запись для double корректна.
0
823 / 626 / 321
Регистрация: 24.02.2017
Сообщений: 2,209
29.06.2017, 20:58 8
считываем строку из файла и далее
C++
1
2
3
4
5
6
7
8
char *p;
 
  p = strtok("5*x^2+6*x-8=0", "*x^2=0");
  cout<<p<<"\n";
  do {
    p = strtok('\0', "*x^2=0");
    if(p)  cout<<p<<"\n";
  } while(p);
0
7790 / 6557 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
30.06.2017, 08:51 9
повар1, а если ноль или два будут в одном из коэффициентов?
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
30.06.2017, 09:29 10
Цитата Сообщение от NoLife Посмотреть сообщение
Функцию для решения уравнения я написал, а вот с чтением коэффициентов из файла у меня проблемы.
Предупреждая вопрос "а на плюсах как?" - с бубном. В файловые потоки такие фокусы не завезли.
C++
1
2
3
4
5
6
7
8
9
10
11
#include<cstdio>
#include<iostream>
 
int main()
{
    FILE*file=fopen("test.txt","r");
    int a,b,c;
    fscanf(file,"%d*x^2%d*x%d=0",&a,&b,&c);
    std::cout<<a<<" "<<b<<" "<<c<<std::endl;
    return 0;
}
1
823 / 626 / 321
Регистрация: 24.02.2017
Сообщений: 2,209
30.06.2017, 16:56 11
nmcf, это был один из вариантов как можно сделать на strtok. А это еще один вариант с учетом твоих замечаний.

C++
1
2
3
4
5
6
7
8
9
10
char *p,s[]="5*x^2+6*x-8=0";
 int a,b,c;
  p = strtok(s, "*");
  a=atoi(p);
  p = strtok('\0', "2");
  p = strtok('\0', "x^*");
  b=atoi(p);
  p = strtok('\0', "x=");
  c=atoi(p);
  cout<<a<<"\n"<<b<<"\n"<<c<<"\n";
0
7790 / 6557 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
30.06.2017, 16:59 12
Я уже показал, как надо делать - в одну строку.

Добавлено через 1 минуту
Цитата Сообщение от Renji Посмотреть сообщение
Предупреждая вопрос "а на плюсах как?" - с бубном. В файловые потоки такие фокусы не завезли.
Но завезли regex.
0
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
30.06.2017, 22:04 13
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
#include <iostream>
#include <sstream>
#include <string>
#include <regex>
 
int main()
{
    double a, b, c;
    std::string s = "-14.03x^2+42x-5.962";
    std::regex r("\\s*([+-]{0,1})\\s*([0-9.]*)x\\^2\\s*([+-])\\s*([0-9.]*)x\\s*([+-])\\s*([0-9.]+)\\s*");
    std::smatch sm;
    
    if (std::regex_match(s, sm, r))
    {
        std::stringstream iss;
        if (sm[2].length() == 0) iss << sm[1] << "1 ";
        else iss << sm[1] << sm[2] << ' ';
        if (sm[4].length() == 0) iss << sm[3] << "1 ";
        else iss << sm[3] << sm[4] << ' ';
        iss << sm[5] << sm[6];
        iss >> a >> b >> c;
    }
    
    std::cout << "a, b, c: " << a << ", " << b << ", " << c << std::endl;
    
    return 0;
}
Добавлено через 2 минуты
если не ошибся то должно работать
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
01.07.2017, 03:43 14
Цитата Сообщение от nmcf Посмотреть сообщение
Но завезли regex.
Плюсовый regex не умеет помещать результат сразу в int. Файловый поток опять-же не умеет кушать эти регексы. А уж сколько весит алгоритм перевода регулярки в недетерминированный конечный автомат лучше и вовсе не задумываться. Я и говорю, "с бубном".
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
01.07.2017, 08:21 15
Цитата Сообщение от Renji Посмотреть сообщение
Плюсовый regex не умеет помещать результат сразу в int. Файловый поток опять-же не умеет кушать эти регексы.
Можно пример, где все это есть?
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
01.07.2017, 08:51 16
Цитата Сообщение от 0x10 Посмотреть сообщение
Можно пример, где все это есть?
fscanf из десятого поста же. Читает текст из файла, прям на месте прогоняет через шаблон и переводит захваченный шаблоном текст в int-ы или что там вам надо. Правда, язык шаблонов при этом значительно примитивней чем в классических регулярках.
1
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
01.07.2017, 14:33 17
Цитата Сообщение от Renji Посмотреть сообщение
Файловый поток
что мешает поместить содержимое в стрингу? А там уже строковые потоки помогут
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
01.07.2017, 17:02 18
Цитата Сообщение от zarko97 Посмотреть сообщение
что мешает поместить содержимое в стрингу? А там уже строковые потоки помогут
Ага, потоки непременно помогут.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    //раньше я парсил строки обычным sscanf в одну строчку
    char str[]="5*x^2+6*x-8=0";
    sscanf(str,"%d*x^2%d*x%d=0",&a,&b,&c);
    std::cout<<a<<" "<<b<<" "<<c<<std::endl;
 
    //но однажды я открыл для себя строковые потоки! Теперь все стало кратко, просто и понятно!
    char buf[16];
    std::stringstream stream(str);
    stream>>a;
    stream.get(buf,5);//get читающий в string? Не, не слышал
    if(strcmp(buf,"*x^2"))
        return 1;
    stream>>b;
    stream.get(buf,3);
    if(strcmp(buf,"*x"))
        return 1;
    stream>>c;
    std::cout<<a<<" "<<b<<" "<<c<<std::endl;
0
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
01.07.2017, 17:43 19
Renji, речь о плюсах шла
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
01.07.2017, 17:51 20
Цитата Сообщение от zarko97 Посмотреть сообщение
Renji, речь о плюсах шла
Так и я про плюсы. А точнее про то что нормального аналога scanf там нет. Или я что-то пропустил и потоки все же дают записать решение задачи в одну строчку?
0
01.07.2017, 17:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.07.2017, 17:51
Помогаю со студенческими работами здесь

Сгенерировать случайным образом коэффициенты квадратного уравнения
Всем привет. Задание звучит так: &quot;Сгенерировать случайным образом из диапазона от -3 до 3...

Вычислить коэффициенты приведенного квадратного уравнения с заданными корнями.
для двух заданных вещественных чисел вычислить и вывести на экран коэффициенты приведенного...

коэффициенты квадратного уравнения, корнями которого являются эти числа.
10. Введите два вещественных числа. Напечатайте коэффициенты квадратного уравнения, корнями...

Найти корни квадратного уравнения. Коэффициенты АВС вводятся с клавиатуры
Найти корни квадратного уравнения. Коэффициенты АВС вводятся с клавиатуры и могут быть дробными...


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

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