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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Арсен_
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 27
#1

Проверка равенства символов. Оптимизировать код - C++

07.12.2012, 11:57. Просмотров 829. Ответов 12
Метки нет (Все метки)

Добрый день, есть задача, я срузу напишу что надо сделать:

во входном файле в первой строке дано число n - где 1 >= n <= 1000, а в остальных n строках, строки длину от 1 до 30 символов. Надо проверить первый символ равно 4 символу?
И вывести в выходной файл, сколько строк удовлетвояют данному условию.

Я решаю таким способом:
C++
1
2
3
4
5
6
7
8
9
10
#include <fstream>
 
main()
{
    std::fstream I("input.txt"), O("output.txt", 2);
    char k[31]; int p = 0;
    while(I >> k)
        if(k[0] == k[3]) p++ ;
    O << p;
}
Мне надо сократить код как можно меньше, в длине кода пробелы и переносы строк не счетаются.
В данном коде 121 символ. Я знаю что 100% данный код сократить или реализовать по другому до 111 символов.
Но не как не пойму что тут еще можно сократить или как можно еще короче реаззовать?

За помощь буду благодарен.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nik Raider
28 / 28 / 7
Регистрация: 03.02.2012
Сообщений: 59
07.12.2012, 12:11     Проверка равенства символов. Оптимизировать код #2
Ну раз просто меньше символов, то имена файлов сделай проще i.txt и o.txt и вот -9 символов

Добавлено через 3 минуты
и зачем k[31] ? Это обязательно? Если может не двузначное, а однозначное, вот и еще 1 символ. Итого 111 =)
diagon
Higher
1924 / 1190 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
07.12.2012, 12:23     Проверка равенства символов. Оптимизировать код #3
На коленке
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <fstream>
 
int p; 
 
main()
{
    std::fstream I("input.txt"), O("output.txt", 2);
    char k[31]; 
    while(I >> k)
        p += *k == k[3];
    O << p;
}
Вижу еще 1 символ, но его открывать не буду.

Добавлено через 2 минуты
И еще один символ вижу. Замените while на for, возможно увидите.
Арсен_
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 27
07.12.2012, 12:39  [ТС]     Проверка равенства символов. Оптимизировать код #4
Спасибо вам большое))

вот сократил до 13 символов

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <fstream>
 
int p;
 
main()
{
    std::fstream I("input.txt"), O("output.txt", 2);
    char k[50]; 
    for(;I >> k;)
         p += *k == k[3];
    O << p;
}
т.к я только учу с++, у меня возникло пару вопросов))

почему у нас все работает правильно при не инициализации переменной p?
И в вырожении p += *k == k[3]; где указатель на массив k, мы получаем нулевой элемент?

Еще как вы посоветовали, создавать массив напиример до 5 элементов, char k[5]; то у меня выдает ошибку.

Может надо как то построчно считывать по 5 символов?

Добавлено через 2 минуты
Цитата Сообщение от Nik Raider Посмотреть сообщение
Ну раз просто меньше символов, то имена файлов сделай проще i.txt и o.txt и вот -9 символов

Добавлено через 3 минуты
и зачем k[31] ? Это обязательно? Если может не двузначное, а однозначное, вот и еще 1 символ. Итого 111 =)
спасибо,
в сожелению задача проверяется сервером, а на сервере названия файлов input.txt/output.txt
Croessmah
Модератор
Эксперт CЭксперт С++
12878 / 7264 / 810
Регистрация: 27.09.2012
Сообщений: 17,950
Записей в блоге: 2
Завершенные тесты: 1
07.12.2012, 12:39     Проверка равенства символов. Оптимизировать код #5
Цитата Сообщение от Арсен_ Посмотреть сообщение
Еще как вы посоветовали, создавать массив напиример до 5 элементов, char k[5]; то у меня выдает ошибку.
В строке от 1 до 30 символов.
diagon
Higher
1924 / 1190 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
07.12.2012, 12:40     Проверка равенства символов. Оптимизировать код #6
Цитата Сообщение от Арсен_ Посмотреть сообщение
почему у нас все работает правильно при не инициализации переменной p?
Потому что она инициализирована. Все переменные в глобальной области видимости инциализированы их умолчательным значением, в данном случае нулем.
Цитата Сообщение от Арсен_ Посмотреть сообщение
где указатель на массив k, мы получаем нулевой элемент?
Имя массива - это указатель на его первый элемент. Разименовывая этот указатель, мы получаем его первый элемент.

