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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
jlw
6 / 6 / 0
Регистрация: 30.09.2010
Сообщений: 18
30.09.2010, 19:30     Правильность и рациональность кода #1
Всем привет! Вот уже прошло 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
besh]<a
 Аватар для besh]<a
12 / 10 / 1
Регистрация: 02.11.2009
Сообщений: 194
30.09.2010, 20:24     Правильность и рациональность кода #2
ну в первом куске, очень неоптимально подключать 2 разные библиотеки ввода и вывода, можно обойтись только одной, ну естественно заменив функции одной на функции другой

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

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


Пожалуйста, отписывайтесь, кто заходит в тему. А то на данный момент моё обучение стопорится, т.к. не хочу делать из задачи в задачу неправильные вещи..
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
30.09.2010, 21:06     Правильность и рациональность кода #4
jlw, определитесь для начала, на каком языке вы хотите писать: с или с++.
jlw
6 / 6 / 0
Регистрация: 30.09.2010
Сообщений: 18
30.09.2010, 21:32  [ТС]     Правильность и рациональность кода #5
Цитата Сообщение от gooseim Посмотреть сообщение
jlw, определитесь для начала, на каком языке вы хотите писать: с или с++.
C++, пока еще не успел точно уловить какие функции (и всё остальное) к какому языку относятся..
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
30.09.2010, 21:47     Правильность и рациональность кода #6
jlw, так у Вас обе программы написаны в Си-стиле (за исключением подключения заголовочных файлов)
jlw
6 / 6 / 0
Регистрация: 30.09.2010
Сообщений: 18
30.09.2010, 21:51  [ТС]     Правильность и рациональность кода #7
Цитата Сообщение от fasked Посмотреть сообщение
jlw, так у Вас обе программы написаны в Си-стиле (за исключением подключения заголовочных файлов)
можете подсказать как будет в стиле С++ ?
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
30.09.2010, 21:55     Правильность и рациональность кода #8
Ввод двух чисел из файла так:
C++
1
2
3
4
ifstream file("input.txt")
int n, m;
file>>n>>m;
file.close();
jlw
6 / 6 / 0
Регистрация: 30.09.2010
Сообщений: 18
30.09.2010, 22:01  [ТС]     Правильность и рациональность кода #9
Цитата Сообщение от gooseim Посмотреть сообщение
Ввод двух чисел из файла так:
благодарю, ничего себе я извращениями с циклами занимался)
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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] = "";
jlw
6 / 6 / 0
Регистрация: 30.09.2010
Сообщений: 18
30.09.2010, 22:20  [ТС]     Правильность и рациональность кода #11
fasked, спасибо большое) сейчас осмысливаю всё... в скором времени перепишу код и снова выложу сюда) про обработку ошибок - не стал делать сознательно, т.к. это тестовые задачи и условия заранее предопределены... но думаю, что Вы правы - обработка ошибок даже в таких задачах только в плюс)
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
30.09.2010, 22:33     Правильность и рациональность кода #12
Цитата Сообщение от jlw Посмотреть сообщение
условия заранее предопределены... но думаю, что Вы правы - обработка ошибок даже в таких задачах только в плюс
Понимаете, что ... отсутствие проверки ошибок могут надолго остановить процесс разработки, даже вот таких несложных одноразовых задачек.
Вспоминается случай, когда я долго не мог понять, почему программа отказывается работать, хотя по логике кода она обсолютно правильная. Приходилось подолгу просматривать код, заниматься отладкой (а это гнусное дело). Как оказалось я опечатался в имени файла. А ведь простая проверочка на открытие файла позволила бы исправить такую ошибку за один запуск программы.

К тому же это просто хорошая привычка, приучает так сказать к правильному подходу написания кода.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.09.2010, 22:39     Правильность и рациональность кода #13
fasked, Но перебарщивать с этим тоже не надо. Проверять каждую строчку - нехорошо. А вот про какие-то проблемные куски - согласен.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
30.09.2010, 22:48     Правильность и рациональность кода #14
Цитата Сообщение от Lavroff Посмотреть сообщение
Но перебарщивать с этим тоже не надо. Проверять каждую строчку - нехорошо. А вот про какие-то проблемные куски - согласен.
Тут срабатывает правило 80/20.
80% кода - это подготовка данных, обработка ошибок и вывод отладочной информации и тд.
20% - функциональная часть.
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();
}

Какие теперь будут рекомендации?)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.09.2010, 23:27     Правильность и рациональность кода #16
Код
if (p < 1 or p > 100 or n < 1 or n > 100)
Это у вас работает? Как бы или в C/C++ - ||
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
30.09.2010, 23:32     Правильность и рациональность кода #17
Цитата Сообщение от Lavroff Посмотреть сообщение
Код
if (p < 1 or p > 100 or n < 1 or n > 100)
Это у вас работает? Как бы или в C/C++ - ||
Это видимо стандарт 0x таким получился пока мы не видели
jlw
6 / 6 / 0
Регистрация: 30.09.2010
Сообщений: 18
30.09.2010, 23:32  [ТС]     Правильность и рациональность кода #18
работает)
т.е. в с++ "or" использовать не следует?
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
30.09.2010, 23:34     Правильность и рациональность кода #19
Цитата Сообщение от jlw Посмотреть сообщение
работает)
т.е. в с++ "or" использовать не следует?
Вообще-то в c++ такого оператора вообще нет...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2010, 23:35     Правильность и рациональность кода
Еще ссылки по теме:

Проверьте правильность кода C++
Правильность кода C++
C++ Метод хорд, проверьте правильность кода

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.09.2010, 23:35     Правильность и рациональность кода #20
И как это работает? оО
Yandex
Объявления
30.09.2010, 23:35     Правильность и рациональность кода
Ответ Создать тему
Опции темы

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