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


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

Автор Тема: Программа на си  (Прочитано 3695 раз)

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

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Программа на си
« : 19 Марта 2014, 21:14:01 »
Помогите пожалуйста вот код программы но при компиляции выкидывает ошибку:
gcc: ошибка: ввод со стандартного ввода возможен только с ключом -E или -xВот сам код:
#include <stdio.h>
#define Celsius a*1.8+32

int main()
{
   float a;
   int x;
   L:printf ("Введите значение градусов Цельсия:\n");
   printf ("a=");
   scanf ("%f", &a);
   printf ("Fahrenheit=%.2f\n", Celsius);
   printf ("Завершить работу программы? (Y/N)");
   x = getchar ();
   if (x==78) { goto L;}
   if (x==89) { goto K;}
   K:return 0;
}
Буду очень благодарен :)
« Последнее редактирование: 21 Сентября 2014, 17:59:46 от Haker »
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12139
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Программа в си
« Ответ #1 : 19 Марта 2014, 22:34:23 »
 :o за вещи типа "goto ubuntu" нам в ВУЗе сразу ставили 2 бала.

Конструкции языка позволяющие организовать цикл по условию и конструкции логического ветвления и выбора решают все возможные алгоритмические задачи БЕЗ go to.


PS таки надо было на лекции ходить и на практику .... что бы не позорится таким быдлокодом...
« Последнее редактирование: 19 Марта 2014, 22:36:35 от Sly_tom_cat »
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7215
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Программа в си
« Ответ #2 : 19 Марта 2014, 23:16:37 »
Haker, от goto избавляйся, читать же страшно такой код. Любой Goto можно заменить циклами. Как компилишь? У тебя в команде компиляции ошибка. И ещё, твоя программа не завершится из-за терминального 0, про который ты забыл.

Пользователь решил продолжить мысль 19 Марта 2014, 23:18:15:
Sly_tom_cat, не думаю, что он в ВУЗе. Я такое в начале первого курса писал, где-то на второй практике. Во втором полугодии уже более серьёзные вещи были.
« Последнее редактирование: 19 Марта 2014, 23:18:15 от peregrine »

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3269
    • Просмотр профиля
Re: Программа в си
« Ответ #3 : 19 Марта 2014, 23:31:09 »
В большинстве случаев лучше без goto, его использование - это обычно плохое
решение, но в некоторых простых ситуациях удобнее и нагляднее с goto.
Вы же не отказыаетесь в ассемблере от jmp?
И вообще есть функциональный стиль программирования, там и без if.
Пётр.

Оффлайн Rosik

  • Активист
  • *
  • Сообщений: 255
  • по жизни Rosik
    • Просмотр профиля
Re: Программа в си
« Ответ #4 : 20 Марта 2014, 01:01:37 »
#include <stdio.h>

int main()
{
   char x;
   do {
      printf ("Введите значение градусов Цельсия:\n");
      printf ("Celsius="); fflush(stdout);
      float a;
      scanf("%f", &a);
   
      printf("Fahrenheit=%.2f\n", a*1.8+32);
     
      printf ("Завершить работу программы? (y/N)");
      x = getchar();
   } while (x != 'y');
   return 0;
}

компилировать:
gcc program.c -o program

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12139
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Программа в си
« Ответ #5 : 20 Марта 2014, 10:28:05 »
Rosik, ну и зачем ты двоечнику подсказываешь? :idiot2:

...да еще и не правильно подсказал.  :-\ не выйти из такой программы.
« Последнее редактирование: 20 Марта 2014, 10:32:15 от Sly_tom_cat »
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн hik3

  • Новичок
  • *
  • Сообщений: 38
    • Просмотр профиля
Re: Программа в си
« Ответ #6 : 20 Марта 2014, 16:28:49 »
Sly_tom_cat, не думаю, что он в ВУЗе. Я такое в начале первого курса писал, где-то на второй практике. Во втором полугодии уже более серьёзные вещи были.
Я сейчас во втором полугодии 1 курса, и мы только-только циклы прошли. Вот на прошлой паре case был.
« Последнее редактирование: 20 Марта 2014, 16:33:21 от hik3 »

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12139
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Программа в си
« Ответ #7 : 21 Марта 2014, 00:27:13 »
hik3, раз циклы прошли - goto здесь - чуждо. Решать через цикл нужно.
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн MrModest

  • Активист
  • *
  • Сообщений: 336
  • HP Pavilion dv6 3305er
    • Просмотр профиля
    • MrModest in MAL
Re: Программа в си
« Ответ #8 : 21 Марта 2014, 01:07:01 »
А в школе Паскаля не было? За goto еще там по рукам били =/
Вначале не понял что за "ubuntu:" в начале принта.. посмотрел ниже и вспомнил, что в Си goto  есть  :)

Хотите использовать ссылки/метки, учите asm, там за них не ругают..  ;)

P.S. Не рекомендую использовать в коде привязки к коду символа. Это привязывает программу к конкретной кодировке. Можно же просто сравнить с символом в кавычках, а компилятор сам подставит нужный код)
Поправьте, пожалуйста, если ошибся.
« Последнее редактирование: 21 Марта 2014, 01:12:57 от MrModest »
Windows 10 Pro x64       | Ubuntu 14.04 amd64
Intel Core i5 @ 2.67 GHz | AMD Radeon HD 6550M 1Gb (Notebook Graphics)
RAM: 8Gb | HDD: 500Gb (Ubuntu-49Gb, SWAP-1Gb, Windows-100Gb, Storage-330G

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12139
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Программа в си
« Ответ #9 : 21 Марта 2014, 11:09:06 »
Вариант Rosik-а в принципе правильный, он только неверно обрабатывает ввод ответа на предложение продолжить.

Ввод цифр заканчивается по enter и (не уверен точно) один из символов остается в буфере ввода - так что getchar(); возвращает один из служебных символов (CR или LF) он никогда не будет равен 'y'. Выйти из той программы можно только если прямо за цифрами градусов написать 'y' - тогда программа наконец закончится.  :idiot2:
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7215
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Программа в си
« Ответ #10 : 21 Марта 2014, 14:06:42 »
Проще так сделать, хоть и кривовато.
Код: (C) [Выделить]
#include <stdio.h>

int main()
{
char x;
do
{
printf ("Введите значение градусов Цельсия:\n");
printf ("Celsius=");
                fflush(stdout);
float a;
scanf("%f", &a);
getchar();
printf("Fahrenheit=%.2f\n", a*1.8+32);
printf ("Завершить работу программы? (y/N)");
x = getchar();
}
while (x != 'y');
return 0;
}
Что же все про символ конца строки забываете?

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Re: Программа в си
« Ответ #11 : 24 Марта 2014, 08:53:14 »
В большинстве случаев лучше без goto, его использование - это обычно плохое
решение, но в некоторых простых ситуациях удобнее и нагляднее с goto.
Вы же не отказыаетесь в ассемблере от jmp?
И вообще есть функциональный стиль программирования, там и без if.

Ни чего плохого в goto нет (break - фактически скрытый goto),
если goto появляется один раз в блоке { }

Однако лучше избегать.

Lifewalker

  • Гость
Re: Программа в си
« Ответ #12 : 24 Марта 2014, 09:00:44 »
Haker,
   if (x==78);
   {
     goto ubuntu;
   }
   if (x==89);
   {
     return 0;
   }
Это вообще щито такое???
Это вообще не должно работать. Компилироваться - да, но работать - нет. Коллеги, вы зациклились на goto, но тут я вижу несколько логических ошибок. Это где так учат программировать?
« Последнее редактирование: 24 Марта 2014, 09:04:59 от Lifewalker »

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Re: Программа в си
« Ответ #13 : 24 Марта 2014, 10:50:54 »
Lifewalker,

Может просто юноша-самоучка?

if (x==78); /* явная ошибка */

Это пройдет со временем.

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12139
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Программа в си
« Ответ #14 : 24 Марта 2014, 10:56:20 »
Lifewalker, да гоуту - просто глаз резануло. Комплексы подросткового воспитания так, сказать, - просто незабываемый раздрай получил один из моих одногрупников на первом кусе, когда принес прогу на паскале с goto (было это по весне, парня чуть из вуза не выгнали после этого).
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

 

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