Начал изучать С по книге Нейбауэра "Моя первая программа на 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.
Если кратко, то Вы, похоже, ошиблись с выбором книги. Читайте лучше Кернигана и Ритчи.Если более подробно, то в первом примере функция getlet должна находиться до функции main. Во втором примере у Вас очевидная ошибка в описании функции ask (ищите сами). Кроме того,
ask(a, b)
char a[15];
int b;
{
}это описание функции в "старом" стиле, который сейчас не рекомендуется применять и который не поддерживается в Си++.
Если это примеры из учебника, то смените быстрее учебник на по-новее;
потому что по некоторым признакам этот стиль программирования устарел лет на 15.
>Начал изучать С по книге Нейбауэра "Моя первая программа на C/C++".
[...]
>ask(qest, ans)
>char quest[15];
>int ans;
>{Книжку - в топку. КГ/АМ.
Найди книгу - Стивен Прата "Язык программирования C++. Лекции и упражнения"
Это тоже была моя первая книга, но было это давно. Материал сильно устарел. В топку ее, как советуют некоторые товарищи, я бы отправлять не спешил, так как изложение там расчитано на очень неподготовленного человека и многие моменты разжевываются основательно. Но книгу с актуальным на сегодня изложением вам надо взять обязательно.
Я переписал программы так, как они должны выглядеть сегодня. Я их не компилировал, но вроде должно работать :)Пример №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++;
}
}
//------------------------------------
Огромное спасибо, dimus, за то что не поленились мне объяснять и не открестились словами типа "сам дурак!", просто всётаки давольно сложно найти ошибку синтаксиса, если не знаешь как это должно работать.
Так же спасибо всем кто откликнулся на мою просьбу о помощи.
А книгу я купил, называется "Освой самостоятельно С за 21 день" авторы Питер
Л. Джонс и Питер Эйткен.
P.S. Рукописи не горят !!!