void func()

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

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. std::cout<<func(t, 2,3,n)<<" ";
  19. return 0;
  20. }

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

  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. B.cpp
  5. #include <stdio.h>
  6. extern int x;
  7. 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. DWORD idThr1, idThr_2, ids;
  11. HANDLE thr2 = CreateThread(Null,0, thr2func,b,0,&idThr2);
  12. threads[0]= thr2;
  13. ids = WaitForMultipleObjects(2,threads,TRUE,-1);
  14. CloseHandle(thr1);
  15. CloseHandle(thr2);

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: