Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2011, 12:26   #21
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Почему Вы решили, что она должна выводить слова столбиком? Покажите это место в программе.

Я тоже делал это упражнение, но пока Вам не буду подсказывать. Напишите, что непонятно. Какие ошибки выдаёт компилятор?

Последний раз редактировалось 8Observer8; 12.08.2011 в 12:35.
8Observer8 вне форума Ответить с цитированием
Старый 12.08.2011, 12:37   #22
Glatos
Пользователь
 
Регистрация: 15.07.2011
Сообщений: 25
По умолчанию

ну я пробывал по разному, но чё-то не выходит, вот последний раз вот здесь вот поставил перевод строки =)

++nw "\n";
я знаю каратэ, дзюдо, канфу.... и много других страшных слов
Glatos вне форума Ответить с цитированием
Старый 12.08.2011, 12:44   #23
Glatos
Пользователь
 
Регистрация: 15.07.2011
Сообщений: 25
По умолчанию

сейчас точно не скажу, но компилятор говорит, что-то типа "этот символ тут не в тему"
я знаю каратэ, дзюдо, канфу.... и много других страшных слов
Glatos вне форума Ответить с цитированием
Старый 12.08.2011, 13:48   #24
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Вам рановато делать это упражнение:
Цитата:
Упражнение 1.12 Напишите программу для вывода входного потока по одному слову в строке
Сначала нужно хорошо разобраться с примером:
Код:
#include <stdio.h>
#include <locale.h>

#define IN 1    /* внутри слова */
#define OUT 0   /* снаружи слова */

/* подсчёт строк, слов и символов во входном потоке */
int main () {
    setlocale(LC_ALL, "Russian");

    printf("Подсчёт строк, слов и символов во входном потоке\n");

    int c, nl, nw, nc, state;

    nl = nw = nc = 0;
    state = OUT;
    while ((c = getchar()) != EOF) {
        ++nc;
        if (c == '\n') {
            ++nl;
        }
        if (c == ' ' || c == '\n' || c == '\t') {
            state = OUT;
        } else if (OUT == state) {
            ++nw;
            state = IN;
        }
    }
    printf("nc = %d, nl = %d, nw = %d\n", nc, nl, nw);

    return 0;
}
P.S. Пишите какие строчки вызывают вопросы.

Последний раз редактировалось 8Observer8; 12.08.2011 в 13:53.
8Observer8 вне форума Ответить с цитированием
Старый 14.08.2011, 11:16   #25
Glatos
Пользователь
 
Регистрация: 15.07.2011
Сообщений: 25
По умолчанию

У меня в учебнике программа выглядит немного по проще, я расскажу как понимаю её

Код:
#include <stdio.h>
#include <locale.h> //* подгрузка файлов с описанием переменных и функций, в учебнике только stdio.h

#define IN 1    /* внутри слова */
#define OUT 0   /* снаружи слова */ /*указание констант буквенно, если их значение изменить здесь, оно изменится во всей программе */

/* подсчёт строк, слов и символов во входном потоке */
main () {

    int c, nl, nw, nc, state; /* объявление переменных */

    state = OUT; /* начальное нахождение программы вне слова */

    nl = nw = nc = 0; /* начальные значения переменных для подсчёта */

    while ((c = getchar()) != EOF) { /* пока получаемый символ не равен EOF */
        ++nc;                                 /* прибавлять +1 к nc (подсчёт символов)*/
        if (c == '\n') {  /*если получаемый символ равен символу конца строки */
            ++nl;                              /* прибавлять +1 к nl (подсчёт строк)*/
        }
        if (c == ' ' || c == '\n' || c == '\t') { /* если получаемый сивол равен пробелу */
            state = OUT;     /* концу строки или табу программа находится вне слова (подсчёт слов) */
        } else if (OUT == state) { /* иначе если программа находится вне слова */
            ++nw;                       /*прибавлять +1 к nw (подсчёт слов)*/
            state = IN;                /*нахождение внутри слова*/
        }
    }
    printf("nc = %d, nl = %d, nw = %d\n", nc, nl, nw); /* отобразить результаты */

/*а ретёрна нету здесь*/

}
Вот как-то так.
я знаю каратэ, дзюдо, канфу.... и много других страшных слов
Glatos вне форума Ответить с цитированием
Старый 15.08.2011, 14:08   #26
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Всё верно. Несколько уточнений:

В файле stdio.h хранятся прототипы (объявления) функций (см. приложение Б. "Стандартная библиотека"): printf, getchar и все функции ввода - вывода.

В файле locale.h хранится прототип функции stdlocale(LC_ALL, "Russian"). Функция нужна для нормального вывода кириллицы в консоль. Без неё у меня выводятся "краказяблики".

Попрабуйте откомпилировать и запустить следующую программу:
Код:
#include <stdio.h>

/* вывод строки на экран */
int main (void) {
    printf("Привет, Мир!\n\n");
}
А вот так нормально выводится:
Код:
#include <stdio.h>
#include <locale.h>

/* вывод строки на экран */
int main (void) {
    setlocale(LC_ALL, "Russian");
    printf("Привет, Мир!\n\n");
}
Цитата:
/*а ретёрна нету здесь*/
В моём экземпляре книги тоже нет. Кстати, какое у вас издание, кто издатель и какой год издания? У меня второе издание, Вильямс, 2009. Через один параграф, если точнее в параграфе "1.7 Функции", на странице 39 авторы пишут:
Цитата:
Поскольку main - такая же функция, как и другие, она может возвращать значение в ту точку, откуда её вызывают. А это фактически та операционная среда, в которой выполняется программа. Обычно возвращение нуля обозначает нормальное завершение программы, а ненулевого значения - нестандартные или ошибочные условия завершения. В целях упращения мы не ставили return в конце наших функций main до этого момента, но теперь начнём это делать, чтобы подчекнуть, что программам полезно посылать отсчёт о корректности своего завершения в операционную среду.
Я думаю, к этому моменту вы уже и сами дочитали до этого места.

Вы заметили авторы постоянно ссылаются на стандарт их лет. Я скачал себе готовящейся, новый стандарт draft (черновик) ISO/IEC 9899:201x. В поисковике введите: ANSI C вики, в википедии самая нижняя ссылка. Вот, что я там нашёл (вы тоже найдите):
Цитата:
5.1.2.2.1 Program startup
1 The function called at program startup is named main. The implementation declares no
prototype for this function. It shall be defined with a return type of int and with no
parameters:
int main(void) { /* ... */ }
то есть перед main нужен int, а return можно не писать (но о полезности этого надо помнить). Обязательно ли писать void - не нашел.

Что касается упражнения 1.12, то:
Код:
// oneWordInStr_1_12_s35.c

#include <stdio.h>
#include <locale.h>

#define IN 1    /* внутри слова */
#define OUT 0   /* снаружи слова */

/* вывод входного потока по одному слову в каждой строке */
int main () {
    setlocale(LC_ALL, "Russian");

    printf("Вывод входного потока по одному слову в каждой строке\n");

    int c, state;
    state = OUT;
    while ((c = getchar()) != EOF) {
        if (c == ' ' || c == '\n' || c == '\t') {
            state = OUT;
        }
        else if (state == OUT){
            putchar('\n');
            putchar(c);
            state = IN;
        } else {
            putchar(c);
        }
    }
    return 0;
}
Если ввести в консоли:
12345 hello 67890

Нажать ENTER, то результат будет таким:
12345
hello
67890

Как сделать так, чтобы можно было ввести:
12345 hello
нажать ENTER, вести:
67890
Ввести EOF (то есть CTRL+Z->ENTER)

Получить результат:
12345
hello
67890

без использования массива для сохранения строк, я не знаю. Может авторы имели введу: входной поток - это строка со словами.
8Observer8 вне форума Ответить с цитированием
Старый 16.08.2011, 19:11   #27
Glatos
Пользователь
 
Регистрация: 15.07.2011
Сообщений: 25
По умолчанию

да, видимо у нас одинаковые книги. Правда сначала мне попалось первое издание. Там нет ничего про файлы с описанием функций и начинающим не понятно почему программа не работает

попробовал я locale.h
но программа работает нормально в обоих вариантах

спасибо за помощь с задачкой, такое простое решение, как же я не догадался =)


вопрос немного не по учебнику:

Код:
/* составить программу, которая вводит с клавиатуры русскую букву
 * и выводит на экран название животного на эту букву
 * 
 */
int main()
{
    setlocale(LC_ALL, "Russian");
    char c;
    printf("\nВведите первую букву:");
    scanf("%c", &c);                    // ввести букву
    switch ( c )                        // заголовок оператора выбора
    {
        case 'а': printf("\n Атилопа"); break;
        case 'б': printf("\n Барсук"); break;
        case 'в': printf("\n Волк"); break;
        default:  printf("\n Не знаю я таких!"); // по умолчанию
    }
когда используешь латинские буквы в кейсах всё ок, а русские - по дефолту выдаёт.
я знаю каратэ, дзюдо, канфу.... и много других страшных слов
Glatos вне форума Ответить с цитированием
Старый 17.08.2011, 12:01   #28
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Как по грамотному выйти из этой ситуации пока не знаю. Предлагаю следующее решение, но подозреваю, что так делать нельзя:

Код:
#include <stdio.h>
#include <locale.h>

/* составить программу, которая вводит с клавиатуры русскую букву
 * и выводит на экран название животного на эту букву
 * 
 */
int main()
{
    setlocale(LC_ALL, "Russian");
    char c;
    printf("\nВведите первую букву:\n> ");
    scanf("%c", &c);                    // ввести букву
    c = c + 64;
    switch ( c )                        // заголовок оператора выбора
    {
        case 'а': printf("\nАтилопа\n\n"); break;
        case 'б': printf("\nБарсук\n\n"); break;
        case 'в': printf("\nВолк\n\n"); break;
        default:  printf("\nНе знаю я таких!\n\n"); // по умолчанию
    }
    return 0;
}
P.S. Почему-то считанный из консоли символ смещён на 64. Из файла, кстати, нормально считывается.
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц