Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
iovomod
39 / 39 / 9
Регистрация: 05.01.2013
Сообщений: 305
Записей в блоге: 3
1

K&R 2.2 Напишите цикл, не используя || и &&

23.09.2013, 23:10. Просмотров 677. Ответов 7
Метки нет (Все метки)

эквивалентный этому циклу
C
1
2
for (i = 0; i < lim-1 && (c=getchar()) != '\n' && c != EOF; ++i)
        s[i] = c;
Есть вот такое решение, прошу пояснить некоторые моменты с нулями...

C
1
2
3
4
5
6
7
8
9
10
11
12
#define lim 80
 
int main()
{
        int i, c;
        char s[lim];
 
        for(i=0; i<lim-1 ? (c=getchar()) != '\n' ? c != EOF : 0 : 0 ; ++i) // не понимаю с нулями манипуляции
                s[i] = c;
        
        return s[i] ^= s[i];
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2013, 23:10
Ответы с готовыми решениями:

Что делает эта строчка: ++x &amp;&amp; ++y || ++z; ?
Что делает эта строчка? ++x &amp;&amp; ++y || ++z;

Переписать цикл без использования операторов && и ||
Нижеприведенный цикл нужно написать без использования операторов &amp;&amp; и || : ...

В чем отличие & и && ?
В чем отличие &amp; и &amp;&amp; ? например if (px == x &amp;&amp; py == y) и if (px...

Матрица. Подсчитать количество строк, ВСЕ элементы которых >=6 && <=8
Дан табель отметок. Нужно посчитать количество хорошистов. (Отметки &gt;=6 &amp;&amp; &lt;=8)...

Каким можно заменить операцию &&
Приветствую #include&lt;stdio.h&gt; int main (void) { int a=5;b=60;c; c=a&amp;&amp;amp;b;...

7
fanatdebian
Z3JheSBoYXQ=
339 / 234 / 83
Регистрация: 08.07.2012
Сообщений: 577
24.09.2013, 00:25 2
Цитата Сообщение от iovomod Посмотреть сообщение
эквивалентный этому циклу
C
1
2
for (i = 0; i < lim-1 && (c=getchar()) != '\n' && c != EOF; ++i)
        s[i] = c;
Есть вот такое решение, прошу пояснить некоторые моменты с нулями...

C
1
2
3
4
5
6
7
8
9
10
11
12
#define lim 80
 
int main()
{
        int i, c;
        char s[lim];
 
        for(i=0; i<lim-1 ? (c=getchar()) != '\n' ? c != EOF : 0 : 0 ; ++i) // не понимаю с нулями манипуляции
                s[i] = c;
        
        return s[i] ^= s[i];
}
Проверяем если текущий счетчик меньше размера буфера ( условие истинно ) выполняем функцию-сравнение ( c=getchar())) и сравниваем результат функции с !='\n' или EOF. Т.к. используется тернарка, то для корректности надо указать возвращаемое значение для обеих случаев true или false. Т.к. в данном случае оба случая являются основанием завершения цикла то указаны 0.

Все очень легко на самом деле. Зачастую народ на ровном месте изобретает ненужные по сложности конструкции, там где можно сделать значительно проще и нагляднее.
1
Qwertiy
821 / 629 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
24.09.2013, 12:48 3
Другой вариант - использовать 2 if'а
0
easybudda
Модератор
Эксперт CЭксперт С++
10147 / 6054 / 1521
Регистрация: 25.07.2009
Сообщений: 11,476
24.09.2013, 15:40 4
Цитата Сообщение от iovomod Посмотреть сообщение
for (i = 0; i < lim-1 && (c=getchar()) != '\n' && c != EOF; ++i)
C
1
for (i = 0; ( i < lim-1 ) * ( (c=getchar()) != '\n' ) * ( c != EOF ); ++i)
0
Qwertiy
821 / 629 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
24.09.2013, 16:16 5
easybudda, умножение выполняет все части, соответственно getchar будет вызываться всегда, в отличие от остальных вариантов (это я про выход из цикла по максимальной длине).
0
easybudda
Модератор
Эксперт CЭксперт С++
10147 / 6054 / 1521
Регистрация: 25.07.2009
Сообщений: 11,476
24.09.2013, 16:22 6
Цитата Сообщение от Qwertiy Посмотреть сообщение
getchar будет вызываться всегда
Ну это - да, но учитывая, что читается значение во временную переменную, а не в очередной элемент массива сразу, за границы массива всё равно не выйдет. Хотя можно придумать ситуацию, где это действительно будет проблемой. За то так проще...
0
Qwertiy
821 / 629 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
24.09.2013, 16:42 7
Цитата Сообщение от easybudda Посмотреть сообщение
а не в очередной элемент массива сразу, за границы массива всё равно не выйдет
Оно по-любому не выйдет, т. к. там резервируется место на завершающий '\0', которым (при соответствующем коде) этот лишний символ можно переписать
А вот непонятное пропадание одного из вводимых символов - это странно.

PS: А вообще для этой цели я бы просто использовал scanf
0
easybudda
Модератор
Эксперт CЭксперт С++
10147 / 6054 / 1521
Регистрация: 25.07.2009
Сообщений: 11,476
24.09.2013, 17:18 8
Цитата Сообщение от Qwertiy Посмотреть сообщение
А вот непонятное пропадание одного из вводимых символов - это странно.
И это лечится путём хитрого нагромождения проверок и getc()/ungetc(). Но по сути способ не правильный, согласен. Цель была от && уйти... А так ещё вариант:
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
#include <stdio.h>
 
#define SIZE (10)
 
int main(void) {
    int ch, i;
    char buf[SIZE];
    
    i = 0;
    while ( 1 ) {
        switch ( i < SIZE - 1 ) {
            case 0 :
                buf[i] = '\0';
                printf("%s", buf); // ну или что там с полученной строкой делать нужно...
                i = 0;
                break;
            default :
                switch ( ch = getchar() ) {
                    case '\n' :
                        buf[i] = '\0';
                        printf("%s\n", buf);
                        i = 0;
                        break;
                    case EOF :
                        buf[i] = '\0';
                        printf("%s\n", buf);
                        return 0;
                    default :
                        buf[i++] = ch;
                }
        }
    }
}
0
24.09.2013, 17:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2013, 17:18

Ошыбка в if(e==' ')&&(e<'a')&&(e>'z')
Задача: Нужно найти для заданого текста длину максимальной серии символов,...

Упражнение 5.10. Напишите программу expr( K&R)
Условие: Напишите программу expr, интерпретирующую обратную польскую запись...

Используя только scanf ("% c", & s) ввести заданное действительное число
Используя только символьный ввод, то есть функцию scanf (&quot;% c&quot;, &amp; s), где s -...


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

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

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