티스토리 뷰

c언어

[c언어] 싱글포인터, 배열 등

열혈허슬러 상추님 2019.06.19 20:59

190611 (2일차) - 싱글포인터, 배열

교육을 받으면서 노트필기 했던 내용을 날것 그대로 업로드합니다.

 
 
제목 : .net_아무개
 

#소문자 대문자 쉽게 바꾸기
#include <stdio.h>
#pragma warning(disable:4996)
main() {
char ch = 'A';
printf("%c %c\n", ch ^ 32, 'a'^32);
}
 
 

 
링킹과정에서 CPU에 맞게 언어가 번역이된다.(CPU정보가 들어간다.)
 
자바에서는 JVM으로 돌림.
 
C는 운영체제에 맞춰서 컴파일하여 돌려야한다. (다른 운영체제에서 컴파일한 실행파일을 다른 운영체제에서 돌아가지 않음).
 
 
#GOTO 사용 10까지 더하기
#include <stdio.h>
#pragma warning(disable : 4996)
main()
{
int i = 1;
int sum = 0;
sumloop:
sum += i++;
if (i < 11)
goto sumloop;
printf("sum: %d\n", sum);
}

 
Stack-...-heap-Bss-Data-Code
heap영역이 제일 크다.
 

 
#include <stdio.h>
#pragma warning(disable : 4996)
main()
{
int arr[5] = {1, 33, 5, 10, 100};
int sum = 0;
int max = -1;
for (int i = 0; i < sizeof(arr) / sizeof(int); ++i)
{
printf("%d\n", arr[i]);
sum += arr[i];
if (max < arr[i])
max = arr[i];
}
printf("sum: %d\n", sum);
printf("max: %d\n", max);
}

 
#include <stdio.h>
#pragma warning(disable : 4996)
main()
{
int arr[5] = {1, 33, 5, 10, 100};
int sum = 0;
int max = -1;
for (int dx = 0; dx < sizeof(arr) / sizeof(arr[0]); dx++)
{
scanf("%d", arr + dx);
}
for (int i = 0; i < sizeof(arr) / sizeof(int); ++i)
{
printf("%d\n", arr[i]);
sum += arr[i];
if (max < arr[i])
max = arr[i];
}
printf("sum: %d\n", sum);
printf("max: %d\n", max);
}

 
#랜덤
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#pragma warning(disable:4996)
main() {
int dx;
int rnum;
srand(time(NULL));
for (dx = 0; dx < 5; ++dx) {
rnum = rand();
printf("%d ", rnum%10);
}
}
 
#나이맞추기
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#pragma warning(disable:4996)
main() {
int rnum;
srand((unsigned int)time(NULL));
rnum = rand() % 100 + 1;
while (1) {
static int times = 0;
int guess = 0;
printf("나이를 입력하세요 : ");
scanf("%d", &guess);
times++;
if (rnum == guess) {
printf("%d번만에 맞추셨습니다.\n", times);
break;
}
else if (rnum < guess) {
printf("보다 작습니다.\n");
}
else if (rnum > guess) {
printf("보다 큽니다.\n");
}
}
}
 

 
#include <stdio.h>
#pragma warning(disable:4996)
main() {
char b[] = "ABCDEF";
strcpy(&b[2], "xyz");
puts(b);//ABxyz\
}
 

//2차원 배열
int a[2][3];
 
주소를 찍는 방법 5개
  1. &a
  2. a
  3. &a[0]
  4. a[0]
  5. &a[0][0]
 

 
#주소의 의미
cf.
int a[2][3] 에서
sizeof(a) == 24
sizeof(a[0]) == 12
sizeof(a[0][0]) == 4
 
a+1 => 한 행 건너뜀
a[0]+1 => 한 원소 건너뜀
a[0][0] + 1 => 원소 자체에 숫자 1을 더함
 
