Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.90/10: Рейтинг темы: голосов - 10, средняя оценка - 4.90
jlw
6 / 6 / 0
Регистрация: 30.09.2010
Сообщений: 18
1

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

30.09.2010, 19:30. Просмотров 1872. Ответов 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
Ответы с готовыми решениями:

Правильность кода
Решал вот эту функцию, которая прикреплена ниже, дошел до такого кода:...

Проверьте правильность кода
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; int main() {...

Проверка на правильность кода
// C++ 6.6 I.12.cpp : Defines the entry point for the console application. //...

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

Проверить правильность кода
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; // новый стандарт - хидеры не имеют...

39
jlw
6 / 6 / 0
Регистрация: 30.09.2010
Сообщений: 18
30.09.2010, 23:35  [ТС] 21
а в С ? но как ни странно прокатило, компилятор wxDev C++ .
0
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
30.09.2010, 23:37 22
jlw, О_о
or прокатило в wxDev C++? О_о
0
NightmareZ
1424 / 612 / 59
Регистрация: 31.03.2009
Сообщений: 1,990
30.09.2010, 23:38 23
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от gooseim Посмотреть сообщение
Вообще-то в c++ такого оператора вообще нет...
Ну вообще-то есть, просто не все об этом знают

http://www.cppreference.com/wiki/operator_precedence


C++ defines keywords to act as aliases for a number of symbols that function as operators: and (&&), bitand (&), and_eq (&=), or (||), bitor (|), or_eq (|=), xor (^), xor_eq (^=), not (!), not_eq (!=), compl (~). These are parsed exactly like their symbolic equivalents, and can be used in place of the symbol they replace. It is the character or string that is aliased, not the operator. As a result, bitand is used to replace the bitwise AND operator, the address-of operator, and can be used to specify reference types (e.g. int bitand ref = n; ).

http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B
5
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
30.09.2010, 23:40 24
NightmareZ, Омфг. И правда. Но MSVS это не проглатывает.
0
NightmareZ
1424 / 612 / 59
Регистрация: 31.03.2009
Сообщений: 1,990
30.09.2010, 23:42 25
Цитата Сообщение от Lavroff Посмотреть сообщение
Но MSVS это не проглатывает.
Ну это да.
0
jlw
6 / 6 / 0
Регистрация: 30.09.2010
Сообщений: 18
30.09.2010, 23:44  [ТС] 26
Буду знать)

А в остальном код хорош?)
0
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
30.09.2010, 23:47 27
Вполне. Использование using namespace и return 0 - несколько холливарная тема.

