Форум программистов, компьютерный форум CyberForum.ru

Правильно ли я написал? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
jafrey kerns
5 / 5 / 0
Регистрация: 12.08.2011
Сообщений: 24
12.08.2011, 12:01     Правильно ли я написал? #1
Начал изучать С++. Книга "Язык программирования С++. Лекции и упражнения". Хочется узнать насколько правильно я пишу код. Вот два первых задания:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <locale>
 
double astrUnits (double);
 
int main()
{
    setlocale(LC_ALL,"Rus");
 
    double lYears;
 
    std::cout << "Введите количество световых лет: ";
    std::cin >> lYears;
    std::cout << lYears << " световых лет " << astrUnits(lYears) << " астрономических единиц\n";
 
    std::cin.get();
    std::cin.get();
 
    return 0;


второе:

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
// 1_2011.cpp: главный файл проекта.
 
 
#include <iostream>
#include <locale>
//using namespace System;
 
double fahrenheit(double);
 
int main()
{
    setlocale(LC_ALL,"Rus");
 
    double cels;
    std::cout << "Введите температуру в градусах Цельсия: ";
    std::cin >> cels;
 
    double fahr = fahrenheit(cels);
 
    std::cout << cels << " градусов Цельсия равно " << fahr <<" градусов Фаренгейта \n";
    std::cin.get();
    std::cin.get();
}
 
double fahrenheit(double tempcels)
{
    double fahr = 1.80*tempcels+32.0;
    return fahr;
}
 Комментарий модератора 
Используйте теги форматирования кода!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
co6ak
Кошковед
 Аватар для co6ak
402 / 495 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
12.08.2011, 12:05     Правильно ли я написал? #2
код списанный с книги... комментировать... ну хз
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
12.08.2011, 12:06     Правильно ли я написал? #3
Цитата Сообщение от jafrey kerns Посмотреть сообщение
Начал изучать С++. Книга "Язык программирования С++. Лекции и упражнения". Хочется узнать насколько правильно я пишу код. Вот два первых задания:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <locale>
 
double astrUnits (double);
 
int main()
{
    setlocale(LC_ALL,"Rus");
 
    double lYears;
 
    std::cout << "Введите количество световых лет: ";
    std::cin >> lYears;
    std::cout << lYears << " световых лет " << astrUnits(lYears) << " астрономических единиц\n";
 
    std::cin.get();
    std::cin.get();
 
    return 0;
}
второе:

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
// 1_2011.cpp: главный файл проекта.
 
 
#include <iostream>
#include <locale>
//using namespace System;
 
double fahrenheit(double);
 
int main()
{
    setlocale(LC_ALL,"Rus");
 
    double cels;
    std::cout << "Введите температуру в градусах Цельсия: ";
    std::cin >> cels;
 
    double fahr = fahrenheit(cels);
 
    std::cout << cels << " градусов Цельсия равно " << fahr <<" градусов Фаренгейта \n";
    std::cin.get();
    std::cin.get();
}
 
double fahrenheit(double tempcels)
{
    double fahr = 1.80*tempcels+32.0;
    return fahr;
}
В первом файле не видать функции, которая вычисляет астрономические единицы.
jafrey kerns
5 / 5 / 0
Регистрация: 12.08.2011
Сообщений: 24
13.08.2011, 00:29  [ТС]     Правильно ли я написал? #4
Цитата Сообщение от co6ak Посмотреть сообщение
код списанный с книги... комментировать... ну хз
Код писал сам, видел в какой-то книге похожие коды, но там было без использования функций.


Цитата Сообщение от ValeryLaptev Посмотреть сообщение
D первом файле не видать функции, которая вычисляет астрономические единицы.
Случайно скопировал не весь код, вот продолжение:

C++
1
2
3
4
5
double astrUnits(double lightYears)
{
    double aUnits = lightYears*63240;
    return aUnits;
}
Добавлено через 12 часов 17 минут
Закончил еще один пример, надеюсь не скажут, что из книги. На работе часто приходится подбирать резисторы при отсутствии нужного номинала, решил доверить компу. Хотелось бы прочитать конструктивную критику.

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
// Проверка наличия на складе резисторов нужного номинала и расчет замены параллельным соединением
 
#include <iostream>
#include <locale>
#include <cmath>
 
//using namespace std;
//double parResistor(double, double);      // объявление функции вычисления необходимого номинала
 
//double R1;
 
int main ()
{
    setlocale(LC_ALL,"Rus");
 
    double R1;
    std::cout << "Введите необходимый номинал резистора в кОм(xx.xx): \n";
    std::cin >> R1;
 
    double tablRes[52] = {13, 13.3, 14, 14.7, 15, 15.4, 16, 16.5, 20, 22, 24,      //объявление и инициализация массива резисторов
                          27, 30, 31, 33, 33.2, 36, 39, 39.2, 40.2, 47, 48.7,
                          51, 56, 62, 63.4, 75, 82, 91, 100, 118, 120, 150,
                          180, 200, 220, 240, 270, 300, 316, 324, 330, 360,
                          390, 432, 470, 510, 620, 680, 750, 787, 1000};
 
    int i;                                                                                                      // объявление счетчика номиналов
    i = 0;
    for (i=0; i < 52; i++)                                                                                 // проверка наличия резисторов на складе
    {
        double dopusk = fabs(R1-tablRes[i]);
        if (dopusk <= 0.1)
            std::cout << "Номинал " << tablRes[i] << " имеется на складе!\n";  
    }
 
    std::cout << "Для получения необходимого результата\n"        
                  << "можно взять параллельное соединение:\n\n  ";
 
    int a,b;                                                                                                   // расчет необходимых номиналов,
    double r1, r2, dop;                                                                                  // для параллельного соединения из
    for (a=0; a<10; a++)                                                                               // того, что есть в наличии
    {
        for (b=51; b>10; b--)
        {
             r1 = tablRes[a];
             r2 = tablRes[b];
            double pres = fabs((r1*r2)/(r1+r2));
            dop = fabs(R1-pres);
            if (dop < 0.05)
                std::cout << "   " << r1 << "  и  " << r2 << "\n\n\n";                    // вывод на экран всех вариантов
        }   
    }
 
    std::cin.get();
    std::cin.get();
    return 0;
}
SDmaN
54 / 51 / 2
Регистрация: 22.07.2011
Сообщений: 436
13.08.2011, 00:57     Правильно ли я написал? #5
Я вроде ошибок не нашёл. но код можно слегка упростить. Там где идёт проверка наличия резисторов не обязательно 2 раза присваивать значение 0 переменной i, достаточно сделать так:
C++
1
for(int i = 0; i < 52; i++)
Не особо важно для сегодняшних процессоров, однако.

Функцию fabs использовать не обязательно, но если вам так удобнее, то пожалуйста.
Зачем в конце 2 раза std::cin.get()? Достаточно 1, а лучше перед return 0 вписать system("PAUSE"), так понятнее на мой взгляд.
jafrey kerns
5 / 5 / 0
Регистрация: 12.08.2011
Сообщений: 24
13.08.2011, 01:19  [ТС]     Правильно ли я написал? #6
Спасибо. Присваивание переменной i исправлю, без функции fabs при проверке наличия мне выводит на экран все номиналы больше нужного, так как после вычитания получаются отрицательные числа, а они по определению < 0.1. До system("PAUSE") я еще не добрался в процессе обучения, но поищу и почитаю.
Сыроежка
Заблокирован
13.08.2011, 04:21     Правильно ли я написал? #7
Цитата Сообщение от jafrey kerns Посмотреть сообщение
Код писал сам, видел в какой-то книге похожие коды, но там было без использования функций.



Случайно скопировал не весь код, вот продолжение:

C++
1
2
3
4
5
double astrUnits(double lightYears)
{
    double aUnits = lightYears*63240;
    return aUnits;
}
Добавлено через 12 часов 17 минут
Закончил еще один пример, надеюсь не скажут, что из книги. На работе часто приходится подбирать резисторы при отсутствии нужного номинала, решил доверить компу. Хотелось бы прочитать конструктивную критику.

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
// Проверка наличия на складе резисторов нужного номинала и расчет замены параллельным соединением
 
#include <iostream>
#include <locale>
#include <cmath>
 
//using namespace std;
//double parResistor(double, double);      // объявление функции вычисления необходимого номинала
 
//double R1;
 
int main ()
{
    setlocale(LC_ALL,"Rus");
 
    double R1;
    std::cout << "Введите необходимый номинал резистора в кОм(xx.xx): \n";
    std::cin >> R1;
 
    double tablRes[52] = {13, 13.3, 14, 14.7, 15, 15.4, 16, 16.5, 20, 22, 24,      //объявление и инициализация массива резисторов
                          27, 30, 31, 33, 33.2, 36, 39, 39.2, 40.2, 47, 48.7,
                          51, 56, 62, 63.4, 75, 82, 91, 100, 118, 120, 150,
                          180, 200, 220, 240, 270, 300, 316, 324, 330, 360,
                          390, 432, 470, 510, 620, 680, 750, 787, 1000};
 
    int i;                                                                                                      // объявление счетчика номиналов
    i = 0;
    for (i=0; i < 52; i++)                                                                                 // проверка наличия резисторов на складе
    {
        double dopusk = fabs(R1-tablRes[i]);
        if (dopusk <= 0.1)
            std::cout << "Номинал " << tablRes[i] << " имеется на складе!\n";  
    }
 
    std::cout << "Для получения необходимого результата\n"        
                  << "можно взять параллельное соединение:\n\n  ";
 
    int a,b;                                                                                                   // расчет необходимых номиналов,
    double r1, r2, dop;                                                                                  // для параллельного соединения из
    for (a=0; a<10; a++)                                                                               // того, что есть в наличии
    {
        for (b=51; b>10; b--)
        {
             r1 = tablRes[a];
             r2 = tablRes[b];
            double pres = fabs((r1*r2)/(r1+r2));
            dop = fabs(R1-pres);
            if (dop < 0.05)
                std::cout << "   " << r1 << "  и  " << r2 << "\n\n\n";                    // вывод на экран всех вариантов
        }   
    }
 
    std::cin.get();
    std::cin.get();
    return 0;
}
Первое правило: переменные должны быть локализованы там, где они используются. В противном случае у читающего код возникает вопрос: а почему переменные продолжают существовать? Может быть они еще где-то дальше используются?

Это я имею в виду ваши переменные типа int i, a, b, а аткже переменные типа double r1, r2, dop.

Затем для читающего ваш код совершено непонятны магические константы 52 и 10. Что они означают? Ваш возраст? Поэтому желательно для таких констант определить содержательные имена либо с помощью команды препроцессора #define, либо как константы.

Кроме того название переменных a и b могли бы быть более содержательными, так как совершенно непонятно, что они ознрачают.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.08.2011, 06:09     Правильно ли я написал? #8
Цитата Сообщение от SDmaN
Зачем в конце 2 раза std::cin.get()? Достаточно 1, а лучше перед return 0 вписать system("PAUSE"), так понятнее на мой взгляд.
1) cin.get() пишется два раза, потому что когда он ввёл значение, то после этого он нажал <return>, который остался в потоке
2) cin.get() не требует запуска внешней программы, подключения cstdlib и является переносимым способом
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
13.08.2011, 11:42     Правильно ли я написал? #9
А лучше запускать приложения из консоли, ага
jafrey kerns
5 / 5 / 0
Регистрация: 12.08.2011
Сообщений: 24
14.08.2011, 19:22  [ТС]     Правильно ли я написал? #10
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
// Проверка наличия на складе резисторов нужного номинала и расчет замены параллельным соединением
 
#include <iostream>
#include <locale>
#include <cmath>
 
int parResistor();                                                                                          // объявление функции вычисления необходимого номинала
 
int main ()
{
    setlocale(LC_ALL,"Rus");
 
    double R1;
    std::cout << "Введите необходимый номинал резистора в кОм(xx.xx): \n";
    std::cin >> R1;
 
    double tablRes[52] = {13, 13.3, 14, 14.7, 15, 15.4, 16, 16.5, 20, 22, 24,      //объявление и инициализация массива резисторов
                          27, 30, 31, 33, 33.2, 36, 39, 39.2, 40.2, 47, 48.7,
                          51, 56, 62, 63.4, 75, 82, 91, 100, 118, 120, 150,
                          180, 200, 220, 240, 270, 300, 316, 324, 330, 360,
                          390, 432, 470, 510, 620, 680, 750, 787, 1000};
 
    for (int i=0; i < 52; i++)                                                                                 // проверка наличия резисторов на складе
    {
        double dopusk = fabs(R1-tablRes[i]);
        if (dopusk <= 0.1)
            std::cout << "Номинал " << tablRes[i] << " имеется на складе!\n";  
    }
 
    std::cout << "Для получения необходимого результата\n"        
                  << "можно взять параллельное соединение:\n\n  ";
 
    
    for (int a=0; a<10; a++)                                                                              // расчет необходимых номиналов, 
    {                                                                                                              // для параллельного соединения из
        for (int b=51; b>10; b--)                                                                         // того, что есть в наличии
        {                                                                                                        
            double r1 = tablRes[a];
            double r2 = tablRes[b];
            double pres = fabs((r1*r2)/(r1+r2));
            double dop = fabs(R1-pres);
            if (dop < 0.05)
                std::cout << "   " << r1 << "  и  " << r2 << "\n\n\n";                    // вывод на экран всех вариантов
        }   
    }
    
 
    system ("PAUSE");
    return 0;
}
Можно ли сделать так, чтобы программа не закрывалась после окончания рассчетов, а давала возможность провести новый расчет. Например:
C++
1
2
3
4
5
6
std::cout << "Вы хотите продолжить? ( y/n) \n";
std::cin >> vibor;
if (vibor == y)
        //начать расчет заново;
else 
       //завершить программу
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.08.2011, 19:42     Правильно ли я написал? #11
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 <locale>
#include <cmath>
 
#include <conio.h> // для getch()
 
int parResistor();                                                                                          // объявление функции вычисления необходимого номинала
 
int main ()
{
        setlocale(LC_ALL,"Rus");
 
        while( 1 ) // бесконечный цикл
        {
            double R1;
            std::cout << "Введите необходимый номинал резистора в кОм(xx.xx): \n";
            std::cin >> R1;
 
            double tablRes[52] = {13, 13.3, 14, 14.7, 15, 15.4, 16, 16.5, 20, 22, 24,      //объявление и инициализация массива резисторов
                                      27, 30, 31, 33, 33.2, 36, 39, 39.2, 40.2, 47, 48.7,
                                                      51, 56, 62, 63.4, 75, 82, 91, 100, 118, 120, 150,
                                                      180, 200, 220, 240, 270, 300, 316, 324, 330, 360,
                                                      390, 432, 470, 510, 620, 680, 750, 787, 1000};
 
            for (int i=0; i < 52; i++)                                                                                 // проверка наличия резисторов на складе
            {
                    double dopusk = fabs(R1-tablRes[i]);
                    if (dopusk <= 0.1)
                            std::cout << "Номинал " << tablRes[i] << " имеется на складе!\n";
            }
 
            std::cout << "Для получения необходимого результата\n"
                                      << "можно взять параллельное соединение:\n\n  ";
 
 
            for (int a=0; a<10; a++)                                                                              // расчет необходимых номиналов,
            {                                                                                                              // для параллельного соединения из
                    for (int b=51; b>10; b--)                                                                         // того, что есть в наличии
                    {
                            double r1 = tablRes[a];
                        double r2 = tablRes[b];
                            double pres = fabs((r1*r2)/(r1+r2));
                            double dop = fabs(R1-pres);
                        if (dop < 0.05)
                                std::cout << "   " << r1 << "  и  " << r2 << "\n\n\n";                    // вывод на экран всех вариантов
                    }
            }
 
            std::cout << "Нажмите любую клавишу для повтора, или ESC для выхода" << endl;
 
            if( getch() == 0x1B ) // 0x1B - сканкод ESC
               break; // выход из цикла
        }
 
        system ("PAUSE");
        return 0;
}
Добавлено через 44 секунды
Выполняете основной код в бесконечном цикле, в конце проверяете нажатую клавишу, и, если это Escape (0x1B), то выходите из цикла инструкцией break
Сыроежка
Заблокирован
14.08.2011, 19:49     Правильно ли я написал? #12
Цитата Сообщение от talis Посмотреть сообщение
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 <locale>
#include <cmath>
 
#include <conio.h> // для getch()
 
int parResistor();                                                                                          // объявление функции вычисления необходимого номинала
 
int main ()
{
        setlocale(LC_ALL,"Rus");
 
        while( 1 ) // бесконечный цикл
        {
            double R1;
            std::cout << "Введите необходимый номинал резистора в кОм(xx.xx): \n";
            std::cin >> R1;
 
            double tablRes[52] = {13, 13.3, 14, 14.7, 15, 15.4, 16, 16.5, 20, 22, 24,      //объявление и инициализация массива резисторов
                                      27, 30, 31, 33, 33.2, 36, 39, 39.2, 40.2, 47, 48.7,
                                                      51, 56, 62, 63.4, 75, 82, 91, 100, 118, 120, 150,
                                                      180, 200, 220, 240, 270, 300, 316, 324, 330, 360,
                                                      390, 432, 470, 510, 620, 680, 750, 787, 1000};
 
            for (int i=0; i < 52; i++)                                                                                 // проверка наличия резисторов на складе
            {
                    double dopusk = fabs(R1-tablRes[i]);
                    if (dopusk <= 0.1)
                            std::cout << "Номинал " << tablRes[i] << " имеется на складе!\n";
            }
 
            std::cout << "Для получения необходимого результата\n"
                                      << "можно взять параллельное соединение:\n\n  ";
 
 
            for (int a=0; a<10; a++)                                                                              // расчет необходимых номиналов,
            {                                                                                                              // для параллельного соединения из
                    for (int b=51; b>10; b--)                                                                         // того, что есть в наличии
                    {
                            double r1 = tablRes[a];
                        double r2 = tablRes[b];
                            double pres = fabs((r1*r2)/(r1+r2));
                            double dop = fabs(R1-pres);
                        if (dop < 0.05)
                                std::cout << "   " << r1 << "  и  " << r2 << "\n\n\n";                    // вывод на экран всех вариантов
                    }
            }
 
            std::cout << "Нажмите любую клавишу для повтора, или ESC для выхода" << endl;
 
            if( getch() == 0x1B ) // 0x1B - сканкод ESC
               break; // выход из цикла
        }
 
        system ("PAUSE");
        return 0;
}
Добавлено через 44 секунды
Выполняете основной код в бесконечном цикле, в конце проверяете нажатую клавишу, и, если это Escape (0x1B), то выходите из цикла инструкцией break
Совершенно непонятно, зачем одновременно в вашей программе используется функция getch и system?
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.08.2011, 19:54     Правильно ли я написал? #13
Сыроежка, system( "pause" ); была в оригинале, я её не трогал. getch() используется для получения нажатия клавиши, что невозможно при использовании system( "pause" );
jafrey kerns
5 / 5 / 0
Регистрация: 12.08.2011
Сообщений: 24
14.08.2011, 20:00  [ТС]     Правильно ли я написал? #14
Спасибо, до бесконечного цикла я не додумался