&a+1 => 총 블럭크기 만큼 건너 뜀
&a[0]+1 => 한 행 건너뜀
&a[0][0]+1 => 한 원소 건너뜀

 
int a[2][3]
int형 메모리
[3] 개짜리가
[2] 개인
a 배열
 
#읽는순서
 

 


 

 
#확인
 
 
#include <stdio.h>
#pragma warning(disable:4996)
main() {
int a[2][3];
printf("%x %x %x", &a[0][0], &a[0][1], &a[0][2]);
puts("");
printf("%x %x %x", &a[1][0], &a[1][1], &a[1][2]);
puts("");
printf("a + 1 : %x", a + 1);
puts("");
printf("&a[0]+1 : %x", &a[0]+1);
puts("");
printf("a[0]+1 : %x", a[0]+1);
puts("");
printf("&a[0][0]+1 : %x", &a[0][0]+1);
puts("");
printf("sizeof(a) : %d", sizeof(a));
puts("");
printf("sizeof(&a[0]): %d", sizeof(&a[0]));
puts("");
printf("sizeof(a[0]) : %d", sizeof(a[0]));
puts("");
printf("sizeof(&a[0][0]) : %d", sizeof(&a[0][0]));
puts("");
}
6ff988 6ff98c 6ff990
6ff994 6ff998 6ff99c
a + 1 : 6ff994
&a[0]+1 : 6ff994
a[0]+1 : 6ff98c
&a[0][0]+1 : 6ff98c
sizeof(a) : 24
sizeof(&a[0]): 4
sizeof(a[0]) : 12
sizeof(&a[0][0]) : 4
a[0][0]+1 : cccccccd

void get_sub_name(char* sub_name) {

     printf("과목의 이름을 입력하세요 : ");

     scanf("%s", sub_name);

}

 
#열과 행 합구하기
#include <stdio.h>
#pragma warning(disable:4996)
main() {
int a[2][3] = { 1,2,3,
4,5,6 };
int colSum[3] = { 0,0,0 };
for (int i = 0; i < sizeof(a) / sizeof(a[0]); ++i) {
int rowSum = 0;
for (int j = 0; j < sizeof(a[0]) / sizeof(a[0][0]); ++j) {
printf("%d ", a[i][j]);
rowSum += a[i][j];
colSum[j] += a[i][j];
}
printf("| %d\n", rowSum);
}
printf("__________\n");
for (int i = 0; i < sizeof(a[0]) / sizeof(a[0][0]); ++i) {
printf("%d ", colSum[i]);
}
printf("|\n");
}
1 2 3 | 6
4 5 6 | 15
__________
5 7 9 |
 
 
cf.
int a[2][3] 에서
sizeof(a) == 24
sizeof(a[0]) == 12
sizeof(a[0][0]) == 4
 
a+1 => 한 행 건너뜀
a[0]+1 => 한 원소 건너뜀
a[0][0] + 1 => 원소 자체에 숫자 1을 더함
 
&a+1 => 총 블럭크기 만큼 건너 뜀
&a[0]+1 => 한 행 건너뜀
&a[0][0]+1 => 한 원소 건너뜀
 
*a == a[0]
*(a+1) == a[1]
 
#3차원 배열.
 

 
#포인터
 
#include <stdio.h>
#pragma warning(disable:4996)
main() {
int a = 7;
int * p;
p = &a;
printf("%x : %d", p, *p);
puts("");
printf("%x : %d", &a, *&a);
puts("");
}
f8f89c : 7
f8f89c : 7
 
 

 
#포인터를 이용한 스왑 방법
#include <stdio.h>
#pragma warning(disable:4996)
main() {
int a = 10;
int b = 5;
 
int* pa = &a;
int* pb = &b;
 
printf("*pa: %d, *pb: %d", *pa, *pb);
puts("");
 
int tmp;
tmp = *pa;
 
*pa = *pb;
*pb = tmp;
 
printf("*pa: %d, *pb: %d", *pa, *pb);
puts("");
}
*pa: 10, *pb: 5
*pa: 5, *pb: 10
 

 
#왜 굳이 포인터를 쓰는가
-함수에 포인터로 넘겨주어야 원본값 변경이 가능
 
 

 
#include <stdio.h>
#pragma warning(disable:4996)
void fnc(int* p) {
for (int i = 0; i < 5; ++i) {
printf("%2d", *(p + i));
}
}
main() {
int a[5] = { 3,4,1,5,2 };
fnc(a);
}
3 4 1 5 2
 
 

 
 

 

