2022.9.20.(火)
CS50
debugging 디버그
#include <stdio.h>
int main(void)
{
for (int i = 0; i <=10; i++)
{
printf("#\n");
}
}
#을 10번 출력하는 프로그램을 만드려 했지만, 11번 출력되고 있다.
효과적인 디버깅 도구는 일단 출력해보는 것이다.
#include <stdio.h>
int main(void)
{
for (int i = 0; i <=10; i++)
{
printf("현재 i의 갯수는 %i개\n",i);
printf("#\n");
}
}
출력되는 갯수의 시각화를 위한 출력문을 하나 더 추가했다.
현재 i의 갯수는 0개 # 현재 i의 갯수는 1개 # 현재 i의 갯수는 2개 # 현재 i의 갯수는 3개 # 현재 i의 갯수는 4개 # 현재 i의 갯수는 5개 # 현재 i의 갯수는 6개 # 현재 i의 갯수는 7개 # 현재 i의 갯수는 8개 # 현재 i의 갯수는 9개 # 현재 i의 갯수는 10개 # |
문제점을 발견했다! 0에서 시작했기 때문에 결론적으로 11개가 출력된 것이다.
i <=10; 를 i <10; 으로 수정하고, 10 미만의 수까지 읽도록 했다.
해결!
이제 CS50 수업에선
새로운 코드 작성 프로그램을 사용한다.
CS50 IDE
integrated development environment for students and teachers We are sunsetting CS50 IDE and VS Code for CS50 is our new integrated development environment. Please check out this documentation on migrating your files from CS50 IDE to your Codespace.
ide.cs50.io
코드에서 행의 왼쪽에 커서를 가져가면 빨간 징이 생긴다.
이는 중지점(break point)이라 한다.
원하는 지점에서 잠시 멈춤고
terminal에서 debug50을 입력해 우측의 Debugger 기능을 사용할 수 있게 활성화한다.
해당 기능에서는 변수의 상황과 중지점에서부터 실행되는 프로그램의 과정을 한단계씩 확인 가능하다.
모던 Javascript 튜토리얼
자바스크립트에 존재하는 3가지 논리 연산자
|| (OR), && (AND), ! (NOT)
- 피연산자가 불린형이 아니라면, 저절로 변환된다.
|| (OR)
- 받은 인수 중 하나라도 true라면 ture를 반환한다.
alert( true || true ); // true
alert( false || true ); // true
alert( true || false ); // true
alert( false || false ); // false
let age = prompt("몇 살인가요?",0);
if (age < 12 || age > 18) {
alert("청소년이 아닙니다.");
}
- ||에 피연산자를 여러개 넣으면…
- 왼쪽 부터 차례대로 불린형으로 변환하며 평가하고
- 전환값이 true인걸 하나라도 만나면, 당장 연산을 종료한다.
- 그리고 변환 이전 값을 반환한다.
- 만약 전부 false 라면 마지막에 평가한 값을 내놓는다.
- 와~ 변수로 넣는 것도 가능하다!
let first = "";
let second = "";
let third = "";
alert( first || second || third || "암것도 없음"); // 암것도 없음 출력
// 앞의 3개 변수에 할당된 값이 전부 불린형으로 전환될 시 false이기 때문에
// 마지막의 "암것도 없음"을 true로 인식하고 그것을 반환함
- 단락 평가
- true에서 바로 멈추는 것을 이용해서, false일 경우 무언가를 실행하게 하는 것도 가능하다
true || alert("그냥 출력안함");
false || alert("틀렸어요"); // 틀렸어요 출력
- alert메서드 값은 반환하지 않는다.
alert( alert(1) || 2 || alert(3) );
// alert(1)을 평가하면서 실행은 되지만, 값은 undefiend를 반환 후
// 다음 2를 평가하고 종료된다.
&& (AND)
- 받은 인수 중 하나라도 false라면 false를 반환한다.
alert( true && true ); // true
alert( false && true ); // false
alert( true && false ); // false
alert( false && false ); // false
let age = prompt("몇 살인가요?",0);
if (age > 12 && age < 18) {
alert("청소년입니다.");
}
- &&에 피연산자를 여러개 넣으면…
- 왼쪽 부터 차례대로 불린형으로 변환하며 평가하고
- 전환값이 false인걸 하나라도 만나면, 당장 연산을 종료한다.
- 그리고 변환 이전 값을 반환한다.
- 만약 전부 true 라면 마지막에 평가한 값을 내놓는다.
let first = 1;
let second = 2;
let third = 3;
alert( first && second && third && "다 들어있음"); // 다 들어있음 출력
// 앞의 3개 변수에 할당된 값이 전부 불린형으로 전환될 시 true 이다.
// 마지막의 "다 들어있음"도 true지만, false 값이 없었기 때문에 그것만 반환함
💛 if문을 짧게 줄이는 용도로 쓰기도 하지만, 아예 대체하진 말아요.
! (NOT)
- 피연산자의 역을 반환한다.
alert( !true ); // false
alert( !false ); // true
- 연속공격 가능
alert( !!true ); // true
alert( !!false ); // false
- !! = Boolean
alert( Boolean(true) ); // true
💛 우선 순위 ! > && > ||
로그인 구현해보기
내가 쓴 코드 🔽
let who = prompt("아이디를 입력하세요.","");
if (who == "Admin") {
let admin = prompt("비밀번호를 입력하세요.","");
if (admin == "TheMaster"){
alert("환영합니다!");
}
else if (admin || 0) {
alert("인증에 실패했습니다.");
}
else {
alert("취소되었습니다.");
}
}
else if (who || 0) {
alert("누구세요?");
}
else {
alert("취소되었습니다.")
}
튜토리얼 모범답안 🔽
let userName = prompt("사용자 이름을 입력해주세요.", '');
if (userName == 'Admin') {
let pass = prompt('비밀번호:', '');
if (pass == 'TheMaster') {
alert( '환영합니다!' );
} else if (pass == '' || pass == null) {
alert( '취소되었습니다.' );
} else {
alert( '인증에 실패하였습니다.' );
}
} else if (userName == '' || userName == null) {
alert( '취소되었습니다.' );
} else {
alert( "인증되지 않은 사용자입니다." );
}