Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

востокин ответы

.docx
Скачиваний:
47
Добавлен:
12.06.2015
Размер:
387.8 Кб
Скачать

9.Экзаменационные задачи

1.Дана функция, записанная на языке Си, в которой пропущены некоторые фрагменты. Требуется восстановить пропущенные фрагменты таким образом, чтобы получившийся код был синтаксически и семантически корректным.

а)

void func(){

/* объявления и инициализация пропущены */

x=*y;

/* вывод пропущен */

}

  1. #include <stdio.h>

  2. using namespace std;

  3. void func() {

  4. int x;

  5. int c = 5;

  6. int *y =&c;

  7. x = *y;

  8. printf("x = %d y = %d, *y = %d",x,y,*y);

  9. }

б)

void func(){

/* объявления и инициализация пропущены */

*x=y;

/* вывод пропущен */

}

  1. #include <stdio.h>

  2. using namespace std;

  3. void func() {

  4. int *x,y;

  5. y = 500;

  6. *x = y;

  7. printf("x = %d y = %d, *x = %d",x,y,*x);

  8. }

в)

void func()

{

/* объявления и инициализация пропущены */

x=&y;

/* вывод пропущен */

}

  1. #include <stdio.h>

  2. using namespace std;

  3. void func() {

  4. int *x;

  5. int y = 0;

  6. x = &y;

  7. printf(" x = %d y = %d, &y = %d",x,y,&y);

  8. }

2.Объясните смысл выражений с указателями: воспользовавшись графическим представлением переменных, значений и указателей изобразите состояние памяти после вычисления выражений в каждом случае.

а) int x[5],*p; p=x+1;

б) int x=1; int*y=&x;

в) int x;int y[3]={1,2,3}; x=*(y+2);г) int **x,*y,z=0;x=&y;y=&z;

д) int r1[2]={11,12};int r2[2]={21,22}; int

*m[2]={r1,r2};

е) char* s=”123”;char c=*(s+3);

3.Напишите код на языке Си для выделения памяти под двумерный массив чисел типа int в динамической памяти (куче). Далее запишите код функции, на вход которой подаются указатель на этот массив, индексы элемента в массиве. Функция возвращает значение элемента массива, соответствующее переданным индексам. Индексация элементов - с нуля.

Варианты размещения:

а) построчное размещение элементов в памяти;

  1. #include <iostream>

  2. #include <stdlib.h>

  3. int func(int *t, int i, int j, int n){

  4. return *(t+i*n+j);

  5. }

  6. int main(){

  7. int *t;

  8. int n = 10;

  9. int m = 10;

  10. t = (int*) malloc(n*m*sizeof(int));

  11. for (int i = 0; i< n; i++){

  12. for (int j = 0; j<m; j++){

  13. *(t+i*n+j)=10*i+j;

  14. std::cout<<*(t+i*n+j)<<" ";

  15. }

  16. std::cout<<"\n";

  17. }

  18. for (int i = 0; i < m*n; i++){

  19. std::cout<<*(t+i)<<" ";

  20. }

  21. std::cout<<func(t,2,3,n)<<"\n";

  22. return 0;

  23. }

б) постолбцовое размещение элементов в памяти;

  1. #include <iostream>

  2. #include <stdlib.h>

  3. int func(int *t, int i, int j, int n){

  4. return *(t+j*n+i);

  5. }

  6. int main(){

  7. int *t;

  8. int n = 10;

  9. int m = 10;

  10. t = (int*) malloc(n*m*sizeof(int));

  11. for (int i = 0; i< n; i++){

  12. for (int j = 0; j<m; j++){

  13. *(t+j*n+i)=10*i+j;

  14. std::cout<<*(t+j*n+i)<<" ";

  15. }

  16. std::cout<<"\n";

  17. }

  18.  

  19.  

  20. std::cout<<func(t, 2,3,n)<<" ";

  21.  

  22. return 0;

  23. }

в) древовидное размещение (массив указателей на одномерные массивы).

  1. #include <iostream>

  2. #include <stdlib.h>

  3. int func(int **t,int i, int j){return *(t[i]+j);}

  4. int main(){

  5. int **t;

  6. int n = 10;

  7. int m = 5;

  8. t = (int**) malloc(n*sizeof(int*));

  9. for (int i = 0; i< n; i++){

  10. t[i] = (int*) malloc(m*sizeof(int));

  11. for (int j = 0; j<m; j++){

  12. *(t[i]+j)= 10*i+j;

  13. std::cout<<*(t[i]+j)<<" ";

  14. }

  15. std::cout<<"\n";

  16. }

  17. std::cout<<func(t,3,2);

  18. return 0;

  19. }

4. Имеется программа на языке Си

/* программа в одном файле */ #include <stdio.h>

int x=123;

int main(int,char**){printf(“%d\n”,x)}

Разделите программу на два файла таким образом, чтобы определение переменной x содержалось в одном файле, а ее использование (вывод на печать) – в другом.

  1. A.cpp

  2. #include <stdio.h>

  3. int x=123;

  4.  

  5. B.cpp

  6. #include <stdio.h>

  7. extern int x;

  8. int main(int,char**){printf(“%d\n”,x)}

5. Имеется два фрагмента кода на языке Си:

а) int fun1(){ int x=0; x++; return x; }

  1. for ( int i=0; i<5; i++){

  2. std::cout<<fun1();}

// out : 11111

б) int fun2(){ static int x=0; x++; return x; }

  1. for ( int i=0; i<5; i++){

  2. std::cout<<fun2();}

// out : 12345

В чем различие функций? Приведите контекст вызова, демонстрирующий разницу между ними.

6. Имеется два фрагмента кода на языке Си:

а) int fun1(){/*реализация пропущена*/}

б) static int fun2(){/*реализация пропущена*/}

В чем различие функций? Приведите пример, демонстрирующий разницу между ними.

Статическая функция видна другим функциям в пределах единицы трансляции(в одном файле).

7.С использованием модификаторов __declspec(dllimport)и __declspec(dllexport) напишите минимальный код

приложения, использующего код произвольной функции, импортируемой из динамической библиотеки:

а) случай неявного связывания (выполняемого загрузчиком при анализе заголовка исполняемого файла);

#ifdef MYDLL_EXPORTS

#define MYDLL_API __declspec(dllexport)

#else

#define MYDLL_API __declspec(dllimport)

#endif

// Переменная

extern MYDLL_API int Var;

// Функция

MYDLL_API void Function(int, int);

б) случай явного связывания (вызовами LoadLibrary и GetProcAddress).

//Load the DLL

HMODULE lib = LoadLibrary("testing.dll");

//Create the function

typedef void (*FNPTR)();

FNPTR myfunc = (FNPTR)GetProcAddress(lib, "myfunc");

//EDIT: For additional safety, check to see if it loaded

if (!myfunc) {

//ERROR. Handle it.

}

//Call it!

myfunc();

8.Имеется фрагмент кода (по листингу из отчета), создающий новый поток исполнения. Переделайте код таким образом, чтобы при создании потока в параметр функции потока записывалось целое число. Выведете это число на печать из функции потока.

  1. #include <windows.h>

  2. #include <iostream.h>

  3. DWORD WINAPI newthread(LPVOID iNum)

  4. {

  5. cout << "Thread is started." << endl;

  6. сout<<(int)iNum;

  7. cout << "Thread is finished." << endl;

  8. return 0;

  9. }

  10. int main()

  11. {

  12. int theinteger = 10;

  13. HANDLE hThread;

  14. DWORD IDThread;

  15. cout << "n = " << n << endl;

  16. hThread = CreateThread(NULL, 0, newthread, (void*)theinteger, 0, &IDThread);

  17. if (hThread == NULL)

  18. return GetLastError(); // ждем пока поток function закончит работу

  19. WaitForSingleObject(hThread, INFINITE); // закрываем дескриптор потока function

  20. CloseHandle(hThread);

  21. return 0;

  22. }

9.Напишите код с использованием Win32 API функций, реализующий простейшую конструкцию параллельного программирования «разветвление-слияние».Как можно организовать ожидание завершения вторичного потока?

  1. //include

  2. DWORD a = 5;

  3. DWORD b = 4;

  4. DWORD c = 3;

  5. HANDLE threads[2]; // 2 потока

  6. int main(){

  7. DWORD idThr1, idThr_2, ids;

  8. HANDLE thr1 = CreateThread(Null,0, thr1func,a,0,&idThr1);

  9. threads[0]= thr1;

  10.  

  11. DWORD idThr1, idThr_2, ids;

  12. HANDLE thr2 = CreateThread(Null,0, thr2func,b,0,&idThr2);

  13. threads[0]= thr2;

  14. ids = WaitForMultipleObjects(2,threads,TRUE,-1);

  15. CloseHandle(thr1);

  16. CloseHandle(thr2);

10.Объясните работу программы по листингу из Вашего отчета по лабораторной работе №8.