Добавлено через 3 минуты
system("PAUSE") я отключил за ненадобностью, в первоначальном варианте было вобще 2шт cin.get()
jafrey kerns
5 / 5 / 0
Регистрация: 12.08.2011
Сообщений: 24
24.08.2011, 23:39  [ТС]     Правильно ли я написал? #15
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 <locale>
#include <cmath>
 
#include <conio.h> // для getch()
 
 
 
int main ()
{
        setlocale(LC_ALL,"Rus");
 
        while( 1 ) // бесконечный цикл
        {
            double R1;
            std::cout << "Введите необходимый номинал резистора в кОм(xx.xx): \n";
            std::cin >> R1;
 
            double tablRes[52] = {13, 13.3, 14, 14.7, 15, 15.4, 16, 16.5, 20, 22, 24,      //объявление и инициализация массива резисторов
                                      27, 30, 31, 33, 33.2, 36, 39, 39.2, 40.2, 47, 48.7,
                                                      51, 56, 62, 63.4, 75, 82, 91, 100, 118, 120, 150,
                                                      180, 200, 220, 240, 270, 300, 316, 324, 330, 360,
                                                      390, 432, 470, 510, 620, 680, 750, 787, 1000};
 
            for (int i=0; i < 52; i++)                                                                                 // проверка наличия резисторов на складе
            {
                    double dopusk = fabs(R1-tablRes[i]);
                    if (dopusk <= 0.1)
                            std::cout << "Номинал " << tablRes[i] << " имеется на складе!\n";
            }
 
            std::cout << "Для получения необходимого результата\n"
                                      << "можно взять параллельное соединение:\n\n  ";
 
 
            for (int a=0; a<10; a++)                                                                              // расчет необходимых номиналов,
            {                                                                                                              // для параллельного соединения из
                    for (int b=51; b>10; b--)                                                                         // того, что есть в наличии
                    {
                            double r1 = tablRes[a];
                        double r2 = tablRes[b];
                            double pres = fabs((r1*r2)/(r1+r2));
                            double dop = fabs(R1-pres);
                        if (dop < 0.05)
                                std::cout << "   " << r1 << "  и  " << r2 << "\n\n\n";                    // вывод на экран всех вариантов
                    }
            }
 
            std::cout << "Нажмите любую клавишу для повтора, или ESC для выхода" << endl;
 
            if( getch() == 0x1B ) // 0x1B - сканкод ESC
               break; // выход из цикла
        }
 
        system ("PAUSE");
        return 0;
}
А можно как-то список номиналов считывать не из массива в программе, а из внешнего текстового файла? У меня из файла читается тип char, а как вычитать в double и создать массив я не знаю.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
25.08.2011, 00:01     Правильно ли я написал? #16
Вообще, из файла в переменную читают так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main()
{
    double number;
    
    ifstream fs( "nominals.txt" );
    
    if( !fs.is_open() )
    {
        cerr << "could not open file" << endl;
        return 0;
    }
    
    fs >> number; // прочитать из файла в переменную double;
    
    fs.close();
}
Количество элементов массива (номиналов) фиксировано, или может варьироваться?
jafrey kerns
5 / 5 / 0
Регистрация: 12.08.2011
Сообщений: 24
25.08.2011, 08:10  [ТС]     Правильно ли я написал? #17
Колличество элементов массива может меняться.
Пробовал такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
ifstream infile("existingtextfile.txt");
 
