Г. Шилдт "С++ руководство для начинающих" второе издание

Тема в разделе "WASM.BOOKS и WASM.BLOGS", создана пользователем scriper, 8 июл 2006.

  1. scriper

    scriper Николай

    Публикаций:
    0
    Регистрация:
    5 янв 2005
    Сообщения:
    19
    Адрес:
    Красноярск
    Пролистав несколько тем на разных форумах, пришел к выводу, что начинать изучение С++ следует с книги Г. Шилдта "С++ руководство для начинающих". В целом книга очень понравилась, хоть и читать начал сравнительно недавно. На 164 странице(Глава Массивы, строки и указатели) представлен код, в котором в двемерный массив последовательно помещаются цисла от 1 до 12:
    Код (Text):
    1. #include <iostream>
    2. using namespace std;
    3. int main(){
    4.  
    5. int t,i, nums[3][4];
    6. for(t=0;t<3;++t){
    7.     for(i=0;i<4;++i){
    8.     nums[t][i]= (t*4)+i+1;
    9.     cout << nums[t][i] << '  ';
    10.     }
    11. cout << '\n';
    12.  
    13. }
    14. return 0;
    15. }
    компилирую в VS2005, но вместо ожидаемого вывода таблицы чисел от 1 до 12 получаю 3 ряда с бессмысленым набором цифр. Помогите найти ошибку, т.к. сам я ее в упор не вижу.
     
  2. scriper

    scriper Николай

    Публикаций:
    0
    Регистрация:
    5 янв 2005
    Сообщения:
    19
    Адрес:
    Красноярск
    с проблемой помогли разобраться, заменив
    Код (Text):
    1.  cout << nums[t][i] << '  ';
    на
    Код (Text):
    1. cout << nums[t][i];
     
  3. nermest

    nermest New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    157
    безсмысленные числа появляются из-за того, что ыместо пробела вы печатаете его код
    попробуйте вместо
    Код (Text):
    1. cout << nums[t][i] << '  '
    поставить
    Код (Text):
    1. cout << nums[t][i] << " "
     
  4. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    У тебя в
    Код (Text):
    1. cout << nums[t][i] << '  ';
    между кавычками два пробела. Оставь один и будет работать как полагается. А вот почему такое происходит, мне и самому интересно :)

    P.S. Все, понял. То, что стоит между кавычками, интерпретируется как число в 256-ичной системе.
     
  5. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    М.б. проект компилируется как Unicode?
     
  6. scriper

    scriper Николай

    Публикаций:
    0
    Регистрация:
    5 янв 2005
    Сообщения:
    19
    Адрес:
    Красноярск
    проблему уже прояснили: в ковычках ' ' действительно 2 пробела, вот цитата из документации: "Символьной константой является один или несколько символов, заключенные в одиночные кавычки, например 'x'. Константа из одного символа имеет тип char. Символьные константы из нескольких символов имеют тип int. ". Признаюсь чесно, второй пробел я дописал сам, расчитывая на более читабельный вид таблицы :).
     
  7. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    scriper
    Не советую, по Шилду лучше шлифовать то, что у тебя уже есть в голове. А учиться рекомендую по Джессу Либерти "Освой самостоятельно С++ за 21 день". Блин, она это рулез!!! За 21 день конечно он прикольнулся, но сам язык ты ощутишь, а если после этой книги потом сразу Гради Буча про ООП так все, иди работать программером если эти книги понял :)))
    На работе читай Кнута, поймешь их все 3, весь васм забухает, что хоть кто-то их понял до конца! :)
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Как-то не нравятся книги, обещающие научить всему за три недели. Откуда уверенность?
     
  9. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    IceStudent
    Этого автора читал сначал я сам, потом дал другу а он с высшим экономическим образованием, а Сейчас он уже драйвера пишет! Всем кому рекомендовал, а это около 20 ти чел. Настолько мне щас благодарны, что даже незнают как выразить благодарность.

    К тому же я написал ранее, как обстоит делом на самом деле:
    >Блин, она это рулез!!! За 21 день конечно он прикольнулся, но сам язык ты ощутишь,
     
  10. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Я бы начал изучать С++ с книги, где приведённый пример записан как-то так (дело не в пробелах и скобочках) -
    Код (Text):
    1. #include <iostream>
    2.  
    3. int main()
    4. {
    5.   const unsigned max_t = 3, max_i = 4;  
    6.   int nums[max_t][max_i];
    7.   for ( unsigned t = 0; t != max_t; ++t )
    8.   {
    9.     for ( unsigned i = 0; i != max_i; ++i )
    10.     {                
    11.       nums[t][i] = (t * max_i) + i + 1; // не уверен, что правильно понял автора
    12.       std::cout << nums[t][i] << '\t';
    13.     }
    14.     std::cout << '\n';
    15.   }
    16. }
    Хотя сразу возникает вопрос, зачем тут вообще массив (т.е. пример не учит жизни - сравните даже с примером из Кернигана и Риччи).
     
  11. scriper

    scriper Николай

    Публикаций:
    0
    Регистрация:
    5 янв 2005
    Сообщения:
    19
    Адрес:
    Красноярск
    Вот мне и надоело возиться с IDE vs2005, только из командной строки cl.exe отказался запускаться требуя какието библиотеки. Нашел в msdn что следует перед использованием выполнить vsvars32.bat, который в процессе не сообщил не об одной ошибке, но и переменные среды создавать\обновлять не стал.
     
  12. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    scriper
    Я попросту скопировал DLL, в папку Bin, и все заработало.
     
  13. scriper

    scriper Николай

    Публикаций:
    0
    Регистрация:
    5 янв 2005
    Сообщения:
    19
    Адрес:
    Красноярск
    Я решил, что всетаки будет лучше прописать все переменные из vsvars32.bat вручную.
     
  14. scriper

    scriper Николай

    Публикаций:
    0
    Регистрация:
    5 янв 2005
    Сообщения:
    19
    Адрес:
    Красноярск
    Итак, читаю Шилдта 5 день. В параграфе о строковых константах Шилдт пишет (цитирую): Если С++ компилятор обнаруживает строковой литерал, он сохраняет его в таблице строк программы и генерирует указатель на нужную строку. Поэтому следующая программа совершенно корректна и при выполнении выводит на экран фразу "Работа с указателями - сплошное удовольствие!.".
    Код (Text):
    1. #include <iostream>
    2.     using namespace std;
    3. int main() {
    4. char *ptr;
    5. ptr= "Работа с указателями- сплошное удовольствие!\n";
    6. cout << ptr;
    7. }
    То, что написал автор до меня доходит с трудом. Этот код я понимаю следующим образом: указатель ptr получает адрес первого элемента в строке, а cout работает со строкой как с массивом и заканчивает вывод, когда встречает нулевой символ \0. Хотелось бы узнать, насколько (не)верны мои представления.
     
  15. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Видимо, проблема перевода. Компилятор действительно сохранят где-то там строку (с завершающим нулём), но никакой указатель не "генерируется". Данная строка будет иметь лишь адрес (или правильнее - оффсет; как ты и написал - первого элемента).
    Этот адрес можно присвоить указателю ptr (причём - prt имеет тип char*, а строковый литерал const char* и происходит неявное приведение типа).

    А можно не присваивать:
    static const char msg[] = "Массивы тоже в какой-то мере указатели ;)\n";
    std::cout << msg;
    В этом случае никаких "лишних" переменных (ptr) не будет.

    Примерно так. Только детали будут понятны после знакомства с классами и перегрузкой функций. В данном случае, cout - это переменная-объект, а << - перегруженная функция-член, которая принимает указатель (const char*) и выводит символы от него и до '\0'. О массиве (тип имеющий характеристику - размерность) речь не идёт.