void main(void)
{
char sub_name[15]; /* 과목 이름 */
float exm_rlt[10]; /* 시험 점수 */
int exm_cnt = 0; /* 시험 회수 */
float total; /* 총점 */
float average; /* 평균 */
char grade; /* 학점 */
get_sub_name(sub_name); /* 과목 이름 */
exm_cnt = get_exm_cnt(); /* 시험 회수 */
get_exm_rlt(exm_rlt, exm_cnt);/* 시험 점수*/
total = get_total(exm_rlt, exm_cnt); /* 총점 계산 */

 

average = get_average(total, exm_cnt); /* 평균 계산 */
grade = get_grade(average); /* 학점을 계산합니다. */
print_result(sub_name, exm_cnt, exm_rlt,
total, average, grade); /* 모든 결과 */
}
#코드
#include <stdio.h>
#pragma warning(disable:4996)
void get_sub_name(sub_name);
int get_exm_cnt();
void get_exm_rlt(exm_rlt, exm_cnt);
float get_total(exm_rlt, exm_cnt);
float get_average(float total, int exm_cnt);
char get_grade(float average);
void print_result(char* sub_name, int exm_cnt, float* exm_rlt,
float total, float average, char grade);
void main(void)
{
char sub_name[15]; /* 과목 이름 */
float exm_rlt[10]; /* 시험 점수 */
int exm_cnt = 0; /* 시험 회수 */
float total; /* 총점 */
float average; /* 평균 */
char grade; /* 학점 */
get_sub_name(sub_name); /* 과목 이름 */
exm_cnt = get_exm_cnt(); /* 시험 회수 */
get_exm_rlt(exm_rlt, exm_cnt);/* 시험 점수*/
total = get_total(exm_rlt, exm_cnt); /* 총점 계산 */
 
average = get_average(total, exm_cnt); /* 평균 계산 */
grade = get_grade(average); /* 학점을 계산합니다. */
print_result(sub_name, exm_cnt, exm_rlt,
total, average, grade); /* 모든 결과 */
}
void get_sub_name(char* sub_name) {
printf("과목의 이름을 입력하세요 : ");
scanf("%s", sub_name);
}
int get_exm_cnt() {
printf("시험 횟수를 입력하세요 : ");
int n;
scanf("%d", &n);
return n;
}
void get_exm_rlt(float* exm_rlt, int exm_cnt) {
for (int i = 0; i < exm_cnt; ++i) {
printf("%d차 시험 점수는 : ", i+1);
scanf("%f", exm_rlt + i);
}
}
float get_total(float* exm_rlt, int exm_cnt) {
float sum=0.0f;
for (int i = 0; i < exm_cnt; ++i) {
sum += *(exm_rlt + i);
}
return sum;
}
float get_average(float total, int exm_cnt) {
 
return total / (float)exm_cnt;
}
char get_grade(float average) {
//50이상 a
if (average >= 50.0f){
return 'a';
}
else{
return 'b';
}
}
void print_result(char* sub_name, int exm_cnt, float* exm_rlt,
float total, float average, char grade) {
puts("--- 결과 ---");
printf("과목이름 : %s\n", sub_name);
for (int i = 0; i < exm_cnt; ++i) {
printf("%d차 시험점수 : %.0f\n", i + 1, *(exm_rlt + i));
}
printf("총점 : %.2f\n", total);
printf("평균 : %.2f\n", average);
printf("학점 : %c\n", grade);
}
댓글
댓글쓰기 폼
네이버 이웃추가
«   2019/10   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
글 보관함