23.05.11.
Today I learned
- 컴공실
컴공실
tetris project Second week
그제 잘못짠 코드, 수정 코드 분석
fp = fopen("rnak.txt", "r");
rnak가 아니라 rank..
읽질 못했기 때문에 segmentation fault가 떴다.
void rank() {
int X = 1, Y = score_number, ch, i, j;
clear();
//printw를 이용해 현재 커서위치에 print 한다.
printw("1. list ranks from X to Y\n ");
printw("2. list ranks by a specific name\n");
printw("3. delete a specific rank\n");
//wgetch를 이용하면 비밀번호를 입력하는 것처럼 안보이게 입력받을 수 잇다.
ch = wgetch(stdscr);
if (ch == '1') {
printw("X: ");
scanw("%d", &X);
printw("Y: ");
scanw("%d", &Y);
//이대로 실행하면 키보드에 입력해도 표기되지 않는다. 앞뒤로 echo();와 noecho();를 넣어준다.
if (X > Y) {
printw("search failure: no rank in the list");
return;
}
count = 1;
Node* curr = head;
printw(" name | score\n");
printw("--------------------------------------\n");
for (i = count; i <= Y; i++) {
if (X <= i && i <= Y) {
printw(" %-18s| %-12d\n", curr->name, curr->score);
}
curr = curr->next;
if (curr == NULL) break;
}
//내가 혼자 인덱스를 count부터 시작해도 링크드리스트는 처음부터 시작하기때문에 의미가 없다.
//i를 1부터시작해(headnode부터 시작되기 때문에) count이전까지 반복하며 curr=curr->next로 같이 넘긴다.
}
//아무거나 입력받으면 종료시킨다.
getch();
}
if (head==NULL) {
head = node;
}
else if(curr->score<score){
node->next = curr;
curr = node;
head = curr;
}
else {
while (curr->next != NULL) {
if (curr->next->score > score) {
curr = curr->next;
}
else {
break;
}
}
node->next = curr->next;
curr->next = node;
}
헤드노드가 비었을 때, 헤드노드에 있는 수보다 클때, 나머지 경우로 구분해 삽입한다.
tetris project Second week
이름을 입력하여 rank에 일치하는 이름의 점수 출력하기
//4-2. 메뉴2: 문자열을 받아 저장된 이름과 비교하고 이름에 해당하는 리스트를 출력
else if (ch == '2') {
char str[NAMELEN + 1];
int check = 0;
Node* curr = head;
echo();
printw("input the name: ");
scanw("%s", str);
noecho();
printw(" name | score\n");
printw("--------------------------------------\n");
//curr가 NULL이 될 때까지 실행
while (curr) {
if (!strcmp(str, curr->name)) {//같으면
check = 1;
printw(" %-18s| %-10d\n", curr->name, curr->score);
}
curr = curr->next;
}
if (!check) {//이름이 한번도 안나왔으면
printw("serach failure: no name in the list\n");
}
}
랭킹을 입력해 해당 랭킹 삭제
//4-3. 메뉴3: rank번호를 입력받아 리스트에서 삭제
else if (ch == '3') {
int num,i;
Node* curr = head;
Node* prev = head;
echo();
printw("input the rank: ");
scanw("%d", &num);
noecho();
if (num <= 0 || num > score_number) {//없는 랭킹이면 오류 출력
printw("result: the rank not in the list\n");
}
else {
score_number--;
for (i = 1; i < num; i++) {//랭킹에 해당하는 링크드노스트 찾기
prev = curr;
curr = curr->next;
}
if (num == 1) {//headnode라면
if (curr->next == NULL) {//headnode뒤에 노드가 없다면
curr = NULL;
}
else {//headnode뒤에 노드가 있다면
curr = curr->next;
head = curr;
}
}
else {//headnode가 아니라면
prev->next = curr->next;
}
printw("result: the rank deleted\n");
//rank.txt 수정
curr = head;
FILE* fp = fopen("rank.txt", "w");
if (score_number) {//headnode가 NULL이 아니라면
fprintf(fp, "%d\n", score_number);
while (curr) {
fprintf(fp, "%s %d\n", curr->name, curr->score);
curr = curr->next;
}
}
else {//headnode가 NULL이라면
}
fclose(fp);
}
}