Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
 Аватар для PantiL
26 / 26 / 10
Регистрация: 10.03.2016
Сообщений: 73

Правильность и грамотность кода (опытный взгляд на код новичка)

10.03.2016, 10:15. Показов 1518. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте друзья.
Я программист любитель, лет 10 назад неплохо разбирался в php и немного в Python+django. На питоне даже какой-то сайт у меня был работоспособный. Потом все забросил, все забыл. Сейчас появилась необходимость написать для себя программу. Программа должна быть с GUI. А так как у меня рабочая платформа Linux, решил писать на С++ , мне в пинципе сейчас вообще без разницы на чем писать, потому как ни по одному языку никаких знаний в голове не осталось. Учу заново. Читать учебник скучно, да и нормальной книги быстро найти не получилось. Решил что путем проб и ошибок должно у меня получиться, базовые понятия о программировании у меня имеются.
Итак С++ под Linux, с GUI еще не определился GTK или Qt, пока что рано. Изначально буду консольную прогу делать, графическую морду потом буду прикручивать. Сначала функционал.

1-я задача. Открыть текстовый файл, прочиать его содержимое, и отобрать строки начинающиеся с 6-и цифер.
Я это сделал так.
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
#include <iostream>
#include <fstream>
#include <regex>
 
using namespace std;
 
int main(int argc, char* argv[]){
    
    if(argc>1){
        ifstream f; //Создаем объект потока чтения из файла 
        f.open(argv[1]); //Открываем файл на чтение
        // Проверяем открылся ли файл на чтение
        if(f.is_open())
        {
            string out_s;  //Временная переменная для чтения в нее из файла
            regex Reg("^[0-9]{6}.*"); //Регулярное выражение, которому соответствует строка, начинающаяся с 6-и цифер
            while(true){
                getline(f, out_s);
                if(!f.eof())
                {
                    i++;
                    if(regex_match(out_s, Reg)) //Проверка соответствия строки
                    {
                        cout << out_s;  //Вывод резултата в консоль
                    }
                }
                else
                {
                    break;
                }
            }
            //Закрываем файл
            f.close();
        }
        else
        {
            cout << "Неверное имя файла";
        }
    }
    else
    {
        cout << "Не задано имя файла";
    }
    return 0;
};
компиляция: g++ -Wall -std=c++11 programm.cpp
версия компилятора - gcc 5.3.0-5
Вроде все работает. Насколько это получилось в духе С++ ?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.03.2016, 10:15
Ответы с готовыми решениями:

Нужен опытный взгляд бд метрологическая служба
День добрый. Надоели мне 20 отчетов 40 таблиц в 10 файлах и прочие прелести excel в нашем предприятии(точнее даже в нашей службе) и решил...

Нужен опытный взгляд, рабочая функция, но есть НО
Третий день изучаю язык, не судите строго... поставил себе задачу, суть которой: пользователь вводит два числа &quot;а&quot; и...

Лёгкая и самая понятная на ваш взгляд книга для новичка
Какая самая легкая и самая понятная на ваш взгляд книга для новичка? Чтобы прочитав ее он мог спокойно программировать

15
11 / 11 / 8
Регистрация: 13.04.2015
Сообщений: 159
10.03.2016, 12:17
что за i?
C++
1
while(!f.eof()){...}
https://ru.wikipedia.org/wiki/... 0%B8%D1%8F
1
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
10.03.2016, 12:28
Немного упростил
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
int main(int argc, char* argv[])
{    
    if (argc != 2) {
        cout << "Usage: progname filename" << endl;
        return 1;
    }
 
    string filename = argv[1];
    ifstream f (filename); //Создаем объект потока чтения из файла 
    if (!f) {
        cout << "Cannot open file " << filename;
        return 1;
    }
 
    string out_s;  //Временная переменная для чтения в нее из файла
    regex reg("^[0-9]{6}.*"); //Регулярное выражение, которому соответствует строка, начинающаяся с 6-и цифер
    while (getline(f, out_s)) {
        if (regex_match(out_s, reg)) { //Проверка соответствия строки
            cout << out_s;  //Вывод резултата в консоль
        }
    }
    //Закрываем файл
    f.close();
}
1
11 / 11 / 8
Регистрация: 13.04.2015
Сообщений: 159
10.03.2016, 12:31
и можно уменьшить вложенность:
C++
1
2
3
4
5
if(argc < 2)
{
cout << "";
return 0;
}
опередил)
0
Эксперт .NET
 Аватар для Usaga
14078 / 9295 / 1347
Регистрация: 21.01.2016
Сообщений: 34,895
10.03.2016, 12:34
От таких глупых комментариев не много толку:
C++
1
2
//Закрываем файл
f.close();
Комментируй только то, что действительно требует этого.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.03.2016, 12:38
Цитата Сообщение от PantiL Посмотреть сообщение
Вроде все работает.
ваш код не должен компилироваться.

из-за этой фигни, полагаю - опечатка:
Цитата Сообщение от PantiL Посмотреть сообщение
i++;



Цитата Сообщение от PantiL Посмотреть сообщение
Насколько это получилось в духе С++ ?
годный код.
реализация сочетает в себе такие качества,
как "практичность" и "минимализм".
1
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
10.03.2016, 14:02
стоит подучить русский язык
Миниатюры
Правильность и грамотность кода (опытный взгляд на код новичка)  
0
 Аватар для PantiL
26 / 26 / 10
Регистрация: 10.03.2016
Сообщений: 73
10.03.2016, 14:59  [ТС]
Хоть убей, не вижу кнопку для цитирования сообщений, отвечу так.

Переменная i - это конечно же опечатка, я считал количество совпадений с регулярным выражением, перед тем как скопировать код на форум решил ее убрать, но получилось что не везде.

Пока что комментирую абсолютно все, для меня это действительно требуется.

И да, по поводу грамотности. Видимо модераторов форума бесят множественные темы со словом "Помогите" и это слово и однокоренные ему попали в ченый список. Ну да, а я назвал тему именно с запрещенными словами. Пришлось несколько раз переименовать, пока форум принял название, в торопях и по запарке я допустил глупую грамматическую ошибку в заголовке темы. Прошу людей наделенным определенными права исправить, ну или забить на это дело
0
10.03.2016, 15:01

Не по теме:

Цитата Сообщение от PantiL Посмотреть сообщение
Хоть убей, не вижу кнопку для цитирования сообщений, отвечу так.
выделяешь текст, JS тебе покажет кнопку "цитировать"

0
10.03.2016, 15:02

Не по теме:

Цитата Сообщение от PantiL Посмотреть сообщение
Хоть убей, не вижу кнопку для цитирования сообщений
Это мышкой делается. Выделяешь текст - нажимаешь на всплывшее "цитировать".

0
 Аватар для PantiL
26 / 26 / 10
Регистрация: 10.03.2016
Сообщений: 73
10.03.2016, 15:13  [ТС]
Цитата Сообщение от Kastaneda Посмотреть сообщение
выделяешь текст, JS тебе покажет кнопку "цитировать"
Цитата Сообщение от DrOffset Посмотреть сообщение
Это мышкой делается. Выделяешь текст - нажимаешь на всплывшее "цитировать".
Спасибо, ребят
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
10.03.2016, 16:58
Цитата Сообщение от PantiL Посмотреть сообщение
C++
1
2
3
getline(f, out_s);
if(!f.eof())
{
Если в конце последней строки нет '\n', то последняя строка не обработается. Лучше сделать, как показал Kastaneda, или:
C++
1
2
3
while(true){
if(getline(f, out_s))
{
1
10.03.2016, 18:28

Не по теме:

Почему бы не создать раздел, где можно было бы выкладывать свой код на показ :)

0
10.03.2016, 19:44

Не по теме:

Цитата Сообщение от 0x0152 Посмотреть сообщение
Почему бы не создать раздел, где можно было бы выкладывать свой код на показ
ага, за плохой код бан на месяц, за очень плохой - пожизненный :D

0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
10.03.2016, 22:31
Лучший ответ Сообщение было отмечено PantiL как решение

Решение

  1. Не используй using namespace std; ( Почему опытные программисты не определяют пространство имен std? )
  2. Отделяй задачу от её вызова
  3. Используй потоки в С++ по максимуму
  4. Простые тесты можно встроить в код
  5. Почитай 90 рекомендаций по стилю написания программ на C++

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
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
#include <regex>
 
void filtering(std::istream& input, std::ostream& output) {
    std::string line;
    std::regex reg("^[0-9]{6}.*"); //Регулярное выражение, которому соответствует строка, начинающаяся с 6-и цифер
 
    while(std::getline(input, line)) {
        if (std::regex_match(line, reg)) { //Проверка соответствия строки
            output << line << std::endl;  //Вывод резултата в консоль
        }
    }
}
 
int main(int argc, char* argv[]){
    if (argc != 2) {
#ifdef DEBUG
        std::istringstream ss(
          "123\n"
          "123456 abc\n"
          "1234567 abcd\n"
        );
 
        filtering(ss, std::cout);
 
        return 0;
#else
        std::cerr << "Usage: progname filename\n";
        return 1;
#endif
    }
 
    std::string fileName(argv[1]);
    std::ifstream file(fileName); //Создаем объект потока чтения из файла
    if (!file) {
        std::cerr << "Cannot open file: " << fileName << std::endl;
        return 1;
    }
 
    filtering(file, std::cout);
 
    file.close();
    return 0;
}
2
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.03.2016, 01:24
Цитата Сообщение от AlexVRud Посмотреть сообщение
Используй потоки в С++ по максимуму
хммм....

Цитата Сообщение от AlexVRud Посмотреть сообщение
Простые тесты можно встроить в код
но не так, как это сделали вы.

по минимуму тесты должны:

1.
иллюстрировать дизайн использования.

2.
гарантировать, что результат соответствует ожидаемому.

3.
предохранять от регрессии.

4.
встраиваемый тест не должен мешать
основной работе бизнес-логике.

http://rextester.com/WJW45825

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
#include <iostream>
#include <fstream>
#include <cassert>
#include <string>
#include <regex>
 
// ======================================================================
// ======================================================================
 
bool match(const std::string& value)
{
    // срабатывает на строки, который начинаются с 6ти цыфр
    // которые не имеют в конце белых символов (\n)
    // static std::regex reg("^[0-9]{6}.*");
    
    // срабатывает на строки, который начинаются с 6ти цыфр
    static std::regex filter("^\\d{6}.*\\s*"); 
    return std::regex_match(value, filter);
}
 
void filtering(std::istream& input, std::ostream& output) 
{
    std::string line; 
    while(std::getline(input, line)) 
        if(match(line)) 
            output << line << '\n';
}
 
// ======================================================================
// ======================================================================
 
#ifndef NDEBUG
 
bool test(const char* value, const bool expected) { 
    return match(value) == expected; 
}
 
#define assert_match(v, b) \
    assert(test(v,b));
 
#endif
 
// ======================================================================
// ======================================================================
 
int main(int argc, char* argv[])
{
    assert_match("123"           , false);
    assert_match("123456 abc"    , true );
    assert_match("1234567 abcd"  , true );
    
    assert_match("123456 abc\n"  , true );
    assert_match("1234567 abcd\n", true );
    
    assert_match("123456 abc\0"  , true );
    assert_match("1234567 abcd\0", true );
    
    if (argc != 2) 
        return std::cerr << "usage: progname filename\n", 1;
    
    std::ifstream file(argv[1]); 
    if (!file)
        return std::cerr << "cannot open file: " << argv[1] << '\n', 1;
 
    filtering(file, std::cout);
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.03.2016, 01:24
Помогаю со студенческими работами здесь

для новичков. Совершенный код: грамотность
http://www.phpinfo.su/articles/theory/sovershennyj_kod_gramotnost.html

Проверить код на корректность и грамотность реализации поставленной задачи
Здравствуйте. Я - начинающий, по большей части самоучка (пару курсов недоинформатики в быдловузе в расчет особо не беру). Сейчас начал...

Прошу проанализировать код на грамотность (или безграмотность) его написания
Нахожусь на стадии изучения как самих основ программирования, так и С++ в частности. Все на самообучении, потому и обращаюсь к Вам за...

Свежий взгляд на код чтения файла
чтение из файла, был код String fileName = @&quot;..\..\in.csv&quot;; if (!File.Exists(fileName)) { ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru