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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Dmitry_Tomsk
0 / 0 / 0
Регистрация: 30.05.2013
Сообщений: 3
30.05.2013, 19:39     Напишите (консольную) программу, принимающую на вход имя файла и набор параметров. В зависимости от параметров программа должна работать в трёх режима #1
Вообщем такое же задание

Добавлено через 2 минуты
Напишите (консольную) программу, принимающую на вход имя файла и набор параметров. В зависимости от параметров программа должна работать в трёх режимах:
1) test -f Test.tst -m words -v mother
печатает количество слов «mother» в файле «Test.tst»
2) test -f Test.tst -m checksum
печатает 32-хбитную чексумму, рассчитанную по алгоритму checksum = word1 + word2 + … + wordN (word1..wordN – 32-хбитные слова, представляющие содержимое файла)
3) test -h
печатает информацию о программе и описание параметров.

При написании тестового задания мы ожидаем увидеть программу на языке С++ (а не «чистом» С), несмотря на некоторую избыточность С++ для данной задачи.


ВОТ НАПИСАЛ КОД:

Кликните здесь для просмотра всего текста
-----------test.h-------------
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <string>
#include <iostream>
#include <vector>
/*хранит данные командной строки, определяет выполняемую команду*/
struct test{
    test(const std::vector<std::string>& m); 
    void do_test(); // выполняем заданную команду
private: 
    enum { povtor, checksum, help, unknow }  command;
    std::string file_in;
    std::string word; 
};
---------test.cpp------------
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
#include "test.h"
#include <fstream>
#include <bitset>
 
test::test(const std::vector<std::string>& m) : command(unknow), file_in(""), word("") {
    
    //разбиваем командную строку на составляющие
    if( m[0] != "test" ) throw int(); //генерируется исключение при неправильном задании командной строки
 
    switch(m.size()) {
    case 2 : 
        if(m[1] == "-h") command = help;
        break;
    case 7 :
        if(m[1] == "-f" && m[3] == "-m" && m[4] == "words" && m[5] == "-v"){
            command = povtor;
            file_in = m[2];
            word = m[6];}
        break;
    case 5 : 
        {
            if(m[1] == "-f" && m[3] == "-m" && m[4] == "checksum"){
                command = checksum;
                file_in = m[2];}
            break;
        }
    };
    
    if( command == unknow ) throw int(); //генерируется исключение при неправильном задании командной строки
}
 
void test::do_test(){
 
    if(command == help) {
        std::cout << " Programma prinimaet na vhod imiy faila i nabor parametrov. V zavisimosti ot parametrov programma rabotaet v treh regimah: \n" ;
        std::cout << "1.) test -f Test.txt -m words -v mother \n";
        std::cout << "pechataet kolichestvo slov <<mother>> v faile <<Test.txt>> \n";
        std::cout << "2.) test -f Test.txt -m checksum \n";
        std::cout << " pechataet 32-bit checksum, passchitannuy po algoritmu checksum = word1 + word2 + … + wordN (word1..wordN - 32-bit slova, predstavliayshie sodergimoe faila) \n";
        std::cout << "3.) test -h \n";
        std::cout << " pechataet informaciy o programme i opisanie parametrov. \n";
        return;
    }
 
    int number = 0;
    std::string slovo;
    if(command == povtor){
        std::ifstream f_in(file_in.c_str());
        if(!f_in) throw file_in;
        // за каждую итерацию извлекаем из файла по одной строке и находим в ней каждое совпадение со словом word  
        while (!f_in.eof()) {
            getline(f_in, slovo); // считываем строку
            int pos = 0;
            while (true)
            {
                pos = slovo.find(word,pos); // с позиции pos ищем совпадение 
                if (pos != std::string::npos) { // если совпадение не найдено  pos принимает знаечение string::npos
                    number++;
                    pos += word.size();
                } else break;
            }
          }
 
        std::cout << "Kolichestvo povtorov slova " + word + " ravno " << number << std::endl;
    
    } else {// случай определения checksum
        std::ifstream f_in(file_in.c_str(),std::ios_base::binary); // бинарный режим открытия файла
        if(!f_in) throw file_in;
        
        int v, s = 0;
        while(!f_in.eof())
        {
             f_in.read((char*)&v, 4); //считываем 4 байта
             s += v;
        }
 
        std::cout << " 32-bit checksum  = " << std::bitset<32>(s) << std::endl; // выводим 32-х битную чексумму в файл
        f_in.close();
    }
}
--------------main--------------------
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "test.h"
 
int main(int argc, char* argv[]){
 
    try{
        //записывем командную строку в вектор v
        std::vector<std::string> v;
        for(int i=1; i<argc; i++)
            v.push_back(std::string(argv[i]));
 
        test t(v);   
        t.do_test(); // выполняем заданную в командной строке команду
 
    } catch(int){ std::cout << "nepravilno vvedena komandnai stroka spravka: test -h ";}
    catch(std::string e){ std::cout << "error open file   " << e; }
    catch(...) { std::cout << "error in program"; };
    
    return 0;
};


Походу вообще нечего нормального не написал, хотелось бы услашать советы!
Заранее спасибо

Добавлено через 29 минут
В более читабельном виде как то так:
test.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <string>
#include <iostream>
#include <vector>
/*хранит данные командной строки, определяет выполняемую команду*/
struct test{
    test(const std::vector<std::string>& m); 
    void do_test(); // выполняем заданную команду
private: 
    enum { povtor, checksum, help, unknow }  command;
    std::string file_in;
    std::string word; 
};
test.cpp
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
#include "test.h"
#include <fstream>
#include <bitset>
 
test::test(const std::vector<std::string>& m) : command(unknow), file_in(""), word("") {
    
    //разбиваем командную строку на составляющие
    if( m[0] != "test" ) throw int(); //генерируется исключение при неправильном задании командной строки
 
    switch(m.size()) {
    case 2 : 
        if(m[1] == "-h") command = help;
        break;
    case 7 :
        if(m[1] == "-f" && m[3] == "-m" && m[4] == "words" && m[5] == "-v"){
            command = povtor;
            file_in = m[2];
            word = m[6];}
        break;
    case 5 : 
        {
            if(m[1] == "-f" && m[3] == "-m" && m[4] == "checksum"){
                command = checksum;
                file_in = m[2];}
            break;
        }
    };
    
    if( command == unknow ) throw int(); //генерируется исключение при неправильном задании командной строки
}
 
void test::do_test(){
 
    if(command == help) {
        std::cout << " Programma prinimaet na vhod imiy faila i nabor parametrov. V zavisimosti ot parametrov programma rabotaet v treh regimah: \n" ;
        std::cout << "1.) test -f Test.txt -m words -v mother \n";
        std::cout << "pechataet kolichestvo slov <<mother>> v faile <<Test.txt>> \n";
        std::cout << "2.) test -f Test.txt -m checksum \n";
        std::cout << " pechataet 32-bit checksum, passchitannuy po algoritmu checksum = word1 + word2 + … + wordN (word1..wordN - 32-bit slova, predstavliayshie sodergimoe faila) \n";
        std::cout << "3.) test -h \n";
        std::cout << " pechataet informaciy o programme i opisanie parametrov. \n";
        return;
    }
 
    int number = 0;
    std::string slovo;
    if(command == povtor){
        std::ifstream f_in(file_in.c_str());
        if(!f_in) throw file_in;
        // за каждую итерацию извлекаем из файла по одной строке и находим в ней каждое совпадение со словом word  
        while (!f_in.eof()) {
            getline(f_in, slovo); // считываем строку
            int pos = 0;
            while (true)
            {
                pos = slovo.find(word,pos); // с позиции pos ищем совпадение 
                if (pos != std::string::npos) { // если совпадение не найдено  pos принимает знаечение string::npos
                    number++;
                    pos += word.size();
                } else break;
            }
          }
 
        std::cout << "Kolichestvo povtorov slova " + word + " ravno " << number << std::endl;
    
    } else {// случай определения checksum
        std::ifstream f_in(file_in.c_str(),std::ios_base::binary); // бинарный режим открытия файла
        if(!f_in) throw file_in;
        
        int v, s = 0;
        while(!f_in.eof())
        {
             f_in.read((char*)&v, 4); //считываем 4 байта
             s += v;
        }
 
        std::cout << " 32-bit checksum  = " << std::bitset<32>(s) << std::endl; // выводим 32-х битную чексумму в файл
        f_in.close();
    }
}
main

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "test.h"
 
int main(int argc, char* argv[]){
 
    try{
        //записывем командную строку в вектор v
        std::vector<std::string> v;
        for(int i=1; i<argc; i++)
            v.push_back(std::string(argv[i]));
 
        test t(v);   
        t.do_test(); // выполняем заданную в командной строке команду
 
    } catch(int){ std::cout << "nepravilno vvedena komandnai stroka spravka: test -h ";}
    catch(std::string e){ std::cout << "error open file   " << e; }
    catch(...) { std::cout << "error in program"; };
    
    return 0;
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2013, 19:39     Напишите (консольную) программу, принимающую на вход имя файла и набор параметров. В зависимости от параметров программа должна работать в трёх режима
Посмотрите здесь:

C++ Напишите функцию, которая принимает три числа в качестве параметров и возвращает их сумму.
C++ Что делать если в зависимости от вводимых параметров код должен меняться?
C++ Выбор типа переменной-члена класса в зависимости от параметров передаваемых конструктору
Программа должна выводить координаты отрезка в границы которого входит максимальное число отрезков подаваемых на вход C++
C++ Формирвоать имя файла в зависимости от входных параметров
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
30.05.2013, 21:56     Напишите (консольную) программу, принимающую на вход имя файла и набор параметров. В зависимости от параметров программа должна работать в трёх режима #2
Цитата Сообщение от Dmitry_Tomsk Посмотреть сообщение
Вообщем такое же задание
2gis?

Код, мягко говоря, не очень.
По мелочи:
1. Название переменных транслитом не есть хорошо.
2. Названия переменных транслитом, при этом так же присутствуют названия на английском - совсем плохо.
3. Ничего не говорящие имена переменных (например v, s)
4. Отсутствие стиля оформления кода (фигурные скобки где-то есть, где-то в той же ситуации нету, пробелы где-то есть, где-то нету и т.д.)
5. Бесполезные комментарии, например
C++
1
getline(f_in, slovo); // считываем строку
любой программист без комментария поймет, что "считываем строку".
Не по мелочи:
6. Напрочь отсутвует какая-либо архитектура. Вся логика в одном классе.
7. При этом часть логики вообще в конструктре, а в do_test() аж 3 несвязные куска кода, которые должны быть 3мя разными функциями (методами).

Вот это
Цитата Сообщение от Dmitry_Tomsk Посмотреть сообщение
C++
1
if(m[1] == "-f" && m[3] == "-m" && m[4] == "words" && m[5] == "-v"){
очень не красиво, для таких вещей есть getopt().
вот это
C++
1
2
3
4
5
        while(!f_in.eof())
        {
             f_in.read((char*)&v, 4); //считываем 4 байта
             s += v;
        }
медленно. На гигабайтном файле эта медленность уже будет заметна. Не сказать, что это такой уж косяк, т.к. в задании каких-либо требований по этому поводу нет, но все же.
Из-за всего этого код выглядет ужасно (да, именно так) и сразу выдает, что его писал человек без опыта.

Все вышенаписанное, как мне кажется, объективно. А теперь субъективно - перебор с исключениями, и вообще не стоит их так использовать (но это мое личное мнение, я их вообще не использую).

2gis, на сколько мне известно, ищет человека с опытом, поэтому думаю у тебя нет шансов.

Как исправить положение - почитать что-нибудь чисто по ООП (т.е. без привязки к С++) и постораться понять. Если над "топорно" реализованной логикой будет хорошая ООП обертка - это уже большой плюс.

P.S. может что-то еще упустил, но думаю тут найдутся желающие покритиковать код

Добавлено через 4 минуты
P.S. ты же сначала написал этот пост в моей такой же теме 2х летней давности. Почитай там комментарии форумчан о моем коде, все написанное можешь принимать на свой счет, много аналогичных ошибок.
Dmitry_Tomsk
0 / 0 / 0
Регистрация: 30.05.2013
Сообщений: 3
30.05.2013, 23:56  [ТС]     Напишите (консольную) программу, принимающую на вход имя файла и набор параметров. В зависимости от параметров программа должна работать в трёх режима #3
Да от 2gis, просто раньше я не работал в коммерческих организация, хотя много программировал как правило для многопроцессорных систем, С++ изучал самостоятельно, программа вроде простенькая там и классы та особо думаю и ненужны, написал протестил вроде все хорошо..вот спасибо за советы...кстати а как улучшить то битовое считывание из файла, просто я с этим не разбирался...встретил это однажды в книге Страуструпа, там кратко описывалось
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
31.05.2013, 17:23     Напишите (консольную) программу, принимающую на вход имя файла и набор параметров. В зависимости от параметров программа должна работать в трёх режима #4
Цитата Сообщение от Dmitry_Tomsk Посмотреть сообщение
битовое
побайтовое

Цитата Сообщение от Dmitry_Tomsk Посмотреть сообщение
а как улучшить то битовое считывание из файла
Сделать буфер по-больше и читать в него. Каждое обращение к системе (f_in.read()) это тормоза. На гигабайтном файле будет 1024*1024*1024 медленных обращения к ядру. Буфер хотя бы в 256 байт гораздо ускорит это дело.

Добавлено через 1 минуту
Цитата Сообщение от Dmitry_Tomsk Посмотреть сообщение
программа вроде простенькая там и классы та особо думаю и ненужны
Да, при чтении задания в голове сразу рисуется процедурный код. В том то и соль, чтобы сделать чисто процедурную задачу на ООП.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
31.05.2013, 17:41     Напишите (консольную) программу, принимающую на вход имя файла и набор параметров. В зависимости от параметров программа должна работать в трёх режима #5
Цитата Сообщение от Kastaneda Посмотреть сообщение
думаю тут найдутся желающие покритиковать код
Как же без этого
1. Исключения типов int, string. Если уж использовать исключения, то и классы должны быть соответствующие.
2. Магические числа. В частности в switch: 2,7,5.
3. Совершенно необязательный вызов f_in.close(); в конце блока.
P.S. Подробно код не изучал.
Dmitry_Tomsk
0 / 0 / 0
Регистрация: 30.05.2013
Сообщений: 3
31.05.2013, 20:47  [ТС]     Напишите (консольную) программу, принимающую на вход имя файла и набор параметров. В зависимости от параметров программа должна работать в трёх режима #6
Кстати я также кидал им EXE файл, это плохо?)
Yandex
Объявления
31.05.2013, 20:47     Напишите (консольную) программу, принимающую на вход имя файла и набор параметров. В зависимости от параметров программа должна работать в трёх режима
Ответ Создать тему
Опции темы

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