NightmareZ, не знаешь почему в MSVS это не катит?
1
gooseim
Эксперт С++
511 / 415 / 92
Регистрация: 23.09.2010
Сообщений: 1,159
30.09.2010, 23:48 28
Ну вообще-то есть, просто не все об этом знают
Действительно, даже в стандарте оператор or прописан. Этого я не знал.
0
NightmareZ
1424 / 612 / 59
Регистрация: 31.03.2009
Сообщений: 1,990
30.09.2010, 23:48 29
Цитата Сообщение от Lavroff Посмотреть сообщение
NightmareZ, не знаешь почему в MSVS это не катит?
Неа, понятия не имею.
0
gooseim
Эксперт С++
511 / 415 / 92
Регистрация: 23.09.2010
Сообщений: 1,159
30.09.2010, 23:51 30
jlw, код вполне хороший.
1
CyBOSSeR
Эксперт С++
2310 / 1683 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
30.09.2010, 23:53 31
Цитата Сообщение от NightmareZ Посмотреть сообщение
Ну вообще-то есть, просто не все об этом знают
Нет, судя по стандарту, подобных операторов в языке C++ нет.
Все эти
Цитата Сообщение от NightmareZ Посмотреть сообщение
and (&&), bitand (&), and_eq (&=), or (||), bitor (|), or_eq (|=), xor (^), xor_eq (^=), not (!), not_eq (!=), compl (~)
должны заменяться на стадии препроцессирования.
Цитата Сообщение от C++03
The lexical representation of C+ + programs includes a number of preprocessing tokens which are used in the syntax of the preprocessor or are converted into tokens for operators and punctuators.
Т.е. до компилятора доходит уже "чистый" исходник.
1
gooseim
Эксперт С++
511 / 415 / 92
Регистрация: 23.09.2010
Сообщений: 1,159
30.09.2010, 23:55 32
CyBOSSeR, стандарт ISO/IEC 14882. Страница 15. Или я не то смотрю?
0
CyBOSSeR
Эксперт С++
2310 / 1683 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
30.09.2010, 23:59 33
gooseim, именно то, но, насколько я понял, получается, что данные "операторы" являются лишь эквивалентами соответсвующих операторов и заменятся препроцессором, компилятор подобные "операторы" "не ест". Я, конечно, могу ошибатся. Для того, чтобы проверить, нужно попробовать посмотреть исходник с подобными "операторами" после стадии обработки препроцессором.
0
gooseim
Эксперт С++
511 / 415 / 92
Регистрация: 23.09.2010
Сообщений: 1,159
01.10.2010, 00:12 34
CyBOSSeR, думаю, если вы правы, то в стандарте это 100% должно быть отображено. А я пока не нашел.
Для точго чтобы проверить, нужно попробовать посмотреть исходник с подобными операторами после стадии обработки препроцессором.
Тогда мы будем зависеть от конкретного компилятора, а можно ли ему верить?

Добавлено через 2 минуты
Не так выразился. Под компилятором я подразумевал среду разработки, т.е. конкретный препроцессор.
0
CyBOSSeR
Эксперт С++
2310 / 1683 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
01.10.2010, 00:18 35
gooseim, значит надобно найти несколько IDE съедающих эти операторы.
MSVS не "ест", а вот g++ 4.1.2 на codepad.org "ест". Если у кого то есть g++ (у меня нет) можно попробовать.
0
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
01.10.2010, 00:20 36
Цитата Сообщение от jlw Посмотреть сообщение
А в остальном код хорош?
Я бы не рекомендовал завершать приложение в Си++ командой exit(), это хорошо для Си, но не очень для Си++.

Добавлено через 1 минуту
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Если у кого то есть g++ (у меня нет) можно попробовать.
C++
1
2
3
4
5
int main()
{   
    if(true and true)
        std::cout << "it works" << std::endl;
}
Нормально
0
CyBOSSeR
Эксперт С++
2310 / 1683 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
01.10.2010, 00:21 37
fasked, а можешь посмотреть исходник после обработки препроцессором? Буду весьма признателен.
0
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
01.10.2010, 00:37 38
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от CyBOSSeR Посмотреть сообщение
а можешь посмотреть исходник после обработки препроцессором?
Если я все правильно сделал, то следующее (все инклуды выкинул, а то слишком много текста получается)
Код
# 1 "main.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "main.c"
int main()
{
    if(true and true)
        ;
}
Использовал такую команду:
Код
g++ -E main.c
3
CyBOSSeR
Эксперт С++
2310 / 1683 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
01.10.2010, 00:41 39
О как... Правильно говорят: "Век живи - век учись". Спасибо, fasked и NightmareZ, .
0
gooseim
Эксперт С++
511 / 415 / 92
Регистрация: 23.09.2010
Сообщений: 1,159
01.10.2010, 01:21 40
Тоже хочу поблагодарить fasked и NightmareZ.
Особая благодарность jlw. Если бы не вы, я бы так и остался темным человеком.
0
01.10.2010, 01:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.10.2010, 01:21

Проверка кода на правильность
В общем, выполняю работу, перед проверкой хочется спросить у вас всё ли...

проверка кода на правильность
Используя оператор цикла while с условием и постусловием, решить следующие...

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

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