The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Пожалуйста, помогите разобраться. (Язык С)"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Пожалуйста, помогите разобраться. (Язык С)"  
Сообщение от linxor email(??) on 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.

Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


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

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

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

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

Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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


Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

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

Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

Пример №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++;
   }
}
//------------------------------------

Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]




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

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