Цитата Сообщение от Арсен_ Посмотреть сообщение
Может надо как то построчно считывать по 5 символов?
Нет, размер массива тут не играет роли. Подумайте, где можно объявить ваш массив, чтобы не ставить точку с запятой.
Арсен_
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 27
07.12.2012, 12:47  [ТС]     Проверка равенства символов. Оптимизировать код #7
A ну даа, спасибо

C++
1
2
3
4
5
6
7
8
9
10
11
#include <fstream>
 
int p;
 
main()
{
    std::fstream I("input.txt"), O("output.txt", 2);
    for(char k[50];I >> k;)
         p += *k == k[3];
    O << p;
}
1 символ остался))

я вот подумал, если не использовать массив а 2 паремнных символьного типа,

тоесть char a,b; и первый символ считывать в "a" а второй в "b", или так не получиться?
diagon
Higher
1924 / 1190 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
07.12.2012, 12:52     Проверка равенства символов. Оптимизировать код #8
Цитата Сообщение от Арсен_ Посмотреть сообщение
тоесть char a,b; и первый символ считывать в "a" а второй в "b", или так не получиться?
не получиться

Цитата Сообщение от Арсен_ Посмотреть сообщение
1 символ остался))
Тут уже гадать бессмысленно, надо просто знать одну фишку, специфичную для студии.
Я вам ее не скажу, так как у меня в этой задаче 111 символов, и я не заинтересован в том, чтобы меня догоняли :)
Croessmah
Модератор
Эксперт CЭксперт С++
12878 / 7264 / 810
Регистрация: 27.09.2012
Сообщений: 17,950
Записей в блоге: 2
Завершенные тесты: 1
07.12.2012, 12:54     Проверка равенства символов. Оптимизировать код #9
Цитата Сообщение от Арсен_ Посмотреть сообщение
спасибо,
в сожелению задача проверяется сервером, а на сервере названия файлов input.txt/output.txt
а ссыль можно? =)
Арсен_
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 27
07.12.2012, 13:00  [ТС]     Проверка равенства символов. Оптимизировать код #10
> а ссыль можно? =) конечно) [нельзя]

Кликните здесь для просмотра всего текста
Левая рекурсия
(Время: 1 сек. Память: 16 Мб Сложность: 20%)
В теории формальных грамматик и автоматов (ТФГиА) важную роль играют так называемые контекстно-свободные грамматики (КС-грамматики). КС-грамматикой будем называть четверку, состоящую из множества N нетерминальных символов, множества T терминальных символов, множества P правил (продукций) и начального символа S, принадлежащего множеству N.

Каждая продукция p из P имеет форму A –> a, где A нетерминальный символ (A из N), а a – строка, состоящая из терминальных и нетерминальных символов. Процесс вывода слова начинается со строки, содержащей только начальный символ S. После этого на каждом шаге один из нетерминальных символов, входящих в текущую строку, заменяется на правую часть одной из продукций, в которой он является левой частью. Если после такой операции получается строка, содержащая только терминальные символы, то процесс вывода заканчивается.

Во многих теоретических задачах удобно рассматривать так называемые нормальные формы грамматик. Процесс приведения грамматики к нормальной форме часто начинается с устранения левой рекурсии. В этой задаче мы будем рассматривать только ее частный случай, называемый непосредственной левой рекурсией. Говорят, что правило вывода A –> R содержит непосредственную левую рекурсию, если первым символом строки R является A.

Задана КС-грамматика. Требуется Найти количество правил, содержащих непосредственную левую рекурсию.

Входные данные

Первая строка входного файла INPUT.TXT содержит количество n (1 <= n <= 1000) правил в грамматике. Каждая из последующих n строк содержит по одному правилу. Нетерминальные символы обозначаются заглавными буквами латинского алфавита, терминальные - строчными. Левая часть продукции отделяется от правой символами –>. Правая часть продукции имеет длину от 1 до 30 символов.

Выходные данные

В выходной файл OUTPUT.TXT выведите ответ на задачу.

Пример

Код
№	INPUT.TXT	OUTPUT.TXT
1	    3
        S->Sabc
        S->A
        A->AA	              2


там условие задачи очень сложно написано, мне пришлось более 10 раз перечитывать)) а решение простое.

> Тут уже гадать бессмысленно, надо просто знать одну фишку, специфичную для студии.
Я вам ее не скажу, так как у меня в этой задаче 111 символов, и я не заинтересован в том, чтобы меня догоняли


Вмысле для студии? на остальных компилях пахать не будет? А на сервере на студии задачи проверяются?

Можете пожалуйста сказать это фишку? даю слово не применять ее в данной задаче!
просто очень любопытно.
Croessmah
Модератор
Эксперт CЭксперт С++
12878 / 7264 / 810
Регистрация: 27.09.2012
Сообщений: 17,950
Записей в блоге: 2
Завершенные тесты: 1
07.12.2012, 13:14     Проверка равенства символов. Оптимизировать код #11
Цитата Сообщение от Арсен_ Посмотреть сообщение
а ссыль можно? =) конечно)
А ID задачи? Просто по приведенной ссылке нет задачи
Арсен_
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 27
07.12.2012, 13:20  [ТС]     Проверка равенства символов. Оптимизировать код #12
просто скопируйсте и вставьте, ЗАДАЧА №387
Кликните здесь для просмотра всего текста
Левая рекурсия
(Время: 1 сек. Память: 16 Мб Сложность: 20%)
В теории формальных грамматик и автоматов (ТФГиА) важную роль играют так называемые контекстно-свободные грамматики (КС-грамматики). КС-грамматикой будем называть четверку, состоящую из множества N нетерминальных символов, множества T терминальных символов, множества P правил (продукций) и начального символа S, принадлежащего множеству N.

Каждая продукция p из P имеет форму A –> a, где A нетерминальный символ (A из N), а a – строка, состоящая из терминальных и нетерминальных символов. Процесс вывода слова начинается со строки, содержащей только начальный символ S. После этого на каждом шаге один из нетерминальных символов, входящих в текущую строку, заменяется на правую часть одной из продукций, в которой он является левой частью. Если после такой операции получается строка, содержащая только терминальные символы, то процесс вывода заканчивается.

Во многих теоретических задачах удобно рассматривать так называемые нормальные формы грамматик. Процесс приведения грамматики к нормальной форме часто начинается с устранения левой рекурсии. В этой задаче мы будем рассматривать только ее частный случай, называемый непосредственной левой рекурсией. Говорят, что правило вывода A –> R содержит непосредственную левую рекурсию, если первым символом строки R является A.

Задана КС-грамматика. Требуется Найти количество правил, содержащих непосредственную левую рекурсию.

Входные данные

Первая строка входного файла INPUT.TXT содержит количество n (1 <= n <= 1000) правил в грамматике. Каждая из последующих n строк содержит по одному правилу. Нетерминальные символы обозначаются заглавными буквами латинского алфавита, терминальные - строчными. Левая часть продукции отделяется от правой символами –>. Правая часть продукции имеет длину от 1 до 30 символов.

Выходные данные

В выходной файл OUTPUT.TXT выведите ответ на задачу.

Пример

№ INPUT.TXT OUTPUT.TXT
1 3
S->Sabc
S->A
A->AA 2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2014, 20:55     Проверка равенства символов. Оптимизировать код
Еще ссылки по теме:

C++ Оптимизировать и минимализировать код
C++ Как оптимизировать код, со множеством операторов if?
Исправить и оптимизировать код C++
Оптимизировать код C++
Составить блок-схему и оптимизировать код C++

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

Или воспользуйтесь поиском по форуму:
костя666674555
-94 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 78
02.01.2014, 20:55     Проверка равенства символов. Оптимизировать код #13
почему неработает такой код?
C++
1
2
3
4
5
6
7
8
9
10
11
#include <fstream>
 
 
main()
{
int p;
    std::fstream I("input.txt"), O("output.txt", 2);
    for(char k[50];I >> k;)
         p += *k == k[3];
    O << p;
}
Yandex
Объявления
02.01.2014, 20:55     Проверка равенства символов. Оптимизировать код
Ответ Создать тему
Опции темы

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