#include <conio.h> #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define SCANCODE_ONE 49 #define SCANCODE_ZERO 48 typedef unsigned short us; typedef unsigned char uc; typedef unsigned long ul; typedef struct { ul zero; ul one; } datatype; // запрос символа с клавы uc getnum(void) { uc j, k=0; while ( !kbhit() ); while ( !k ) k = getch(); j=255; if ( k == SCANCODE_ONE ) j=1; if ( k == SCANCODE_ZERO ) j=0; return j; } void updatedata(datatype **data, uc *ans, uc depth) { int i, k; ul j; for ( i=(depth-1); i>=0; i-- ) { j=0; for ( k=(depth-1); k>=i; k-- ) j += ans[k] * (1<<(depth-1-k)); if ( ans[depth] == 1) data[depth-1-i][j].one++; if ( ans[depth] == 0) data[depth-1-i][j].zero++; } } uc analyse(datatype **data, uc *ans, uc depth) { int i, k; ul j, zero=0, one=0; for ( i=(depth-1); i>=0; i-- ) { j=0; for ( k=(depth-1); k>=i; k-- ) j += ans[k] * (1<<(depth-1-k)); one += data[depth-1-i][j].one; zero += data[depth-1-i][j].zero; } if ( zero > one ) return 0; else return 1; } void main ( void ) { ul all_answer=0, wrong_answer=0; uc depth; datatype **data; uc *ans; us i; uc t_ans, c; printf("\nDepth (1..20) : "); scanf("\%d", &depth); ans = (uc *)calloc( depth+1, sizeof(uc *)); if ( ((data = (datatype **)malloc( depth * sizeof(datatype *) )) == NULL) ) { puts("Not enough memory!"); exit(1); } for ( i=0; i<depth; i++ ) if ( (data = (datatype *)calloc( (1+(1<<(i+1))), sizeof(datatype) )) == NULL) { puts("Not enough memory!"); exit(1); } printf("\nPress '0' or '1'."); printf("\nAny other key - exit.\n\n"); while (1) { for ( i=0; i<depth; i++ ) ans = ans[i+1]; t_ans = analyse(data, ans, depth); if ( (ans[depth] = getnum()) == 255) return; updatedata(data, ans, depth); all_answer++; c = '+'; if ( t_ans != ans[depth] ) { wrong_answer++; c = '-'; } printf("? \%d - \%d ? \%0.3f ? \%d ? \%c ?\n", ans[depth], t_ans, (all_answer-wrong_answer)/(all_answer+1.0), all_answer, c ); } }
да я в том смысле что у студента не то что руки не от туда у него и голова незнама где раз кнопку нажать не смог в компиляторе