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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
jlw
6 / 6 / 0
Регистрация: 30.09.2010
Сообщений: 18
#1

Правильность и рациональность кода - C++

30.09.2010, 19:30. Просмотров 1696. Ответов 39
Метки нет (Все метки)

Всем привет! Вот уже прошло 24 часа с момента начала моего обучения С++ . До этого имел дело с такими языками, как Pascal и PHP. Ко вторнику нужно решить 30 задач. Пока решил 2 и хотелось бы узнать, насколько правильно и оптимально я это сделал, чтобы далее двигаться более рациональным путем. Может быть пропущены какие-то важные моменты? Кусок кода можно переписать гораздо легче? Или я вообще сделал "как не следует"? Прошу ответить на эти вопросы! А теперь перейдем к самим задачам.


ограничение времени на тест: 1 сек.
ограничение памяти на тест: 4096 KB.
ввод: input.txt
вывод: output.txt

Совсем скоро в Берляндии состоится первый традиционный Всеберляндский маскарад. Правительство Берляндии в срочном порядке сформировало министерство по подготовке маскарада. Перед министерством встала сложная задача: известно, что 1 метр ткани стоит P бурлей, а на пошив костюмов членам правительства необходимо приобрести N метров ткани. Ваша задача, сколько бурлей потратит министерство на покупку ткани.

Входные данные
В первой строке входного файла записано два натуральных числа через пробел P и N (1<=P<=100, 1<=N<=100).

Выходные данные
Выведите единственное натуральное число - необходимое количество бурлей на покупку N метров ткани по P бурлей за метр.
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
// Реализация в VS2008
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
 
using namespace std;
 
int main() {
    FILE *input, *output;
    char buf[8] = buf2[8] = buf3[8] = out[8] = "";
    int p, n, g = 0;
    
    input = fopen("input.txt", "r" );
    fgets(buf, 8, input);
    fclose(input);
    
    for (int i = 0; i < int(strlen(buf)); i++) {
        if (buf[i] != 32) {
            buf2[i] = buf[i];
        } else {
            for (int z = i+1; z < int(strlen(buf)); z++) {
                buf3[g] = buf[z];
                g++;
            }
            break; 
        }
    }
    
    p = atoi(buf2);
    n = atoi(buf3);
        
    output = fopen("output.txt", "w" );
    itoa((p*n),out,10);
    fputs(out, output);
    fclose(output);
}
ограничение времени на тест: 1 сек.
ограничение памяти на тест: 65536 KB.
ввод: input.txt
вывод: output.txt

Найдите количество натуральных нечетных чисел меньших N.

Входные данные
Во входном файле записано целое число N (-1000<=N<=1000).

Выходные данные
Выведите искомое число.
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
// Реализация в wxDev C++
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
int main() {
    FILE *input, *output;
    unsigned short n;
    int z = 0;
    char buffer[6], out[5];
    
    input = fopen("input.txt", "r" );
    fgets(buffer, 6, input);
    fclose(input);
 
    n = atoi(buffer);
    
    if (n > 0 and n <= 1000) {
        for (int i = n; i > 0; --i) {
            if (i % 2 != 0) {
                ++z;
            }
        }
    } else {
        z = 0;
    }
    
    output = fopen("output.txt", "w" );
    fputs(itoa(z,buffer,10), output);
    fclose(output);
    
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
2
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.09.2010, 19:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Правильность и рациональность кода (C++):

Правильность кода - C++
Решал вот эту функцию, которая прикреплена ниже, дошел до такого кода: #include &quot;stdafx.h&quot; #include &quot;stdafx.h&quot; #include &quot;cmath&quot; ...

Правильность кода программы - C++
Здравствуйте. Подскажите правильно ли я записал код по условию, а то нет возможности спросить у кого нибудь как кроме здесь: Составить...

Проверьте правильность кода - C++
Здравствуйте. Задали рассчитать площадь треугольника по заданным параметрам: сторонам треугольника ABC и радиусу описанной окружности....

Проверка на правильность кода - C++
// C++ 6.6 I.12.cpp : Defines the entry point for the console application. // #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

проверка кода на правильность - C++
Используя оператор цикла while с условием и постусловием, решить следующие задачу: найти сумму ряда с точностью е = 10-4, общий член...

Проверьте правильность кода - C++
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; int main() { setlocale(LC_ALL, &quot;Russian&quot;); int p; float q, n,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
besh]<a
13 / 11 / 1
Регистрация: 02.11.2009
Сообщений: 194
30.09.2010, 20:24 #2
ну в первом куске, очень неоптимально подключать 2 разные библиотеки ввода и вывода, можно обойтись только одной, ну естественно заменив функции одной на функции другой

вроде как iostream в обоих кусках не нужен
1
jlw
6 / 6 / 0
Регистрация: 30.09.2010
Сообщений: 18
30.09.2010, 20:45  [ТС] #3
Спасибо! Но хотелось бы более глобальные проблемы найти в коде... Мб посмотреть на профессиональное решение этих задач...

Ещё нашёл недочет у себя - 2 код, 20 строка, так правильно for (int i = n -1 ; i > 0; --i) {


Пожалуйста, отписывайтесь, кто заходит в тему. А то на данный момент моё обучение стопорится, т.к. не хочу делать из задачи в задачу неправильные вещи..
0
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
30.09.2010, 21:06 #4
jlw, определитесь для начала, на каком языке вы хотите писать: с или с++.
0
jlw
6 / 6 / 0
Регистрация: 30.09.2010
Сообщений: 18
30.09.2010, 21:32  [ТС] #5
Цитата Сообщение от gooseim Посмотреть сообщение
jlw, определитесь для начала, на каком языке вы хотите писать: с или с++.
C++, пока еще не успел точно уловить какие функции (и всё остальное) к какому языку относятся..
0
fasked
Эксперт С++
4937 / 2517 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
30.09.2010, 21:47 #6
jlw, так у Вас обе программы написаны в Си-стиле (за исключением подключения заголовочных файлов)
0
jlw
6 / 6 / 0
Регистрация: 30.09.2010
Сообщений: 18
30.09.2010, 21:51  [ТС] #7
Цитата Сообщение от fasked Посмотреть сообщение
jlw, так у Вас обе программы написаны в Си-стиле (за исключением подключения заголовочных файлов)
можете подсказать как будет в стиле С++ ?
0
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
30.09.2010, 21:55 #8
Ввод двух чисел из файла так:
C++
1
2
3
4
ifstream file("input.txt")
int n, m;
file>>n>>m;
file.close();
1
jlw
6 / 6 / 0
Регистрация: 30.09.2010
Сообщений: 18
30.09.2010, 22:01  [ТС] #9
Цитата Сообщение от gooseim Посмотреть сообщение
Ввод двух чисел из файла так:
благодарю, ничего себе я извращениями с циклами занимался)
0
fasked
Эксперт С++
4937 / 2517 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
30.09.2010, 22:10 #10
jlw, если Вы пишите программу на Си++, то лучше воспользоваться STL, хотя, разумеется, вовсе не обязательно.
Так, например с файлами позволяет работать fstream.
C++
1
2
std::ifstream ifs("input.txt");
std::ofstream ofs("output.txt");
Вы пользуетесь stdio.h, где для работы с файлами существует структура FILE. Для открытия файла, как я подозреваю в ней используется динамическое выделение памяти, что тоже немного противоречит концепциям, как говорит создатель языка. То есть, если не вызывать fclose, то вполне возможна утечка памяти. Можно долго об этом говорить..
Но, однако все это не значит, что Ваши программы написаны не на Си++

Кстати. Я совсем не заметил у Вас обработки ошибок - это плохо и не профессионально.

А вот так вообще больше никогда не делайте:
Цитата Сообщение от jlw Посмотреть сообщение
char buf[8] = buf2[8] = buf3[8] = out[8] = "";
1
jlw
6 / 6 / 0
Регистрация: 30.09.2010
Сообщений: 18
30.09.2010, 22:20  [ТС] #11
fasked, спасибо большое) сейчас осмысливаю всё... в скором времени перепишу код и снова выложу сюда) про обработку ошибок - не стал делать сознательно, т.к. это тестовые задачи и условия заранее предопределены... но думаю, что Вы правы - обработка ошибок даже в таких задачах только в плюс)
0
fasked
Эксперт С++
4937 / 2517 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
30.09.2010, 22:33 #12
Цитата Сообщение от jlw Посмотреть сообщение
условия заранее предопределены... но думаю, что Вы правы - обработка ошибок даже в таких задачах только в плюс
Понимаете, что ... отсутствие проверки ошибок могут надолго остановить процесс разработки, даже вот таких несложных одноразовых задачек.
Вспоминается случай, когда я долго не мог понять, почему программа отказывается работать, хотя по логике кода она обсолютно правильная. Приходилось подолгу просматривать код, заниматься отладкой (а это гнусное дело). Как оказалось я опечатался в имени файла. А ведь простая проверочка на открытие файла позволила бы исправить такую ошибку за один запуск программы.

К тому же это просто хорошая привычка, приучает так сказать к правильному подходу написания кода.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
30.09.2010, 22:39 #13
fasked, Но перебарщивать с этим тоже не надо. Проверять каждую строчку - нехорошо. А вот про какие-то проблемные куски - согласен.
0
fasked
Эксперт С++
4937 / 2517 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
30.09.2010, 22:48 #14
Цитата Сообщение от Lavroff Посмотреть сообщение
Но перебарщивать с этим тоже не надо. Проверять каждую строчку - нехорошо. А вот про какие-то проблемные куски - согласен.
Тут срабатывает правило 80/20.
80% кода - это подготовка данных, обработка ошибок и вывод отладочной информации и тд.
20% - функциональная часть.
2
jlw
6 / 6 / 0
Регистрация: 30.09.2010
Сообщений: 18
30.09.2010, 23:26  [ТС] #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
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main() {
    int p, n, result;
    
    ifstream ifs("input.txt");
    if (!ifs) {
        cerr << "Ошибка открытия файла! Нажмите Enter" << endl;
        cin.get();
        exit(1);
    }
    ifs >> p >> n;
    ifs.close();
    
    if (p < 1 or p > 100 or n < 1 or n > 100) {
        cerr << "Нарушены условия задачи! Нажмите Enter" << endl;
        cin.get();
        exit(1);
    }
    
    result = p * n;
 
    ofstream ofs("output.txt");
    if (!ofs) {
        cerr << "Ошибка открытия файла! Нажмите Enter" << endl;
        cin.get();
        exit(1);
    }
    ofs << result;
    ofs.close();
}

Какие теперь будут рекомендации?)
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2010, 23:26
Привет! Вот еще темы с ответами:

Проверить правильность кода (задача, 1 курс) - C++
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; int main() { float x = -2.8, b, y = 1; float max = ((1 + (pow(x, 2))...

Проверьте правильность написания кода и коментарии - C++
Задача: Написать программу которая принимает в качестве аргумента имя файла f с русским текстом и печатает его в точности по одному...

Проверте, пожалуйста, правильность программного кода - C++
#include &quot;stdafx.h&quot; #include &quot;string.h&quot; #include &quot;iostream&quot; using namespace std; int main() { char text; char*slova; ...

Метод хорд, проверьте правильность кода - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; double func(double x) { return x*x*x+20*x+8*(log(2+10*sqrt(3))); } double...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.09.2010, 23:26
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru