Skip to content
Snippets Groups Projects
Commit 3d25a1d7 authored by 희원 전's avatar 희원 전
Browse files

Upload New File

parents
No related branches found
No related tags found
No related merge requests found
#include <stdio.h>
typedef struct
{
int buttonID; // 버튼 ID
long timestamp; // 타임스탬프 (msec)
int eventType; // 0: Up-Down, 1: Down-Up
} ButtonEvent;
void processClickEvents(ButtonEvent *events, int size, int doubleClickLimit) {
for (int i = 0; i < size; i++) {
// 유효한 버튼인지 확인
if (events[i].buttonID != 1 && events[i].buttonID != 2 && events[i].buttonID != 3 && events[i].buttonID != 4)
continue;
// Up-Down 이벤트
// Single Click 또는 Double Click 검사
if (events[i].eventType == 0) {
// 같은 버튼의 Down-Up 이벤트가 500ms 이내에 발생
if (events[i + 1].eventType == 1 && events[i].buttonID == events[i + 1].buttonID && events[i + 1].timestamp - events[i].timestamp <= doubleClickLimit) {
// 해당 Down-Up 이벤트가 마지막
if (i + 1 == size - 1) {
printf("(A) Button ID: %d, ClickType: Single, Timestamp: %ld\n", events[i].buttonID, events[i].timestamp);
// 같은 버튼의 Up-Down 이벤트가 500ms 이내에 발생
} else if (events[i + 2].eventType == 0 && events[i + 1].buttonID == events[i + 2].buttonID && events[i + 2].timestamp - events[i + 1].timestamp <= doubleClickLimit) {
printf("(B) Button ID: %d, ClickType: Double, Timestamp: %ld\n", events[i].buttonID, events[i + 2].timestamp);
// 다음 이벤트로 넘어감
i = i + 3;
// 다른 버튼의 이벤트 발생: Single Click
} else {
printf("(C) Button ID: %d, ClickType: Single, Timestamp: %ld\n", events[i].buttonID, events[i].timestamp);
i++;
}
// 같은 버튼의 Down-Up 이벤트가 늦게 발생
} else if (events[i + 1].eventType == 1 && events[i].buttonID == events[i + 1].buttonID) {
printf("(D) Button ID: %d, ClickType: Single, Timestamp: %ld\n", events[i].buttonID, events[i].timestamp);
i++;
// 다른 버튼의 이벤트 발생
} else if (events[i].buttonID != events[i + 1].buttonID) {
printf("(E) Button ID: %d, ClickType: Single, Timestamp: %ld\n", events[i].buttonID, events[i].timestamp);
} else {
printf("(F) Button ID: %d, ClickType: Single, Timestamp: %ld\n", events[i].buttonID, events[i].timestamp);
}
}
}
}
int main()
{
// 더블 클릭 제한 시간
int doubleClickLimit = 500;
// 예제 이벤트 큐
// Double Click 정상 예제 1
ButtonEvent queue1[] = {
{1, 1000, 0},
{1, 1050, 1},
{1, 1100, 0},
{1, 1150, 1},
{4, 1200, 0},
{4, 1250, 1},
{4, 1200, 0},
{4, 1250, 1},
};
// Double Click 정상 예제 2 (연속 더블 클릭)
ButtonEvent queue2[] = {
{2, 2000, 0},
{2, 2020, 1},
{2, 2050, 0},
{2, 2070, 1}, // 더블클릭 1회
{2, 2100, 0},
{2, 2120, 1},
{2, 2150, 0},
{2, 2170, 1}, // 더블클릭 2회
};
// Single Click 정상 예제 1
ButtonEvent queue3[] = {
{3, 3000, 0},
{3, 3050, 1},
{2, 3100, 0},
{4, 3150, 0}, // 한 버튼에서 손을 떼기 전에 다른 버튼 이벤트 발생
{2, 3200, 1},
{4, 3250, 1}, // 둘 다 싱글 클릭으로 판정
};
// Single Click 정상 예제 2 (더블클릭 후 싱글클릭)
ButtonEvent queue4[] = {
{4, 4000, 0},
{4, 4100, 1},
{4, 4200, 0},
{4, 4300, 1},
{4, 4400, 0},
{4, 4500, 1},
};
// 비정상 예제 - Double Click Timeout
ButtonEvent queue5[] = {
{1, 5000, 0},
{1, 6000, 1}, // 너무 늦은 Down-Up 이벤트
{1, 6100, 0},
{1, 6200, 1},
};
// 비정상 예제 - Double Click Timeout
ButtonEvent queue6[] = {
{1, 5000, 0},
{1, 5050, 1},
{1, 6000, 0}, // 너무 늦은 두 번째 클릭
{1, 6050, 1},
};
// 비정상 예제 - 더블 클릭 사이에 다른 버튼을 눌렀을 때
ButtonEvent queue7[] = {
{2, 7000, 0},
{2, 7010, 1},
{4, 7020, 0},
{4, 7030, 1}, // 사이에 다른 버튼이 눌리면서
{2, 7040, 0},
{2, 7050, 1}, // 3개의 싱글 클릭 처리
};
// 비정상 예제 - 잘못된 순서
ButtonEvent queue8[] = {
{3, 8000, 1}, // 잘못된 시작 (Up-Down)
{3, 8050, 0},
};
// 비정상 예제 - 혼합된 버튼
ButtonEvent queue9[] = {
{4, 9000, 0},
{3, 9050, 1}, // 다른 버튼
{4, 9100, 0},
{4, 9150, 1},
};
// 비정상 예제 - 버튼 ID 없음
ButtonEvent queue10[] = {
{-1, 11000, 0}, // 유효하지 않은 버튼 ID
{-1, 11050, 1},
};
// 모든 큐를 배열에 저장
ButtonEvent* queues[] = {queue1, queue2, queue3, queue4, queue5, queue6, queue7, queue8, queue9, queue10};
int queueSizes[] = {8, 8, 6, 6, 4, 4, 6, 2, 4, 2}; // 각 큐의 크기
// 큐 처리 반복문
for (int i = 0; i < 10; i++) {
printf("Processing Queue %d:\n", i + 1);
processClickEvents(queues[i], queueSizes[i], doubleClickLimit);
printf("\n");
}
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment