Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Си вопросы  (Прочитано 1437 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Zitz

  • Автор темы
  • Любитель
  • *
  • Сообщений: 51
    • Просмотр профиля
Си вопросы
« : 05 Апреля 2010, 23:18:27 »
начал изучать язык си по книге Кернигана и Ритчи, знаний в программировании нет вообще, по этому иногда возникают вопросы. Первые из них появились еще в первой главе. Например, есть задание "Напишите программу, которая будет печатать слова из файла ввода, причем по одному на строку."
мне кажется, что я в правильном направлении иду, но мне на выводе она выдает результат моего ввода.. подскажите чего я написал не так??
#include<stdio.h>
#define yes 1
#define no 0
main()
{
int c, vi;
vi=no;
while ((c=getchar()) != EOF) {
if (c!=' ' || c!='\t')
vi=yes;
else if (vi==yes){
c='\n';
vi=no;
}
putchar(c);
}
}

Оффлайн Saha

  • Активист
  • *
  • Сообщений: 517
    • Просмотр профиля
Re: Си вопросы
« Ответ #1 : 06 Апреля 2010, 00:27:09 »
А что такое "файл ввода"?
если имеется в виду перенаправление ввода-вывода, то попробуй запускать свою прогу так:
./my_proga < my_file.txtТут my_file.txt - файл со словами.

P.S. А еще, старайся оформлять свои программы в более читабельном виде, вот так, например:
#include <stdio.h>

#define yes 1
#define no 0

main()
{
    int c, vi;
    vi=no;

    while ((c=getchar()) != EOF) {
        if (c!=' ' || c!='\t')
            vi=yes;
        else if (vi==yes)
        {
            c='\n';
            vi=no;
        }
        putchar(c);

    }
}

Оффлайн Zitz

  • Автор темы
  • Любитель
  • *
  • Сообщений: 51
    • Просмотр профиля
Re: Си вопросы
« Ответ #2 : 06 Апреля 2010, 00:40:33 »
"файл ввода" здесь думаю неточность перевода, и речь идет просто о тексте который нужно ввести

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Си вопросы
« Ответ #3 : 06 Апреля 2010, 07:14:07 »
вообще-то с переводом думаю все в порядке
речь наверняка идет именно о файле и именно о вводе

прежде чем изучать Си рекомендую разобраться с основами операционной системы. здесь все представленно как файлы. память - файл, диск файл, каждый раздел на диске - файл, последовательный порт - файл, даже файл в файловой системе тоже файл О_о (совсем офигели, да?).
Потом разобраться с потоками (файлами) вводы/вывода. Понять что такое стандарный ввод/вывод. Понять как этим пользоваться из командной строки.
Потом можно пробовать писать программы на Си. Понимая что когда ты делаешь
scanf(...) на самом деле вызывается fscanf(stdin, ...) и что на самом деле программа будет читать от туда от куда ей скажешь из командной строки. скажешь ./a.out < /dev/zerro будет читать нули, скажешь ps ax | ./a.out получит на вход список процессов, скажешь ./a.out </dev/sda будет читать всеь твой диск до посинения, скажешь wget -O- www.google.ru | ./a.out программа прочитает HTML заглавной гугловской странички. Волшебство? а программа одна и таже. ни байта не поменяли ни чего не перекомпилировали. Совсем забыл, чтобы программа читала файл лежащий рядом с ней надо написать ./a.out < input.txt, соответственно файл должен называться input.txt. Ну ты уже понял. Дальнейшее изучение подобных выкрутасов по документации shell.
Снова к программе. Уже понятно что, как и от куда будет читать программа.
В стандартной бибулиотеки Си есть много функий, хороших и разных, на любой вкус и цвет. Читают они тоже по разному. Какие-то читают из стандартного ввода, какие-то из переданного дискриптора, кто-то вообще погоду на марсе выдают (это по началу так казаться будет).
getch() читает char из стандартного ввода
fgetch(FILE*) читает тот же char из переданного дискриптора
scanf() читает что и как скажешь из стандартного ввода
fscanf() то же самое только из переданного дискриптора
Понял что делать с приставочкой?

Теперь программака для тренировки
#include <stdio.h>
#include <ctype.h> /* этот заголовок необходим для функции isspace смотри ниже */

int main()
{
    int ch;
    unsigned int words = 0;
    int in_word = 0;
    while ( (ch = getchar()) != EOF ) {
        if ( !isspace(ch) ) { /* http://www.cplusplus.com/reference/clibrary/cctype/isspace/ */
            if (!in_word) {
                in_word = 1;
                words += 1;
            }
        } else {
            in_word = 0;
        }
    }
    printf("%d\n", words);
    return 0;
}

Оффлайн Zitz

  • Автор темы
  • Любитель
  • *
  • Сообщений: 51
    • Просмотр профиля
Re: Си вопросы
« Ответ #4 : 06 Апреля 2010, 10:47:02 »
спасибо,, про ввод вывод учту, буду так сказать расширять кругозор, видемо и правдо C и Unix необходимо учить как единое целое)

А приведенная вами программа я как понял подсчитывает количество слов, в книге перед сабжевой задачей тоже как пример идет аналогичный пример, только использует уже изученые операторы в книге(как я уже сказал задача из первой главы по сему их совсем немного printf, putchar, getchar, if, while, for) и для умения обходиться минимумом, хотел бы научиться обходиться минимумом

Оффлайн mkarasik

  • Участник
  • *
  • Сообщений: 163
    • Просмотр профиля
Re: Си вопросы
« Ответ #5 : 06 Апреля 2010, 21:47:02 »
... уже изученые операторы в книге(как я уже сказал задача из первой главы по сему их совсем немного printf, putchar, getchar, if, while, for) ...

printf, putchar, getchar - это не операторы, иди перечитывай по новой. :)

Оффлайн Zitz

  • Автор темы
  • Любитель
  • *
  • Сообщений: 51
    • Просмотр профиля
Re: Си вопросы
« Ответ #6 : 06 Апреля 2010, 23:17:06 »
ладно функции)

собственно на другом форуме где я постил этот вопрос подсказали, что в (c!=' ' || c!='\t') нужно заменить "или" на "и"
« Последнее редактирование: 06 Апреля 2010, 23:21:05 от Zitz »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Си вопросы
« Ответ #7 : 07 Апреля 2010, 12:14:04 »
плохо путать функции стандартной библиотеки и конструкции языка... очень плохо.
плохо что с логикой траблы, это вообще настолько плохо что лучше сначала научиться рисовать правильные диаграмки с логикой работы а потом пробовать переносить эти диаграмки на нужный язык.

Обходиться минимумом? это и есть минимум =)
Стандартная библиотека есть, обычно всегда есть. Втраиваемые девайсы с кастрированной библиотекой или без оной а так же разработу ядер ОС мы тут опускаем. Идет она одним куском libc. И выкинуть её довольно сложно. Поэтому лучше пользоваться теми функциями что уже есть в стандартной библиотеки а не изобретать свои велосипеды.

Оффлайн Zitz

  • Автор темы
  • Любитель
  • *
  • Сообщений: 51
    • Просмотр профиля
Re: Си вопросы
« Ответ #8 : 07 Апреля 2010, 16:09:18 »
плохо путать функции стандартной библиотеки и конструкции языка... очень плохо.
плохо что с логикой траблы, это вообще настолько плохо что лучше сначала научиться рисовать правильные диаграмки с логикой работы а потом пробовать переносить эти диаграмки на нужный язык.
Касательно логики абсолютно правы, может это конечно по началу так, но очень тяжело все перевариваю, тоесть нет, теоретически понимать вроде все понимаю, но как только дело до задач то спадаю в ступор :idiot2: часами думаю над некоторыми задачами, и почти безрезультатно.. Надо как-то преодолеть непонимание.. научиться думать так математически.. пока не очень получается.


Может в дополнение стоит книжки по математической логике или дискретной математике почитывать??
« Последнее редактирование: 07 Апреля 2010, 16:10:58 от Zitz »

Оффлайн armad

  • Активист
  • *
  • Сообщений: 629
    • Просмотр профиля
Re: Си вопросы
« Ответ #9 : 07 Апреля 2010, 16:25:52 »
Цитировать
Надо как-то преодолеть непонимание.. научиться думать так математически.. пока не очень получается.
Попробуйте расписать на листе бумаги какое нибудь свое обычное действие, самое простое, досконально. Например взять карандаш и нарисовать квадрат. Но каждое движение до мелочей. Тогда поймете как писать программы на любом языке. Ведь программа это просто последовательность действий не более того. И чем точнее будет понимание каждого движения тем лучше будет результат. Это не сложно.
Ubuntu 10.04. 2.6.35-25-generic-pae Проблем нет.

Оффлайн dj--alex

  • Старожил
  • *
  • Сообщений: 3237
  • Понимаешь, я какбы беру в руки лопату и говорю...
    • Просмотр профиля
    • все мои творения и занятия
Re: Си вопросы
« Ответ #10 : 13 Апреля 2010, 06:46:26 »
по первому пункту...
ещё под виндой начал писать такую программу

и так как она выводила знаки вопроса  счел что язык С - гавно
и перешёл на православный PHP
Ubuntu 18.04 MATE x64, 19.3 x64 Mate, MX-Linux 19 Mate Mate Mate Mate. PC:B450\Ryzen3200G\16Gb\6TB\1060gtx\512Gb-Netac
https://forum.ubuntu.ru/index.php?topic=199897.0

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Си вопросы
« Ответ #11 : 13 Апреля 2010, 08:32:58 »
ещё под виндой начал писать такую программу
и так как она выводила знаки вопроса  счел что язык С - гавно
и перешёл на православный PHP
Евгений Ваганыч отдыхает. ;D

Оффлайн WereBeast

  • Любитель
  • *
  • Сообщений: 85
    • Просмотр профиля
Re: Си вопросы
« Ответ #12 : 15 Апреля 2010, 04:22:51 »

ещё под виндой начал писать такую программу

и так как она выводила знаки вопроса  счел что язык С - гавно
и перешёл на православный PHP

Феерично!
Особенно, понравилось: ...ещё под виндой начал писать такую программу...
Это пять. Нет, это десять. То есть, если я правильно понял, три строки растянулись на пятилетку? :D

Программирую пропаганду
Windows - в гландах

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Си вопросы
« Ответ #13 : 16 Апреля 2010, 07:57:13 »
Это был просто вброс Г на вентилятор. не надо так реагировать, а то еще ему понравится =)

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: Си вопросы
« Ответ #14 : 17 Апреля 2010, 13:35:47 »
Сказанное dj достойно висеть предисловием в какой-нить книге по программированию, которая будет отражать отрицательные стороны невежества и веселить еще не одно поколение программистов!

 

Страница сгенерирована за 0.034 секунд. Запросов: 25.