The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Пожалуйста, помогите разобраться. (Язык С), !*! linxor, 19-Янв-06, 01:26  [смотреть все]
Начал изучать С по книге Нейбауэра "Моя первая программа на C/C++".
Использую Kate + gcc (версии 1.3.1).
Возникли проблемы:

Проблема номер 1:
main()
{
char letter; /*Работает с int ?*/
letter = getlet();
putchar('\n');    /* зачем нужно? */
printf("Вы ввели символ %c", letter);
}
char getlet() /*Работает с int ?*/
{
printf("Введите символ:");
return(getchar());/*Как это работает?*/
}

gcc выдаёт ошибки следующего содержания:

simb.c:9: error: conflicting types for 'getlet'
simb.c:4: error: previous implicit declaration of 'getlet' was here

При изменениии типа с char на int программа работает.

Проблема номер 2:

int corect, wrong;
main()
{
char question;
int answer;
corect=0;
wrong=0;
ask("4+5=", 9);
ask("6+2=", 8);
ask("5+5=", 10);
ask("4+7=", 11);
printf("Количество верных ответов: %d\n",corect);
printf("Количество неверных ответов: %d\n",wrong);
}
ask(qest, ans)
char quest[15];
int ans;
{
int guess;
printf("%s",quest);
scanf("%d",&guess);
if(guess==ans)
++corect;
else
++wrong;
return(0);
}

gcc выдаёт ошибки следующего содержания:

score.c: In function `ask':
score.c:16: error: declaration for parameter "quest" but no such parameter
score.c:27:2: warning: no newline at end of file

Для компиляции даю команду: gcc name.c
Пожалуйста, подскажите где я совершил ошибки и в чём они состоят?
Заранее благодарен, linxor.

  • Пожалуйста, помогите разобраться. (Язык С), !*! tilde, 09:25 , 19-Янв-06 (1)
    Если кратко, то Вы, похоже, ошиблись с выбором книги. Читайте лучше Кернигана и Ритчи.

    Если более подробно, то в первом примере функция getlet должна находиться до функции main. Во втором примере у Вас очевидная ошибка в описании функции ask (ищите сами). Кроме того,

    ask(a, b)
    char a[15];
    int b;
    {
    }

    это описание функции в "старом" стиле, который сейчас не рекомендуется применять и который не поддерживается в Си++.

  • Пожалуйста, помогите разобраться. (Язык С), !*! ГОЛД, 09:28 , 19-Янв-06 (2)
    Если это примеры из учебника, то смените быстрее учебник на по-новее;
    потому что по некоторым признакам этот стиль программирования устарел лет на 15.


  • Пожалуйста, помогите разобраться. (Язык С), !*! ACCA, 12:17 , 19-Янв-06 (3)
    >Начал изучать С по книге Нейбауэра "Моя первая программа на C/C++".
    [...]
    >ask(qest, ans)
    >char quest[15];
    >int ans;
    >{

    Книжку - в топку. КГ/АМ.

    Найди книгу - Стивен Прата "Язык программирования C++. Лекции и упражнения"

    • Пожалуйста, помогите разобраться. (Язык С), !*! dimus, 09:40 , 24-Янв-06 (4)
      Это тоже была моя первая книга, но было это давно. Материал сильно устарел. В топку ее, как советуют некоторые товарищи, я бы отправлять не спешил, так как изложение там расчитано на очень неподготовленного человека и многие моменты разжевываются основательно. Но книгу с актуальным на сегодня изложением вам надо взять обязательно.
      Я переписал программы так, как они должны выглядеть сегодня. Я их не компилировал, но вроде должно работать :)

      Пример №1 должен выглядеть примерно так:
      // В учебнике
      main()
      {
      char letter; /*Работает с int ?*/
      letter = getlet();
      putchar('\n');    /* зачем нужно? */
      printf("Вы ввели символ %c", letter);
      }
      char getlet() /*Работает с int ?*/
      {
      printf("Введите символ:");
      return(getchar());/*Как это работает?*/
      }

      // Должно быть так
      // Подключаем подсистему ввода-вывода
      #include <stdio.h>

      // Определим прототип функции
      char getlet( void );

      // main возвращает тип инт и принимает число
      // аргументов командной строки и массив указателей на эти аргументы
      int main( int argc, char* argv[] )
      {
         char letter;
         letter = getlet();
         // Это нужно, чтобы перевести каретку на новую строку.
         // Можно было просто написать символ новой строки в самом начале
         // строки последующей функции printf - "\nВы ввели символ %c"
         putchar('\n');
         // Выводим введенный символ.
         // Я бы добавил в конец символ неревода
         // строки - "Вы ввели символ %c\n"
         printf("Вы ввели символ %c", letter);
         // Выйдем из функции майн. Возвращаемое майн число - код
         // завершения программы. По традиции код успешного завершения - ноль
         // Поэтому выйдем с кодом ноль
         return 0;
      }
      //---------------------------------------
      // Реализация функции getlet
      char getlet()
      {
         printf( "Введите символ: " );
         // Так как функция getchar возвращает тип int, а нам нужен char,
         // то выполним принудительное приведение типов - для этого надо
         // перед функцией в скобках поместить наименование нужного нам типа
         return (char)getchar();
      }
      //---------------------------------------

      Программа номер два:
      // В книге:
      int corect, wrong;
      main()
      {
      char question;
      int answer;
      corect=0;
      wrong=0;
      ask("4+5=", 9);
      ask("6+2=", 8);
      ask("5+5=", 10);
      ask("4+7=", 11);
      printf("Количество верных ответов: %d\n",corect);
      printf("Количество неверных ответов: %d\n",wrong);
      }
      // Это что-то ужасное...
      ask(qest, ans)
      char quest[15];
      int ans;
      {
      int guess;
      printf("%s",quest);
      scanf("%d",&guess);
      if(guess==ans)
      ++corect;
      else
      ++wrong;
      return(0);
      }

      // Должно быть:
      #include <stdio.h>

      // Определим прототипы функций:
      // void перед именем функции означает, что она ничего не возвращает
      // А принимает функция строку с вопросом и правильный ответ (число)
      void ask( char* quest_string, int ans );

      // Не определяйте кучу переменных в одной строчке - нарушается
      // удобочитаемость программы
      // Вообще идея определять кучу глобальных переменных не очень хороша -
      // это вносит дополнительную путаницу, затрудняет последующее
      // сопровождение и модернизацию программы
      int corect;
      int wrong;

      int main( int argc, char* argv[] )
      {
         char question; // ??? Зачем эта переменная
         int answer;    // И эта тоже не нужна

         corect=0;
         wrong=0;

         // В реальной программе это надо было бы засунуть в цикл
         ask("4+5=", 9);
         ask("6+2=", 8);
         ask("5+5=", 10);
         ask("4+7=", 11);

         printf("Количество верных ответов: %d\n",corect);
         printf("Количество неверных ответов: %d\n",wrong);
        
         return 0;
      }
      //------------------------------------
      // Я заново переписал эту функцию - больно жутко выглядел оригинал
      void ask( char* quest_string, int ans )
      {
         int result;  // Переменная, где храним ответ пользователя

         // Выведем приглашение:
         printf( "Сколько будет %s ", quest_string );
         // Не люблю scanf, но для такого случая она пойдет :)
         scanf( "%d", &result );
         // Посмотрим, что тут у нас
         if( result == ans )
         {
            // Угадал
            printf("\nПравильно!\n");
            correct++;
         }
         else
         {
            // Не Угадал
            printf("\nНеправильно!\n");
            wrong++;
         }
      }
      //------------------------------------

      • Пожалуйста, помогите разобраться. (Язык С), !*! linxor, 02:48 , 26-Янв-06 (5)
        Огромное спасибо, dimus, за то что не поленились мне объяснять и не открестились словами типа "сам дурак!", просто всётаки давольно сложно найти ошибку синтаксиса, если не знаешь как это должно работать.
        Так же спасибо всем кто откликнулся на мою просьбу о помощи.
        А книгу я купил, называется "Освой самостоятельно С за 21 день" авторы Питер
        Л. Джонс и Питер Эйткен.
        P.S. Рукописи не горят !!!



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру