Форум программистов, компьютерный форум 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;
}
 Комментарий модератора 
Используйте теги форматирования кода!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
25.08.2011, 15:42     Правильно ли я написал? #21
jafrey kerns, вы же говорили, что количество номиналов в файле может варьироваться. А читаете вы строго 52 значения...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
jafrey kerns
5 / 5 / 0
Регистрация: 12.08.2011
Сообщений: 24
25.08.2011, 15:55  [ТС]     Правильно ли я написал? #22
Меня пока, как начинающего интересовала возможность вычитывать числа с плавающей точкой из текстового файла в массив.
Вот получившийся код:

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
#include <iostream>
#include <fstream>
#include <conio.h>
#include <cmath>
 
using namespace std;
 
int main()
{
    setlocale (LC_ALL,"Rus");
    while (1)
    {
    double neobhR;
    static double dop;                       //вспомагательная переменная
    double dopusk;
 
    cout << "Введите необходимый номинал:\n";
    cin >> neobhR;
 
    /*double tablRes[58] = {2.67, 9.09, 16, 17.6, 33.2, 39.2, 45.3, 47, 49.3,
                     49.9, 51.1, 100, 150, 200, 203, 220, 221, 240, 243,
                     249, 270, 271, 274, 291, 300, 301, 332, 340, 360, 
                     361, 374, 379, 422, 430, 442, 453, 470, 475, 499,
                     620, 657, 681, 787, 931, 1000, 1130, 1150, 1200,
                     1330, 1500, 1540, 1690, 1740, 1760, 1870, 1910,
                     1960, 2000};*/
    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();
 
    for (int i=0; i<58; i++)
    {
        dopusk = fabs(neobhR-tablRes[i]);
        dop = dopusk;
        if (dopusk <= 2)
        {
            cout << "\nНа складе имеется необходимый номинал: " << tablRes[i] << "\n\n";
            static double dop = dopusk;
        }
        if (dop <= 2)
            break;
    }
 
    if(dop > 2)
    {
        cout << "Необходимый номинал можно получить\n"
                  << "соединив последовательно:\n\n";
        for (int a=0; a<58; a++)
        {
            for (int b=0; b<58; b++)
            {
                double poslRes = tablRes[a]+tablRes[b];
                double dopusk2 = fabs(neobhR-poslRes);
                if (dopusk2 <= 3)
                    if (tablRes[a] <= tablRes[b])
                        cout << "   " << tablRes[a] << "  и  " << tablRes[b] << "\n\n\n";
            }
        }
    }
    cout << "Нажмите любую клавишу для повтора, или ESC для выхода\n";
 
        if( _getch() == 0x1B ) // 0x1B - сканкод ESC
                    break; // выход из цикла
    }
    //system ("PAUSE");
    return 0;
а вот текстовый файл:

2.67 9.09 16 17.6 33.2 39.2 45.3 47 49.3 49.9 51.1 100 150 200 203 220 221 240 243 249 270 271 274 291 300 301 332 340 360 361 374 379 422 430 442 453 470 475 499 620 657 681 787 931 1000 1130 1150 1200 1330 1500 1540 1690 1740 1760 1870 1910 1960 2000

Добавлено через 3 минуты
До динамических массивов и векторов я еще не дошёл, но в будущем надеюсь изучу и скорректирую код. А в планах оформить все в графическую оболочку.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
25.08.2011, 15:57     Правильно ли я написал? #23
jafrey kerns, не знаю, что будет сложнее - разобраться с векторами, или сделать окошко
jafrey kerns
5 / 5 / 0
Регистрация: 12.08.2011
Сообщений: 24
25.08.2011, 16:05  [ТС]     Правильно ли я написал? #24
Я и сам не знаю, по книге Прата я добрался только до главы с функциями.
fasked
25.08.2011, 16:15
  #25

Не по теме:

Цитата Сообщение от jafrey kerns Посмотреть сообщение
Я и сам не знаю, по книге Прата я добрался только до главы с функциями.
Складывается ощущение, что до достижения цели Вам еще прочитать штук 10 книг минимум, все таки "окошки" штуки не простые Однако, это хорошо - есть куда стремиться

jafrey kerns
5 / 5 / 0
Регистрация: 12.08.2011
Сообщений: 24
25.08.2011, 16:23  [ТС]     Правильно ли я написал? #26
Цитата Сообщение от fasked Посмотреть сообщение
Складывается ощущение, что до достижения цели Вам еще прочитать штук 10 книг минимум, все таки "окошки" штуки не простые Однако, это хорошо - есть куда стремиться
Согласен. У человека должна бить какая- нибудь цель в жизни.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
25.08.2011, 16:42     Правильно ли я написал? #27

Не по теме:

Ну не какая-нибудь вообще, а оправданная...



Знаете, мне кажется, что вам пока не следует лезть в окошки, а научиться работать с консолью. Работа с потоками ввода-вывода во-первых позволяет создавать очень гибкие конвейеры (прочитайте про перенаправление ввода-вывода в Unix), а во-вторых, вывод проще. С окошками вам проще не будет ни на грамм. Вместо обычного printf( "%d items read", number ); вам нужно будет сделать

C
1
2
3
char buffer[64];
sprintf( buffer, "%d items read", number );
/*и далее задать эту строку соответствующему окошку. как - зависит от фреймворка*/
Вместо простого
C
1
2
for( int i = 0; i < 25; i++ )
   printf( "%d ", array[i] );
Вам нужно будет сделать что-то в этом роде:

C
1
2
3
4
5
6
7
8
9
char buffer[256];
for( int i = 0; i < 25; i++ )
{
   char loc_buffer[8];
   sprintf( loc_buffer, "%d, ", array[i] );
   strcat( buffer, loc_buffer ); /* так, напимер */
}
 
/* вывести потом куда-то */
Ну или аналогичным образом на C++ с использованием std::string и подобного (что безопаснее).

Вы не уйдёте от обычных операций, просто навешаете сверху ещё кучу (пока ещё) ненужных тонкостей.
jafrey kerns
5 / 5 / 0
Регистрация: 12.08.2011
Сообщений: 24
25.08.2011, 17:09  [ТС]     Правильно ли я написал? #28
Я в принципе так и подразумевал, сначала изучить работу в консоли, а потом браться за окошки, т.к. понимаю что без основ браться за окошки нет смысла.
jafrey kerns
5 / 5 / 0
Регистрация: 12.08.2011
Сообщений: 24
15.10.2011, 00:34  [ТС]     Правильно ли я написал? #29
Подскажите пожалуйста, как изменить этот код:

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
#include <iostream>
#include <fstream>
#include <conio.h>
#include <cmath>
 
using namespace std;
 
int main()
{
        setlocale (LC_ALL,"Rus");
        while (1)
        {
        double neobhR;
        static double dop;                       //вспомагательная переменная
        double dopusk;
 
        cout << "Введите необходимый номинал:\n";
        cin >> neobhR;
 
        /*double tablRes[58] = {2.67, 9.09, 16, 17.6, 33.2, 39.2, 45.3, 47, 49.3,
                             49.9, 51.1, 100, 150, 200, 203, 220, 221, 240, 243,
                                         249, 270, 271, 274, 291, 300, 301, 332, 340, 360, 
                                         361, 374, 379, 422, 430, 442, 453, 470, 475, 499,
                                         620, 657, 681, 787, 931, 1000, 1130, 1150, 1200,
                                         1330, 1500, 1540, 1690, 1740, 1760, 1870, 1910,
                                         1960, 2000};*/
    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();
 
        for (int i=0; i<58; i++)
        {
                dopusk = fabs(neobhR-tablRes[i]);
                dop = dopusk;
                if (dopusk <= 2)
                {
                        cout << "\nНа складе имеется необходимый номинал: " << tablRes[i] << "\n\n";
                        static double dop = dopusk;
                }
                if (dop <= 2)
                        break;
        }
 
        if(dop > 2)
        {
                cout << "Необходимый номинал можно получить\n"
                              << "соединив последовательно:\n\n";
                for (int a=0; a<58; a++)
                {
                        for (int b=0; b<58; b++)
                        {
                                double poslRes = tablRes[a]+tablRes[b];
                                double dopusk2 = fabs(neobhR-poslRes);
                                if (dopusk2 <= 3)
                                        if (tablRes[a] <= tablRes[b])
                                            cout << "   " << tablRes[a] << "  и  " << tablRes[b] << "\n\n\n";
                        }
                }
        }
        cout << "Нажмите любую клавишу для повтора, или ESC для выхода\n";
 
        if( _getch() == 0x1B ) // 0x1B - сканкод ESC
                    break; // выход из цикла
        }
    //system ("PAUSE");
    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
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
#include <iostream>
#include <fstream>
#include <conio.h>
#include <cmath>
#include <vector>
 
using namespace std;
const int sizeTablRes = 10000;
 
//void raschetNominalov (const double spisok[], int col, double nRes);
void raschetNominalov (vector<double>tablRes, int col, double nRes);
 
int main()
{
    setlocale (LC_ALL, "Rus");
 
    while (1)
    {
        double neobhR;
        //static double dop;                            // вспомагательная переменная
        //double dopusk;
        //double tablRes[sizeTablRes];
        vector <double> tablRes;
 
        ifstream fs ("tablResUVR.txt");
        if (!fs.is_open())
        {
            cerr << "Не найден файл с перечнем номиналов!" << endl;
            system ("PAUSE");
            return 0;
        }
 
        for (int i = 0; i < sizeTablRes; i++)
            //fs >> tablRes[i];
            tablRes.push_back(fs);
        fs.close();
 
        int sizeSpisok = tablRes.size();
        cout << "Размер списка = " << sizeSpisok << endl;
 
        cout << "Введите необходимый номинал:\n";
        cin >> neobhR;
 
        raschetNominalov (tablRes, sizeTablRes, neobhR);
 
        cout << "Нажмите любую клавишу для повтора, или ESC для выхода\n";
        if( _getch() == 0x1B ) // 0x1B - сканкод ESC
            break; // выход из цикла
    }
    return 0;
}
 
void raschetNominalov (vector<double>tablRes, int col, double nRes)
{
    double dopusk;
    static double dop;
 
    for (int i = 0; i < col; i++)
    {
        dopusk = fabs(nRes - tablRes[i]);
        dop = dopusk;
        if (dopusk <= 3)
        {
            cout << "\nНа складе имеется необходимый номинал: " << tablRes[i] << "\n\n";
            static double dop = dopusk;
        }
        if (dop <= 3)
            break;
    }
 
    if (dop > 3)
    {
        cout << "Необходимый номинал можно получить\n"
               << "соединив последовательно: \n\n";
        for (int a = 0; a < col; a++)
        {
            for (int b = 0; b < col; b++)
            {
                double poslRes = tablRes[a] + tablRes[b];
                double dopusk2 = fabs (nRes - poslRes);
                if  (dopusk2 <= 3)
                    if (tablRes[a] <= tablRes[b])
                        cout << "    " << tablRes[a] << "  и  " << tablRes[b] << "\n\n" << endl;
            }
        }
    }
}
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
15.10.2011, 00:50     Правильно ли я написал? #30
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 <fstream>
#include <vector>
#include <algorithm>
#include <iterator>
 
int main()
{
    // загружаем данные сюда
    std::vector <float> data;
 
    // читаем отсюда
    std::ifstream fs ( "input.txt" );
 
    // копируем все данные в вектор
    std::copy( std::istream_iterator<float>( fs ), std::istream_iterator<float>(), std::back_inserter( data ) );
 
    // закрываем файл
    fs.close();
 
 
    // вывод (для отладки)
    std::for_each( data.begin(), data.end(), []( float &i ){ std::cout << i << ' '; } );
    std::cout << "\ntotal: " << data.size();
 
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2011, 01:31     Правильно ли я написал?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
jafrey kerns
5 / 5 / 0
Регистрация: 12.08.2011
Сообщений: 24
15.10.2011, 01:31  [ТС]     Правильно ли я написал? #31
Спасибо, все работает.
Yandex
Объявления
15.10.2011, 01:31     Правильно ли я написал?
Ответ Создать тему
Опции темы

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