Консультация № 187302
27.04.2013, 14:25
95.44 руб.
0 5 0
Здравствуйте! Уважаемые эксперты прошу помощи при решении теста по с++.
См.файл на нашем ресурсе
https://rfpro.ru/upload/9277


Обсуждение

Неизвестный
27.04.2013, 17:10
общий
27.04.2013, 20:19
Адресаты:
Тест по C++
В каждом вопросе можно выбирать несколько вариантов ответа. Если выбираете "Другое", следует написать, что именно Вы имеете ввиду. Тест необходимо выполнить в полном объёме.

1 Где и как описать глобальную переменную, которая используется в двух исходных файлах
[] объявить её один раз в хидере, подключить хидер в оба файла
[] объявить её в каждом файле
[] объявить её в любом одном файле
[] объявить её в одном из файлов, в зависимости от её использования
  • другое

    Объявить в каждом файле но определить в одном. В остальных с атрибутом extern.

  • Код:
    // 1й файл
    int var;

    int main(int argc, char** argv)
    {
    var=10;
    return 0;
    }

    // 2й файл
    extern int var;

    void test()
    {
    var=var*2;
    }



    2 Что плохого в том, что бы написать "int a = (int)GetNumber();"?
    [] ничего плохого
    [] ничего плохого, если функция GetNumber() не принимает аргументов и
    возвращает численное значение
    [] ничего плохого, если функция GetNumber() не принимает аргументов и
    возвращает целочисленное значение
    [] в С такое не скомпилируется
    [] в С++ такое не скомпилируется
  • другое
    Ничего плохого, но нужно четко представлять зачем это делается. Кроме того, даже без (int) приведение к этому типу будет выполнено автоматически, если это возможно т.к сама переменная объявлена как int.


    3 Какая разница между malloc и new
  • [] нет разницы вообще
    [] нет имеющей практическое значение разницы
  • другое
    В new может быть произведена инициализация класса используя соответствующий конструктор, а malloc() просто выделяет память требуемого объема.

  • Код:
    class Test
    {
    public:
    Test(int a)
    :_a(a)
    {

    }
    private:
    int _a;
    };

    int main(int argc, char** argv)
    {
    Test* test=new Test(10);
    return 0;
    }



    4 Укажите все отличия class и struct
    [] нет отличий
    [] это несравнимо разные понятия
  • другое
    В struct все члены по умолчанию public, в class private.


    5 Отметьте все истинные высказывания. Виртуальные методы...
  • [] Обычно работают быстрее обычных
    [] Обычно работают быстрее статических
    [] Обычно работают так же быстро, как и обычные
    [] Обычно работают так же быстро, как и статические
  • Обычно работают медленнее обычных
  • Обычно работают медленнее статических
  • [] На самом деле в С++ внутри все методы виртуальные
    [] На самом деле виртуальности в C++ нет, а ключевое слово virtual просто
    позволяет компилятору оптимизировать код вызова метода
    [] другое


    6 Напишите шаблон метода добавления элемента шаблонного класса, реализующего дерево
    https://rfpro.ru/question/170069


    7 Когда и где будут инстанциированы шаблоны?
    [] При компиляции по месту описания для всех типов
    [] При компиляции по месту описания для каждого типа отдельно
    [] При компиляции по месту первого обнаруженного применения для всех типов
  • При компиляции по месту первого обнаруженного применения для каждого типа
    отдельно
  • [] При выполнении по месту первого выполнения для всех типов
    [] При выполнении по месту первого выполнения для каждого типа отдельно
    [] Другое

    8 Укажите проблемы данного кода
    #include <stdio.h>
    #include <string.h>
    main()
    {
      string s1 = argc[1];
      string s2 = argc[2];
      for(int i=1; i < s1.length(); i++)
        if (i=1){
          string s3 = s1[i] + s2[i];
        else
          s3 = s3 + s1[i] + s2[i];
      }
      printf("s3=%s",s3);
    }

    [] нет серьёзных ошибок, должно работать
    [] в C++ нет типа string
    [] main не возвращает значение
    [] main не принимает аргументов
    [] в C++, в отличие от C, нет main, а есть winmain
    [] в C++ нельзя объявлять переменную в теле цикла
  • другое
    1) Класс std::string описан в заголовке string, а не string.h
    2) argc не объявлено
    3) при общепринятом обявлении main(int argc,char** argv)
    к argc не может применяться операция индекса
    4) не верно стоит скобка после if
    5) s3 существует в блоке после if, а в программе используется где попало
    6) не верный формат в функции printf для class string
    7) i=1 это присваивание. i==1 - сравнение
    8) хоть это и не совсем обязательно(некоторые компиляторы пропускают), но по стандарту C++ main должна объявляться как int.
  • Код:

    #include <stdio.h>
    #include <string>
    using namespace std;

    int main(int argc, char** argv)
    {
    string s1 = argv[1];
    string s2 = argv[2];
    string s3;
    for (int i = 1; i < s1.length(); i++)
    {
    if (i == 1)
    s3 = s1[i] + s2[i];
    else
    s3 = s3 + s1[i] + s2[i];
    }
    printf("s3=%s", s3.c_str());
    }

    Есть еще логические ошибки. А именно, если длина s2 меньше s1, то в определенный момент операция s2[i] завершится ошибкой времени выполнения. Так же не делается проверка на реальное количество аргументов коммандной строки. Может ведь быть и меньше 2х. И нумерация индексов в C/C++ начинается с 0, а не с 1.
    давно
    Посетитель
    396751
    37
    28.04.2013, 13:42
    общий
    Добрый день,проконсультируйте пожалуйста по заданию:
    п. 8
    1)Класс std::string описан в заголовке string, а не string.h - не совсем это понял
    6) не верный формат в функции printf для class string - здесь Вы имеете ввиду что нужно было писать s3.c_str()?


    Неизвестный
    28.04.2013, 15:08
    общий
    28.04.2013, 16:47
    Адресаты:
    Дело в том, что #include<string> и #include<string.h> подключают разные заголовочные файлы. <string> является частью STL(Стандартной библиотеки шаблонов) и там и описан class string который тут используется. В string.h(он же cstring по современному стандарту) описаны функции работы со строками в стиле C.
    Вот ссылки:
    cstring
    string

    Формат %s подразумевает вывод строки в стиле C. Т.е. текстовая строка заканчивающаяся символом с кодом 0. Для вывода класса string это не подходит. Метод string.c_str() как раз и представляет такую строку. Писать нужно было, уж коль пишется на C++ и используются классы вообще типа:
    Код:

    #include <iostream>
    ...

    std::cout<<"s3="<<s3<<std::endl;
    ...
    давно
    Посетитель
    396751
    37
    28.04.2013, 17:22
    общий
    Ага,понял,спасибо.
    Неизвестный
    28.04.2013, 19:45
    общий
    28.04.2013, 19:47
    Адресаты:
    Трудно сказать какая цель у той задачи без условия. Примерно такая.
    Код:
    #include <iostream>
    #include <cstdlib>
    #include <string>
    #include <locale>

    using namespace std;

    int main(int argc, char** argv)
    {
    locale::global(locale(""));
    if(argc<3)
    {
    cout<<"Требуется 2 аргумента"<<endl;
    exit(EXIT_FAILURE);
    }
    string s1 = argv[1];
    string s2 = argv[2];
    string s3;

    for (int i = 0, len = min(s1.length(), s2.length()); i < len; i++)
    {
    s3 = s3 + s1[i] + s2[i];
    }
    cout << "s3 = " << s3 << endl;
    }


    Код:
    @linux:~/PROJECTS/RFPRO/187302/dist/Debug/GNU-Linux-x86> ./187302 abcdefgh 12345
    s3 = a1b2c3d4e5

    Форма ответа