41

(3 відповідей, залишених у Java)

Добрий ранок.

Є поставлена задача, написати олімпіадну задачу, в деталі завдання вдаватися не буду, тому що хочу зробити сам, можливо потім, якщо буде повний ступор то поділюся думками.

Щодо заголовку теми... Як вже зрозуміло, я пишу на Java, в середовищі Eclipse.

Виникло таке питання: "Як зчитати дані рядкового типу з пропусками?".

Не так давно була практика по Java, де нам розповіли про такий клас, як Scanner. Цей клас зчитує майже все ідеально окрім одного моменту, зчитування рядка.

Приклади використання Scanner
Scanner scan = new Scanner(System.in);
int n = scan.nextInt(); // Зчитування цілого числа
String str = scan.next(); // Зчитування рядка без пропусків
String str_spaced = scan.nextLine(); // Зчитування рядка з пропусками

Примітка: scan.next() не може зчитати рядок такого формату: "слово1 слово2 слово3" і т.д., точніша кажучи відбудеться така ось штука, якщо вивести результат зчитування: "слово1".

Хто цього не знає, або якщо комусь цікаво, ось загальне рішення зчитування

Знайшов також таку ось штуковинку.

Так до чого я це все пишу? В мене виникло питання щодо метода .nextLine().
Використовую в такому контексті:

Код
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Scanner scan = new Scanner(System.in);
        
            System.out.print("Input count of rows: ");
            int n = scan.nextInt();
            String line = null;
        
            for (int i = 0; i < n; i++) {
                System.out.print("logans@logans:~$ ");
                line = scan.nextLine();
            }        
        }

В результаті отримую ось таку картину:

Результат
Input count of rows: 6
logans@logans:~$ logans@logans:~$ й
logans@logans:~$ ц
logans@logans:~$ у
logans@logans:~$ к
logans@logans:~$ е

Тобто на першій ітерації циклу, зчитує, здається "\n", а потім працює нормально.
Тому і звертаюся до вас по допомогу.

Якщо хтось зрозумів чи згадав, що це за завдання то я попрошу не світити його тут, можна запитати мене в пп.

Дякую за увагу, в мене все.  :)

42

(2 відповідей, залишених у C++)

koala написав:

Обробляйте, що повертає RegGetValue.
Ну і ніби

RegGetValue(keyHandle, NULL, "InstallDir", RRF_RT_ANY, NULL, (LPBYTE)&value, &value_length);

Другий параметр - підключ, третій - назва змінної.

Нічого не змінилося.

43

(2 відповідей, залишених у C++)

Добрий вечір.

Знову окремий випад, чи то мого нерозуміння, чи ще чогось. Коротше кажучи...

Завдання: Розробити програму, яка отримує з реєстра інформацію про одну з апаратних складових та одне з програмних налаштувань.

Пояснення: Зчитати з реєстру Windows дані про апаратне забезпечення та інформацію про якусь програму.
В моєму випадку:
    - апаратне забезпечення - Identifier процесора (Intel64 Family 6 Model 23 Stepping 10, наскільки я        розумію це щось типу марки процесора);
    - програма - шлях до VirtualBox.exe (C:\Program Files\Oracle\VirtualBox\).

Рішення: Скористався наступними джерелами:
  - http://www.dreamincode.net/forums/topic … -key-in-c/
  - http://stackoverflow.com/questions/3413 … y-properly
  - http://social.msdn.microsoft.com/Forums … =vcgeneral
  - http://stackoverflow.com/questions/6308 … e-question
  - Та на MSDN переглянув синтаксис функцій.

Код рішення
#include <iostream>
#include <Windows.h>
#include <WinReg.h>

using namespace std;

int main()
{
    HKEY keyHandle;
    char value[35];
    DWORD value_length = 35;
    DWORD Type;

    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Oracle\\VirtualBox", 0, KEY_QUERY_VALUE, &keyHandle) == ERROR_SUCCESS)
    {
        //RegQueryValueEx(keyHandle, "InstallDir", NULL, (LPDWORD)REG_SZ, (LPBYTE)&value, &value_length);
        RegGetValue(keyHandle, "SOFTWARE\\Oracle\\VirtualBox", "InstallDir", RRF_RT_ANY, NULL, (LPBYTE)&value, &value_length);
        
        cout << value << endl;
    } else
        cout << "Error!" << endl;
    
    RegCloseKey(keyHandle);

    system("pause");
    return 0;
}

Я намагався використати функції RegQueryValueEx(...) та RegGetValue(...) в обох випадках результат однаковий.

Щодо KEY_QUERY_VALUE, наскільки я зрозумів, це щось типу рівня доступу до реєстру цієї гілки, можливо це не так, але я ще використовув: KEY_ALL_ACCESS (перелік різновидів).

Результат: Умова If'a не виконується, а навіть якщо без неї, то результат - рандом з оперативної пам'яті.

Результат коли if закоментований

[img]http://cdn.домен агресора/uploads/prod/2014/05/03/09c/539/9fab20ee49a850540fe298b98d57b02d6c92b7f6.jpg[/img]

44

(13 відповідей, залишених у C++)

koala написав:

В такому разі... хм... або програма запускається не з того каталогу, або ця функція вже чомусь не підтримується в такій формі (наприклад, через кодування символів) і, щоб її використати, треба докласти зусилля, цілком співставні з парсингом ini-файлу руками.

Тобто краще вже зробити в Delphi, або в Borland C++ (вимог до мови написання та середовища немає).

45

(13 відповідей, залишених у C++)

koala написав:

Тоді, будь ласка,
1. Спробуйте писати в файл, якого ще не існує. Він створився? Можливо, крапки з комами некоректно обробляються.
2. Обробляйте помилки:

bool writtenGood = WriteToIni("simple.ini", "Form_Settings", "Width", FormWidht.c_str());
if( !writtenGood )
{
  printf( "Writing INI failed with 0x%x\n", GetLastError() );
}

Код шукайте на MSDN (або навіть виводьте одразу текст помилки)

1. Спробував, не створився.
2. Обробив, але умова не виконалась, writtenGood = true.

46

(13 відповідей, залишених у C++)

0x9111A написав:

Як сказав koala ти не скопіював FormWidht в CharValue.
Але тут можна обійтись взагалі без CharValue так як в std::string є метод для отримання char*

Тож спробуй отак

WriteToIni("simple.ini", "Form_Settings", "Width", FormWidht.c_str());

Ну взагалі .c_str() переводить в const char* (як каже VS2010). Зробив я це, але в результаті нічого нового не сталося, значення так і не записалось.

47

(13 відповідей, залишених у C++)

0xDADA11C7 написав:

Фукнції для роботи з іні файлами у вінді вже років 15 як deprecated, альтернатива - реєстр.

Для реєстру в мене буду інша лаба)

48

(13 відповідей, залишених у C++)

Bartash написав:

А чим стандартні *fstream не підійшли?

Можливо і підійдуть, але це більше вже як альтернатива. Все-ж-таки хочеться дізнатися як працювати з ini файли через створені для цього функції.

49

(13 відповідей, залишених у C++)

Добрий вечір.

Завдання: Створити програму, яка повинна пам'ятати розмір та положення вікна, а також вміст поля введення та перемикача.

Пояснення: Тобто форма, на якій розміщений textBox та checkBox. Записувати в *.ini файл this->width/this->height/textBox->Text/checkBox->Checked та відповідно зчитувати.

Реалізація: Знайшов декілька прикладів, взяв за основу цей: http://2lx.ru/2010/02/chtenie-i-zapis-ini-fajlov-v-visual-c/ . Створив біля *.exe-файлу (проекта) та біля *.h-головної форми файли simple.ini

Зміст цих файлів
[Form_Settings]
Width =  ;
// Це типу закоментовані рядки
;Height =  ;
;TextBox_Text = ;
;CheckBox_Checked =  ;
;Position =  ; 

Далі намагаюсь записати ширину форми в поданий файл.

Код запису в *.ini файл
    /*Переведення з System::String^ в std::string*/
    private: std::string sysStringToStdString(System::String^ systemString) {
                 std::string newString = msclr :: interop :: marshal_as <std::string> (systemString);
                 return newString;
             }
    /*Функція запису в *.ini файл*/
    private: bool WriteToIni(char *filename, char *section, char *key, char* data) {
                 return WritePrivateProfileString((LPCWSTR)section, (LPCWSTR)key, (LPCWSTR)data, (LPCWSTR)filename);
             }

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                 // Ширина поля переведена з int в string                 
                 string FormWidht = sysStringToStdString(this -> Width.ToString());
                 // та в char*                 
                 char* CharValue = new char[FormWidht.size() + 1]; 
                 WriteToIni("simple.ini", "Form_Settings", "Width", CharValue);
             }

Проблема: Як ви вже зрозуміли, проблема в тому, що в файл нічого не записується. Помилок при компіляції не вибиває.

50

(25 відповідей, залишених у C++)

koala написав:

Ви мій профіль на linkedin побачити хочете?

Чесно кажучи цікаво подивитися)

P.S. Пізно побачив коментар Cyan та кнопку "Видалити" не знайшов, вибачте.

51

(10 відповідей, залишених у C++)

koala дуже вам дякую. Проблему з масивами вирішив, використавши пунк №2 який ви описали вище.

пункт №2

[img]http://cdn.домен агресора/uploads/prod/2014/03/30/f6d/cf0/b263ffaf5fb5ce1befa3fd145e05df3a5fc4cdef.jpg[/img]

52

(10 відповідей, залишених у C++)

koala написав:

1. Потенційна проблема: кількість слів випливає з тексту, а якщо випадково передати неправильну кількість - що буде?
2. Код жахливий, але то біс з ним.
3. Нащо передавати параметром методу класу елемент класу? Метод і так знає, які в класі елементи.
4. Де саме вони передаються? Не бачу. Який файл, який рядок?

1. Кількість слів рахується та передається правильно.
2. Чи це в оформленні, чи і логіці коду? Скажіть будь-ласка, як можна зробити його не таким жахливим?
3. Виправив, дякую.
4. Це відбувається в головній програмі а саме:

Одна з процедур головної форми
MainText* originalText = new MainText;
ShingleText* originalShingles = new  ShingleText;

MainText* suspectText  = new MainText;
ShingleText* suspectShingles = new  ShingleText;

CheckText* Check = new CheckText;

string originalTemp = sysStringToStdString(richTextBox1 -> Text);
string suspectTemp  = sysStringToStdString(richTextBox2 -> Text);

/*--------------------------------------------------------------------*/

originalText -> setInputText(originalTemp);
originalText -> changeText();
originalText -> setWordCount(originalText -> getInputText());
originalShingles -> createShingles(originalText -> getInputText(), 
                                   originalText -> getWordCount());
originalShingles -> sortArrayShingle();

/*--------------------------------------------------------------------*/

suspectText -> setInputText(suspectTemp);
suspectText -> changeText();
suspectText -> setWordCount(suspectText  -> getInputText());
suspectShingles -> createShingles(suspectText  -> getInputText(), 
                                  suspectText  -> getWordCount());
suspectShingles -> sortArrayShingle();

/*--------------------------------------------------------------------*/

Check -> setArrayResult(originalShingles -> getShingle(), 
                        suspectShingles -> getShingle(), 
                        originalShingles -> getShingleSize(), 
                        suspectShingles -> getShingleSize());

53

(10 відповідей, залишених у C++)

koala написав:

Переглянув файл - там нема таких класів і функцій. Ви певні, що то саме воно?

Те, що я показував раніше - загальний приклад, я гадав, що цього вистачить.
Те, що я представив в архіві - мої оригінальні класи і функції, які я використовую.

В ідеалі вони повинні працювати таким чином:
  1. В класі ShingleText, в метод createShingles передається текст і кількість слів тексту;
  2. Текст розбивається на послідовність слів (шингли) і записується в масив;
  3. Масив сортується;
  4. Масив і довжина масиву передається в клас CheckText в функцію setArrayResult.

І як я вже казав, в теорії передається лише перший елемент масиву.

54

(10 відповідей, залишених у C++)

Bartash вибачаюсь за таку помилку, я навів це як приклад, в мене масив заповнюється по іншому.
0x9111A в мою функцію (не ту яку я тут написав) передається 2 масива і їхні розміри, але проблема в тому, що передається лише перший елемент масиву.
koala приношу свої вибачення за неповні дані.

Ось архів з кодами класів:

55

(10 відповідей, залишених у C++)

Добрий день.

Виникло питання про передачу та отримання масива функціями.
В мене є метод, який приймає текст і розбиває його на деяку послідовність слів записуючи в масив.
Далі для перевірки масиву мені потрібно його передати в іншу функцію, яка знаходиться в іншому класі.

Приклад:

Створення масиву
void FirstClass :: setArray() {
    array[5] = {0, 1, 2, 3, 4};
}
Функція, яка повертає масив
int* FirstClass :: getArray() {
    return array;
}
Функція, яка отримує масив
void CheckClass :: checkArray(int* array) {
    /* Будь-які дії */
}

Проблема в тому, що функція, яка повинання виконувати дії над масивом, приймає лише його перший елемент.

56

(1 відповідей, залишених у C++)

Добрий вечір) Давно мене тут не було, вирішив взятися за голову самостійно та і лаби самому цікавіше було робити :)

У ході створення курсового проекту, а саме інтерфейсу Windows Forms виникли проблеми з перетворенням рядкових типів.
Так як компоненти типу textBox використовують String^, а в мене створений клас який працює з простим string, виникло питання, як можна перетворити з string в String^ і навпаки (System::String^ в std::string).

Ось частина коду де потрібно використати це перетворення.

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
{
    Vocabulary Word;
    string resultOfSearch;
    String^ eng = textBox1 -> Text;

    /* Тут повинно конвертувати з System::String^ в std::string */

    Word.searchWord(eng);
    resultOfSearch = word.getUkr();

    /* Тут повинно конвертувати з std::string в System::String^ */

    textBox2 -> Text = resultOfSearch;
}

Vocabulary - клас, який містить методи string SearchWord(string) та void getUkr().
Результати Гугління нічого зрозумілого не дали.  :(

57

(354 відповідей, залишених у Інше)

Прихований текст

http://cdn.домен агресора/uploads/prod/2014/02/13/6c2/8e4/9a07528b6893c605eb3bd8b1f0deba1f4e1c5c99.jpg

Можливо ви можете представити скріни, на яких буде видно ваші дії?
Якщо ні, то можу сказати так, якщо пише, що він активований то є 2 варіанта:
1. Хтось його вже активував.
2a. Він в вас активований і знаходиться в Бібліотеці.
2б. Ви якось не правильно активуєте.

Нічого нового з цього приводу сказати не можу)

59

(42 відповідей, залишених у Розваги та гумор)

koala написав:
Chemist-i написав:

Мої телепатичні здібності наближаються до нуля, Ви пишете операційну систему? Назвали її Джинз? І вона, що, висне? можна код подивитись?

Та ні, я ж кажу - лабораторку пишу! Ось код:

program Laba1;
begin
  writeln(2+2);
end.

То можливо синій екран який ви бачите - це фон компілятора Pascal?

60

(42 відповідей, залишених у Розваги та гумор)

koala написав:

Я ж написав, що мені треба лабораторку зробити. От її і робив.

Добре, "лабораторка" на якій мові програмування? (Тільки не кажіть, що на комп'ютерній)

koala написав:

Я натискав, щоб лабораторку зробити по програмуванню, і на синьому екрані в мене помилка!

Наскільки я зрозумів, ваша помилка "Error NONAME00", можливо після цих магічних цифр йде ще якийсь текст? Наприклад ось так.

Error NONAME00.CPP 1: Unable to open include file 'IOSTREAM.H' 
Error NONAME00.CPP 2: Unable to open include file 'CONIO.H' 
Error NONAME00.CPP 5: Function 'clrscr' should have a prototype 
Error NONAME00.CPP 6: Undefined symbol 'cout' 

koala написав:

Вже замінив, а звідки ви здогадалися?

Я дуже радий за вас.
В мене дар, майже в усіх людей, які якимось чином пов'язані з програмуванням і ресурсами, які допомогають новачкам у програмуванні, мають екстрасенсорні здібності.