본문 바로가기

카테고리 없음

2024000066김태윤 14주차 수업시간 과제

함수의 선언, 정의, 호출이 있다.  argument(변수),parameter(매개변수)가 있다.

main함수 밖에 있으면 전역변수로, 전체에서 사용가능(어디서나). 어떠한 함수는 {} 블록 내에서만 사용이 가능하다. 앞에auto 라고 써도 되지만, 생략이 가능해서 거의 안쓴다.

기억부류 지정자는 4가지가 있지만, auto만 잘 알고있으면 된다.  이번 단원에서 scope도 중요하다.

지역변수는 블록 내에서만 사용이 가능하다. 전역변수는 전체에서 사용가능하지만, 많이 쓰지 않는것이 좋다고 한다.

선언위치(main)함수 기준으로 지역변수가 될수도, 전역변수가 될 수도있다.

우리가 지역변수를 쓸떄 데이터가 stack에 저장된다. 

지역변수는 블록에 들어가면 생기고, 블록에서 빠져나오면 바로 사라진다.

지역함수는 블록내에서만 유효하다. 파란 x,y는 main 함수 블럭에서만 유용하고.빨간 x,y는 add함수 블럭에서만 유요하다.

따라서 파란x,y와 빨간x,y는 완전 다른것

전역변수는 초깃값이 주어지지않으면 자동으로 0으로 초기화 되고, 전체소스에서 사용가능. 한번선언하면 프로그램이 끝날떄까지 유효하다. 만약  전역변수와 지역변수가 같이 있다면 블록내에서는 지역변수가 우선순위를 가진다.

auto변수는 지역변수이고, 블록내부에서만 생기고, 블록 밖으로 가면 바로 사라진다.

auto변수는 블록내부에서만 유효. 블록내부의 불록이 있다면 가장 안쪽이 우선순위를 가지게 되고, 그 블록을 벗어나면 다른블록에 초기화된 변수가 이용된다.

빠르게 하려면 앞에 register 이라고 쓰면 cpu의 레지스터에 저장하여 빠른 처리가 가능하지만, 요즘은 컴파일러가 알아서 해주기에, 상식 정도로만 생각.(시험x)

 

auto변수는 지역변수 생각하면 된다. auto변수는 생략가능하기에, 되도록 생략한다. 

메인함수 밖에쓰는 변수는 전역변수라고 하는데, 위의 표에선 지역변수(auto),전역변수만 제대로 보면 된다

이름만 있으면 변수라고 하고, 이름 뒤에 대괄호[] 가 있다면 배열 이라고 한다. 뒤에 쓰는 자연수는 방의 갯수를 나타낸다.

방을 사용할떄, 7개의 방이지만, 첫 방은 항상 0이다 (중요함.) 각각의 수를 배열의 원소 라고 하고. 배열의 마지막방은n-1, 즉 마지막 번쨰 방-1 인 숫자이다.

1차원 배열을 초기화 하는 방법  변수 뒤에 방을 써도 되지만, 초기화할떄 뒤에 {} 중괄호 후, 쓰면 방을 쓰지 않아도 된다.

문자형 초기화는 마지막에 \0을 써서 null문자를 써주도록 하자.//문자형을 초기화할떄( 하이라이트 부분) 문자 1개당 방 1개이므로, 7개+1(null) 이여서 방이 8개로 찍힌다( 띄어쓰기 포함)

name,name1이 완전히 같은것. 위 소스에선 print로 위의 방을 선택하여 찍을 수 있다. 자료형은 score은 int이니,%d.

name,name1은 문자이니 %c로 찍는다.

방의 갯수와, 초깃값을 같이 주면 방의 앞쪽에만 초기화 되고, 남는 방은 모두 0으로 자동 초기화된다. 

하지만, 방의갯수보다 초깃값이 더 많으면 에러가 난다.

처음 방의갯수와 배열 초기화후, 실행문에서 초기화를 하면 초기화 된다

배열의 이름=han1 이고, 배열의 시작주소는 0번쨰방(1번방) , 1번방의 주소를 구하는것과, 배열의 이름을 쓰면 둘다 주소가 나오고, 그 둘의 값이 같다.  시험에 나오니 꼭 해야함. 중요함. 매년 시험에 나온다 

배열의 이름만 써도 주소가 나온다. &ha1과, han1은 같은 값이 나온다는뜻.

2차원배열에서 6번쨰방을 묻는다면 2-2가 아닌.2-1이다(0부터시작)n-1

오른쪽 방부터 증가하고, 더이상 못하면 왼쪽방이 늘어남. 마지막방은 하나 적은 값 1-2이다

초기값 나눠도 가능.

초기값을 문자열로 주면 아스키 코드값으로 지정된다. 0번방=65~~   아까전에 했듯이  문자열도 하이라이트 부분이 같은것이다.

방을 보면 알겠지만, 둘이 같은것

scanf,scanf_s 의 차이점은 scanf_s는 name의 방이 10개이니, 문자를 9개 까지만 받고, 더이상받지 않는다. 하지만,scanf는 방의  갯수와 상관없이 다 받는다, scanf_s를 더 많이 써야한다. 배열의 이름이 name인채로, []를 쓰지않는것은, 

0(null)문자를 만날떄 까지 찍으세요 라는뜻이다. 따라서 scanf 의 %s를 쓸떄는 배열의 이름만 쓰는것이다.(&)안씀.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i, num[3], kor[3], eng[3], mat[3],c[3], total[3];
double avgkor = 0.0, avgeng = 0.0, avgmat = 0.0,avc = 0.0;
double avg[3];
printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃ 성적 처리 프로그램입니다. ┃\n");
printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
for (i = 0; i < 3; i++) {
printf("%d번째 학생의 학번을 입력하고 Enter를 누르세요=", i + 1);
scanf("%d", &num[i]);
printf("국어 점수를 입력하고 Enter를 누르세요=");
scanf("%d", &kor[i]);
printf("영어 점수를 입력하고 Enter를 누르세요=");
scanf("%d", &eng[i]);
printf("수학 점수를 입력하고 Enter를 누르세요=");
scanf("%d", &mat[i]);
printf("c언어 점수를 입력하고 Enter를 누르세요=");
scanf("%d", &c[i]);

total[i] = kor[i] + eng[i] + mat[i]+c[i];
avg[i] = total[i] / 4.0;
avgkor = avgkor + kor[i];
avgeng = avgeng + eng[i];
avgmat = avgmat + mat[i];
avc = avc +c[i];

} printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃ 성 적 처 리 결과입니다. ┃\n");
printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("학번 총점 평균\n");
for (i = 0; i < 3; i++) {
printf("%3d %6d %7.2f\n", num[i], total[i], avg[i]);
}
printf("국어 평균: %g\n영어 평균: %g\n수학 평균: %g\nc언어 평균: %g\n",
avgkor / 3., avgeng / 3., avgmat / 3.,avc / 3.);
return 0;
}

(소스고치기