Примерно задание за второ контролно и поправителен изпит ПИК1
===============================================================


Продължителността на контролната работа е два учебни часа – 90 минути. Забранява се използването на електронни устройства – компютри, таблети, телефони. Разрешава се ползването на материалите от лекциите както и 4 допълнителни страници (два листа) формат А4 написани от студента (не ксероксни копия) с всякаква помощна информация. Контролната работа се състои от три части.

Първата част проверява усвояването на операции, управляващи конструкции, извикване на функции и връщане на резултати, класове памет, работа с указатели и масиви. Студентът разчита записан код, в който на всеки ред е записан пример с някои от проверяваните елементи и показва резултатите от изпълнението му. Необходимите пресмятания за получаване на резултата задължително се правят в писмен вид и се прилагат към резултатите от изпълнение на кода.  Ако те не бъдат приложени, частта се счита за неизпълнена. Първата част се счита за изпълнена на 50%, ако половината от отговорите са верни и обосновани със съответните пресмятания.

Втората част проверява възможностите на студентите за разчитане на задание, алгоритмизиране и кодиране на задача с елементарен алгоритъм – намиране на сума, максимално, минимално число, проверка за четни и нечетни числа. Оценява се усвояването на работата с текстови файлове – начини на отваряне, прочитане, записване, работа с форматни спецификации, решенията взимани от студента за избор на начина на четене и запис. Заданието изисква създаването на две функции (освен функцията main() ) с точно определени аргументи, едната от които изисква четене и запис на символи, а втората – на числови стойности. Втората част се счита за изпълнена на 50%, ако едната от двете функции е правилно написана и правилно извикана за изпълнение.

Третата част оценява способността на студента да разпознава основните управляващи структури и тяхното взаимодействие, да различава и кодира различните видове цикли. В нея се задава блокова схема, която включва две управляващи структури. От студента се изисква да ги разпознае и кодира на езика С като част от програма, без да се търси смисъла на алгоритъма, декларация на променливите и цялостно оформяне на програмата. Частта се счита за изпълнена на 50%, ако правилно е разпозната и кодирана една от двете управляващи структури.

Общата оценка се оформя на базата на процента на изпълнението на заданието. Оценява се процентното изпълнение на всяка част и се умножава по тежестта на отделните части. Полученото процентно изпълнение се оценява по следния начин:

 

среден 3:             50% изпълнение

добър 4 : 65% изпълнение

мн. добър 5:        80% изпълнение

отличен 6:           90% изпълнение

 

Тежестта на отделните части в оценяването е: първа част – 35%, втора част – 45%, трета част 20%.



1. Kакво ще изведе следната програма (в черновата трябва
 да личи как сте получили резултатите):

#include <stdio.h>
static float w=3.9;
short f(short a, short *b) {a++; (*b)++; w++;
     printf ("13: %d %d %4.2f\n",a,*b,w);return a-*b;}
int main(){
   short x, y, z, arr[]={4,8,0,6}, *p=arr;
   char m[]="dcrfvtgb",*pc;
   y=2;z=3; x = (++y !=z); printf("1: %d %d %d\n",x,y,z);
   x=y=6; x *=(y=5); printf("2: %d %d\n",x,y);
   x=0;y=2;z=7; printf("3: %d %d %d %d\n",!x||y&&!z, x,y,z);
   x=5;y=3; printf("4: %d %d %d\n",x, y, x<y? x:y);
   y=0; if(y) x=7;else x=5; printf("5: %d %d\n",x,y);
   y=8;if(z=(y++>8))x=9;else x=0; printf("6: %d %d %d\n",x,y,z);
   x=y=5; while(y++<5) x+=y; printf("7: %d %d\n",x,y);
   for(x=y=5;y<7;x=y++) printf("8:%d %d\n",x,y);
   for(x=2,y=5;y>=1;x++,y/=3); printf("9: %d %d\n",x,y);
   printf("10: %d %d\n",p[2], *(arr+1));
   x=y=3; z=f(x,&y); printf("11:%d %d %d %4.2f\n", x,y,z,w) ;
   for(x=y=z=10 ; z-- >9 ;x*=y);printf("12: %d %d %d\n",x,y,z);
   for (pc=m; *pc ; pc++) (*pc)--;
   printf("14: %s %c\n",m+2, *(m+1));
   return 0;
}

1: 0 3 3 ++y новата стойност на y е 3 и не е различна от стойността на z -> x=0
2: 30 5 x=6;y=5; x*=5 = 30
3: 1 0 2 7 x=0,y=2,z=7; !x=1 в операция или вторият аргумент няма значение и не се изчислява
4: 5 3 3 x=5,y=3; x<y ->0 взима се стойността след : -> 3
5: 5 0 y=0 значи в if резултатът е в else-> x=5
6: 0 9 0 y=9; y++>8 старата стойност (8) не е по голяма ->z=0, резултатът е в else->x=0
7: 5 6 y++<5  не е вярно, но y придобива нова стойност 6
8:5 5 x=y=5 -> първи печат,
8:5 6 стъпка x= старата стойност на  y (5), y увеличава стоинстта си (6), втори печат,
на стъпката y=7 край на цикъла
9: 4 0 x=2,y=5, цикъл продължава, x=3,y=1, цикъл продължава, x=4,y=0,
край на цикъла, печат 1 път вън от цикъла
10: 0 8 p[2] е третият елемент от масива arr, arr - указател към масива
arr+1 - указател към втория елемент, *(arr+1) самият елемент
13: 4 4 4.90 Извикване на функцията -> а=3, b=3, w=3.9,
Отпечатват се новите им стойности (увеличени с по 1)
резултат  от функцията 4-4 -> 0
11:3 4 0 4.90 След връщането от функция - x не е променено (3), y е променено(4)
z е резултата от функцията (0), а w е променено(4.9)
12: 100 10 8 Старата стойност на z (10) е по-голяма от 9, стъпка: x=x*y=100;
старата стойност на z (9) не е по-голяма от 9, z става 8, край на цикъла
14: qeusfa b
pc=m; pc сочи към първия елемент на m[]=>"dcrfvtgb"
в цикъла (*pc)--; намалява стойността на всеки елемент с 1
(предната буква от азбуката): m[] => "cbqeusfa"
m+2 сочи към стринга започващ от третия символ: m+2 => "qeusfa"
*(m+1) е втория му елемент 'b'

2. В текстовия файл D:\Tt\Kapa.txt са въведени цели числа, записани по едно на ред. Напишете програма на езика С, с три функции:

a)int main(), която отваря файла, извиква другите две функции, извежда получения резултат на екрана  и затваря файла;

b)int max(FILE *) за изчисляване на  най-голямото отрицателно число във файла;

c)void cpy2(FILE *) за копиране на файла в зададен от потребителя файл като навсякъде цифрата 2 се заменя с цифрата 4.
#include <stdio.h>
#include <string.h>
int max(FILE *);
void cpy2(FILE *);
int main(){
    FILE *f;
    int mn;
    if( !(f=fopen("D:\\Tt\\Kapa.txt","rt"))){
        printf("the file does not exist\n");
        return 1;
    }
    if(!(mn=max(f))) printf("there is no negatives numbers in the file \n");
    else printf ("the max negative number is %d\n",mn);
    rewind(f);
    cpy2(f);
    fclose(f);
    return 0;
}
int max(FILE *inp){
    int next,maxneg=0;
    for(;fscanf(inp,"%d",&next)!= EOF;){  
        if(next <0){
            if(!maxneg)    maxneg=next;
            else if(maxneg<next) maxneg=next;
        }
    }
    return maxneg;
}
void cpy2(FILE *inp){
    FILE *outp;
    char name[51];
    int next;
    printf ("name of the new file: ");
    if(!fgets(name,50,stdin)){
        printf("Error in the new file name 1");
        return;
    }
    name[strlen(name)-1]=0;   /* remove '\n' in the string */
    if(!(outp=fopen(name,"w"))){
        printf("Error in the new file name 2");
        return;
    }
    for(;(next=fgetc(inp))!= EOF;){
        if (next == '2') next = '4';
        if(fputc(next,outp)==EOF){
            printf("Error - in file writing");
            return;  
        }
    }
    fclose(outp);
}


 3.Преведете на езика С  следния отрязък от блок-схема:

m=c;
do{
    if(a>b){
        if(!(a>c)) z[m]=a;
     }
     else{
         if(b>c) break;
         else z[m]=b;
     }
     k[i]=m++;
}while(m<b);




=============================================
Втори пример:
===============================================================
1. Опишете съвсем точно какво ще изведе следната програма:

#include <stdio.h>
static float w=3.4;
short f(short a, short *b) {a++; (*b)++; w++;
printf ("13: %d %d %4.2f\n",a,*b,w);return a+*b;}
int main(){
short x, y, z, arr[]={1,5,7,3}, *p=arr;
char m[]="successful",*pc;
y=z=3; x = (y++ !=z); printf("1: %d %d %d\n",x,y,z);
x=y=3; x *=(y=2); printf("2: %d %d\n",x,y);
x=1;y=0;z=4; printf("3: %d %d %d %d\n",x||y&&!z, x,y,z);
x=2;y=1; printf("4: %d %d %d\n",x, y, x<y? x:y);
y=5; if(y) x=4;else x=2; printf("5: %d %d\n",x,y);
y=3;if(z=(y++>5))x=5;else x=3;
printf("6: %d %d %d\n",x,y,z);
x=y=2; while(y++<2) x+=y; printf("7: %d %d\n",x,y);
for(x=y=2;y<3;x=y++) printf("8:%d %d\n",x,y);
for(x=1,y=7;y>=1;x++,y/=3); printf("9: %d %d\n",x,y);
printf("10: %d %d\n",p[1], *(arr+2));
x=y=1; z=f(x,&y); printf("11:%d %d %d %4.2f\n", x,y,z,w) ;
for(x=y=z=10 ; z-- >0 ;x*=y);printf("12: %d %d %d\n",x,y,z);
x=2;y=4;f(x,&y);printf("14: %d %d\n",x,y);
for (pc=m; *pc ; pc++) (*pc)++;
printf("15: %s %c\n",m+2, *(m+1));
return 0;
}


2. В текстовия файл A:\Test\Sign.txt са въведени цели числа, записани по едно на ред.
Напишете програма на езика С, с 3 функции
a)int main(), която отваря файла извиква другите 2 функции и затваря файла
b)int avrg(FILE *) за извеждане на екрана и в зададен от потребителя файл средно-аритметичното на положителните числа
c)void dig6(FILE *) за извеждане на екрана, колко пъти се среща цифрата 6 във зададения файл.


3.Преведете на езика С следният отрязък от блок-схема:



Отговори: за 2-ри пример

========================================================