if (!infile.bad())
 
{
 
// Dump the contents of the file to cout.
 
number << infile.rdbuf();
 
infile.close();
 
}
при построении решения пишет что нельзя преобразовать char в double.
LosAngeles
Заблокирован
25.08.2011, 08:28     Правильно ли я написал? #18
double.operator<<(filebuf*) нету
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
25.08.2011, 14:59     Правильно ли я написал? #19
jafrey kerns, посмотрите на мой код (пост №16) и на ваш.

Вообще, если я правильно понял, что вы хотите, то вот:

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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <string.h>
#include <math.h>
 
using namespace std;
 
const int buffer_size = 64;
char buffer[ buffer_size ];
 
vector<double> nominals;
 
void add_nominal();
void ls_nominals();
void rm_nominal();
bool read_nominals( char * filename );
bool write_nominals( char * filename );
void check_nominals();
 
const char * operation_not_premitted = "Operation is not premitted: no nominals are loaded.\n";
 
int main()
{
    cout << "Welcome!\n";
    int choice;
 
    while( 1 )
    {
        cout << "\n--- Main menu ---\n1) Check nominals\n2) Add a nominal\n3) Remove a nominal\n4) List all nominals\n5) Load nominals\n6) Save nominals\n\n0) Quit\n\n> ";
 
        cin.sync();
        cin >> choice;
        cin.sync();
 
        if( choice == 0 )
           break;
 
        switch( choice )
        {
            case 1:
               if( nominals.size() == 0 )
                  cout << operation_not_premitted << endl;
               else
                  check_nominals();
               break;
 
            case 2:
               add_nominal();
               break;
 
            case 3:
               if( nominals.size() == 0 )
                  cout << operation_not_premitted << endl;
               else
                  rm_nominal();
               break;
 
            case 4:
               if( nominals.size() == 0 )
                  cout << operation_not_premitted << endl;
               else
                  ls_nominals();
               break;
 
            case 5:
               cout << "Please enter file name > ";
               cin.getline( buffer, buffer_size );
               read_nominals( buffer );
               break;
 
            case 6:
               if( nominals.size() == 0 )
               {
                  cout << operation_not_premitted << endl;
                  break;
               }
 
               cout << "Please enter file name > ";
               cin.getline( buffer, buffer_size );
               write_nominals( buffer );
               break;
        }
    }
 
    cout << "Goodbye!" << endl;
 
    return 0;
}
 
void add_nominal()
{
    double a;
 
    cin.sync();
    cout << "Please enter nominal > ";
    cin >> a;
    cin.sync();
 
    for( unsigned i = 0; i < nominals.size(); i++ )
    {
        if( nominals[i] == a )
        {
           cerr << "This value is already in the list" << endl;
           return;
        }
    }
 
    nominals.push_back( a );
}
 
void ls_nominals()
{
    cout << "\n----------\n";
 
    for( unsigned i = 0; i < nominals.size(); i++ )
       cout << nominals[i] << '\n';
 
    cout << "----------\nTOTAL: " << nominals.size() << endl;
}
 
void rm_nominal()
{
    double a;
 
    cout << "Please enter nominal > ";
    cin.sync();
    cin >> a;
    cin.sync();
 
    remove( nominals.begin(), nominals.end(), a );
 
    cout << "Done." << endl;
}
 
bool read_nominals( char * filename )
{
    ifstream fs( filename );
 
    if( !fs.is_open() )
    {
        cerr << "Could not open file" << endl;
        return false;
    }
 
    fs >> buffer;
 
    if( strcmp( buffer, "!resistors" ) ) /* если первое слово файле - НЕ "!resistors" */
    {
        cerr << "Invalid file" << endl;
        fs.close();
        return false;
    }
 
    /* очищаем список номиналов */
    nominals.clear();
 
    unsigned count;
    fs >> count;
 
    if( count <= 0 )
    {
        cerr << "No values in possibly valid file" << endl;
        fs.close();
        return true;
    }
 
    cout << "The file seems to be valid. " << count << " resistors specified." << endl;
 
    nominals.resize( count );
 
    for( unsigned i = 0; i < count; i++ )
    {
        if( fs.eof() )
        {
            cerr << "Unexpected end of file. " << i << "elements read." << endl;
            break;
        }
 
        if( fs.fail() )
        {
            cerr << "Error interpreting value. " << i << "elements read." << endl;
            break;
        }
 
        if( fs.bad() )
        {
            cerr << "Unknown error. " << i << "elements read." << endl;
            break;
        }
 
        fs >> nominals[i];
    }
 
    cout << "Nominals are loaded." << endl;
 
    fs.close();
}
 
bool write_nominals( char * filename )
{
    ofstream fs( filename );
 
    if( !fs.is_open() )
    {
        cerr << "Could not open file" << endl;
        return false;
    }
 
    fs << "!resistors " << nominals.size() << '\n';
 
    for( unsigned i = 0; i < nominals.size(); i++ )
    {
        if( fs.fail() || fs.bad() )
        {
           cerr << "Unknown error while writing. " << i << " nominals are saved, but file may be corrupt. Please resave." << endl;
           break;
        }
 
        fs << nominals[i] << ' ';
    }
 
    cout << "Nominals are saved." << endl;
 
    fs.close();
}
 
void check_nominals()
{
    double R1;
    cout << "Please enter the desired nominal in kOm > ";
    cin.sync();
    cin >> R1;
 
    for ( unsigned i = 0; i < nominals.size(); i++ ) // проверка наличия резисторов на складе
    {
            double dopusk = fabs( R1 - nominals[i] );
            if ( dopusk <= 0.1 )
            {
                cout << nominals[i] << " is found\n";
                break;
            }
    }
 
    cout << "You can use parallel connection of:\n";
 
    // расчет необходимых номиналов для параллельного соединения из того, что есть в наличии
    for ( unsigned a = 0; a < 10; a++ )
    {
            for ( unsigned b = nominals.size() - 1; b > 10; b-- )
            {
                    double r1 = nominals[a];
                    double r2 = nominals[b];
                    double pres = fabs((r1*r2)/(r1+r2));
                    double dop = fabs(R1-pres);
                    if (dop < 0.05)
                        cout << "   " << r1 << " & " << r2 << "\n"; // вывод на экран всех вариантов
            }
    }
}
Проверяет номиналы (ход расчёта я не менял, только подогнал под новые условия), добавляет номинал в список, удаляет номинал из списка, загружает номиналы из файла и сохраняет их в файл.

Вот файл:
Код
!resistors 52
13 13.3 14 14.7 15 15.4 16 16.5 20 22 24 27 30 31 33 33.2 36 39 39.2 40.2 47 48.7 51 56 62 63.4 75 82 91 100 118 120 150 180 200 220 240 270 300 316 324 330 360 390 432 470 510 620 680 750 787 1000
Удачи.

P.S.

А вас не интересует количество резисторов нужного номинала на складе, только факт их наличия?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2011, 15:40     Правильно ли я написал?
Еще ссылки по теме:

подскажите правильно ли я написал функцию проверки на параллельность двух отрезков C++
Ребят я правильно написал код:)? C++
Написал программу, не могу понять правильно или нет C++

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

Или воспользуйтесь поиском по форуму:
jafrey kerns
5 / 5 / 0
Регистрация: 12.08.2011
Сообщений: 24
25.08.2011, 15:40  [ТС]     Правильно ли я написал? #20
talis спасибо большое! сделал вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
double tablRes[58];
 
    ifstream fs("tablResUVR.txt");
    if (!fs.is_open() )
    {
        cerr << "could not open file" << endl;
        return 0;
    }
 
    for (int i = 0; i<52; i++)
         fs >> tablRes[i];
    fs.close();
работает отлично.
Yandex
Объявления
25.08.2011, 15:40     Правильно ли я написал?
Ответ Создать тему
Опции темы

Текущее время: 18:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru