본문 바로가기

웹_프론트_백엔드/C언어

[자료구조] 2020.07.15

1. [과제] 입력: 1 1 0
            출력: 2 1(2개의 1)
            입력: 1 2 1 1 0
            출력: 1 1 1 2 2 1(1의 1, 1의 2, 2개의 1)
            입력 : 1 1 1 1 0
            출력: 4 1(4개의 1)
            제약사항 : 10개까지만 입력 가능
** 내코드

#include<stdio.h>
#include<stdlib.h>

/*
	힌트1
	동적할당 vs 정적할당
	=> 정적할당을 코드를 짤 수 있으나 
	   입력이 배열이 아니다란 판단을 내릴 수 있음

	힌트2
	이전 입력과 이후 입력(현재 입력)이 같은지 / 다른지?
	=> 분기점이 달라지기 때문

	1- 정적할당입력 -> 배열x출력
	2- 배열입력이 아니구나~ -> for(;;i+=2)

*/

int main() {

	// 1. 10개의 배열을 만듦
	int number[10] = { 0, };

	// 2. 만든 배열에 사용자에게 값을 받음
	// 만약 0을 받으면 for 문을 벗어난다
	for (int i = 0; i < 10; i++) {
		scanf("%d", &number[i]);
		if (number[i] == 0) { break; }
	}

	// 3. 조건의 맞춰서 출력하기
	int cnt = 0;
	int what = 0;

	for (int i = 0; i < 10; i++) {
		if (number[i] == 0) { break; }

		if(cnt < 1) {
			cnt = 1;
			what = number[i];
		} // end if(cnt < 1)
			
		if (number[i] == number[i + 1]) {
			what = number[i];
			cnt += 1;
			//printf("뭐가 출력되니 %d %d\n", cnt, what);
		} else {
			printf("%d %d ", cnt, what);
			cnt = 0;
			what = 0;
		} // end if()
	} // end for(number[i] == number[i + 1])

	printf("\n");

	return 0;
}

 

** 강사님 코드

#include<stdio.h>

int main() {
	int arr[18];
	int i = 0;
	while (1) {
		scanf("%d", &arr[i]);
		if (arr[i] == 0) {
			break;
		}
		i++;
	}
	printf("현재까지 데이터의 개수 %d개\n", i);
	int cnt = 1;
	for (int a = 1; a <= i; a++) {
		if (arr[a - 1] == arr[a]) {
			cnt++;
		}
		else {
			printf("%d %d ", cnt, arr[a - 1]);
		}
	}

	printf("\n\n");

	int x;		// 현재입력에 대한 변수
	int xx;	// 이전입력에 대한 변수
				// 이전이후입력 체크하여 배열에 결과를 저장->출력
	int data[18];
	int index = 0;
	int count = 1;
	scanf("%d", &xx);
	while (xx != 0) {
		scanf("%d", &x);
		if (xx == x) {
			count++;
		}
		else {
			data[index++] = count;
			data[index++] = xx;
			count = 1;
		}
		xx = x;
	}
	for (int i = 0; i < index; i++) {
		printf("%d ", data[i]);
	}

	return 0;
}

 

 

2. 기호상수, 포인터의 연산

#include<stdio.h>
#include<stdlib.h>

// 기호상수
#define MAX 5

int main() {
	int arr[5] = { 1, 2, 3,4, 5 };
	int* p = arr;	// &arr[0] == arr
	for (int i = 0; i < 5; i++) {
		printf("%u ", &arr[i]);
	}
	printf("\n");
	printf("%u ", p + 1);
	// 포인터의 연산은 [값]을 추가하는 것이 아니라
	// [주소]를 이동시키는 연산이다!!

	p = &arr[2];
	// 인덱스를 초과해서 출력하면 쓰레기 값이 출력이 된다.
	//for (int i = 0; i < MAX; i++) {
	for (int i = 0; i < MAX - 2; i++) {
		printf("%d ", *(p + i));	// 연산자 우선순위 주의!
	}

	return 0;
}

 

 

3. [문제1] 정수 1개 입력, 배열 동적 할당,
              f() - 인자로 배열을 사용할 예정(포인터 이용하기)
              출력시 - 3 2 1 - *(p + 1) 사용

** 내코드

#include<stdio.h>
#include<stdlib.h>

void f(int* arr, int n) {
	int* p = arr;

	for (int i = 0; i < n; i++) {
		printf("%d ", *(p + i));
	}
	printf("\n");
}

int main() {

	int n;
	scanf("%d", &n);

	int* arr = (int*)malloc(n * sizeof(int));
	for (int i = 0; i < n; i++) {
		scanf("%d", &arr[i]);
	}

	f(arr, n);

	return 0;
}

 

** 강사님 코드

#include<stdio.h>
#include<stdlib.h>

void f1(int *arr, int len) {
	for (int i = len - 1; i >= 0; i--) {
		// [ p _ _ _ _ ]
		printf("%d ", *(arr + i));
	}
	printf("\n");
}
void f2(int *arr, int len) {
	for (int i = 0; i <= len - 1; i++) {
		// [ _ _ _ _ p ]
		printf("%d ", *(arr - i));
	}
	printf("\n");
}

int main() {
	int n;
	scanf("%d", &n);
	int *arr = (int *)malloc(n * sizeof(int));
	for (int i = 0; i < n; i++) {
		scanf("%d", &arr[i]);
	}
	f1(&arr[0], n);	// arr==&arr[0]
							// [ _ _ _ _ _ ]
	f2(&arr[n - 1], n);

	return 0;
}

 

 

4. 구조체

// 구조체
// : 타입이 다른 것들을 하나로 묶어서 사용하고 싶을때 사용 가능
// 배열
#include<stdio.h>
#include<string.h>
struct student {
	char name[10];		// 멤버변수(=속성, 필드)
	int score;
	double avg;
}; // 붕어빵틀
typedef struct point { // 구조체 점: ( x , y )
	int x;
	int y;
}P;	// 구조체 점을 P라는 자료형으로 만듦!
	// typedef 장점 : 가독성 증가, 이식성 증가

int main() {
	struct student s1 = { "홍길동", 70, 72.4 };
	struct student s2;
	s2.score = 71;
	s2.avg = 74.5;
	//s2.name = "안녕";	// 비주얼 스튜디오가 문자열을 대단히 불안정하게 생각하기 때문에
	// 이런식으로 쓰는 것을 막아놨다.
	// 그렇다고 못쓰는 건 아니고 strcpy를 통해 사용 가능하다.
	strcpy(s2.name, "임꺽정");
	//scanf("%lf", &s2.avg);

	//struct point p1;
	//struct point p2;
	// p1의 x, y좌표와 p2의 x, y 좌표를 입력
	// -> 중점을 p3에 저장 => 출력
	//struct point p3;

	// struct point -> P라고 불리는 자료형
	P p1;
	P p2;
	P p3;

	printf("p1의 좌표입력(x, y): ");
	scanf("%d%d", &p1.x, &p1.y);
	printf("p2의 좌표입력(x, y): ");
	scanf("%d%d", &p2.x, &p2.y);
	p3.x = (p1.x - p2.x) / 2;
	p3.y = (p1.y - p2.y) / 2;

	printf("중점 좌표는 (%d, %d)입니다.\n", p3.x, p3.y);

	P p[3];	// 구조체 배열
	for (int i = 0; i < 2; i++) {
		printf("p[%d]의 좌표입력(x,y): ", i);
		scanf("%d%d", &p[i].x, &p[i].y);
	}
	p[2].x = (p[0].x - p[1].x) / 2;
	p[2].y = (p[0].y - p[1].y) / 2;
	printf("중점 좌표는 (%d, %d)입니다.\n", p[2].x, p[2].y);

	return 0;
}

 

 

5. [문제2] 3명의 학생 => 배열, 3명의 학생
             학생 구조체는 이름, 성적(int), 학생번호(int)
             3명의 학생 정보를 입력
             가장 성적이 높은 학생의 이름 출력하기

** 내코드

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct STUDENT {
	char name[10];
	int score;
	int stuNo;
}STU;

int main() {

	// 동적할당 적용
	int N;
	scanf("%d", &N);
	STU* student = (STU*)malloc(N * sizeof(STU));
	//STU student[3];

	for (int i = 0; i < 3; i++) {
		printf("%d번째 학생 이름, 점수, 번호 입력 : ", i + 1);
		scanf("%s%d%d", &student[i].name, &student[i].score, &student[i].stuNo);
	}

	int max = student[0].score;
	int index = 0;
	for (int i = 1; i < 3; i++) {
		if (max < student[i].score) {
			max = student[i].score;
			index = i;
		}
	}

	printf("%s %d\n", student[index].name, max);

	return 0;
}

 

** 강사님 코드

#include<stdio.h>
#include<stdlib.h>

typedef struct Student {
	char name[10];
	int score;
	int num;
}S;

int main() {
	// 동적할당적용!!!
	int N;
	scanf("%d", &N);
	S *s = (S *)malloc(N * sizeof(S));
	for (int i = 0; i < N; i++) {
		s[i].num = i + 1;
		printf("%d번 학생의 이름입력: ", s[i].num);
		scanf("%s", s[i].name);
		printf("성적입력: ");
		scanf("%d", &s[i].score);
	}

	int max = s[0].score;
	int maxIndex = 0;
	for (int i = 0; i < N; i++) {
		printf("%d번 학생의 이름: %s / ", s[i].num, s[i].name);
		printf("성적: %d\n", s[i].score);
		if (max < s[i].score) {
			// [최대값 찾기] 알고리즘
			max = s[i].score;
			maxIndex = i;
		}
	}
	printf("성적이 높은 학생은 %s 입니다.\n", s[maxIndex].name);

	return 0;
}

 

 

6. 정수 1개 입력받아 학생 구조체 배열,

   int s1, int s2가 멤버로 존재,
   학생의 평균 점수를 소수점 뒤 둘째자리까지 출력,
   출력은 show라는 함수를 이용하여 출력

#include <stdio.h>
#include <stdlib.h>

// 2. 학생 구조체를 만든다
typedef struct STUDENT {
	int s1;
	int s2;
}STU;

// 5. 출력 show() 함수 만들기
// 학생의 평균 점수를 소수점 뒤 둘째자리까지 출력
void show(STU* student, int N) {
	int* sum = (int*)malloc(N * sizeof(int));

	for (int i = 0; i < N; i++) {
		printf("%.2lf\n", (double)(student[i].s1 + student[i].s2) / N);
	}
}

int main() {
	// 1. 정수 1개를 입력받는다.
	int N;
	scanf("%d", &N);

	// 3. 입력된 정수를 이용, 동적 배열 만든다
	STU* student = (STU*)malloc(N * sizeof(STU));

	// 4. 학생들 점수 받기
	for (int i = 0; i < N; i++) {
		printf("%d번째 학생 점수 입력 : ", i + 1);
		scanf("%d%d", &student[i].s1, &student[i].s2);
	}

	// 6. 함수 실행
	show(student, N);

	return 0;
}

 

 

7. 정수 1개 탑의 개수,
   탑 : int 금액, int 높이,
   금액 X 높이 = 탑을 만들때 사용되는 총 금액,
   최종 비용 출력

** 내코드

#include<stdio.h>
#include<stdlib.h>

typedef struct TOP {
	int money;
	int height;
}TOP;

int main() {
	int N;
	scanf("%d", &N);

	TOP* top = (TOP*)malloc(N * sizeof(TOP));

	int totalMoney = 0;

	for (int i = 0; i < N; i++) {
		printf("금액과 높이를 입력 : ");
		scanf("%d%d", &top[i].money, &top[i].height);
		totalMoney += top[i].money * top[i].height;
	}
	printf("%d\n", totalMoney);

	return 0;
}

 

** 강사님 코드

#include <stdio.h>
#include <stdlib.h>

typedef struct tower {
	int m;
	int h;
}T;

// 1.입출력 맞추기
// 2.문법오류 수정하기
int f(T *t, int i) {
	return t[i].m*t[i].h;
}

int main() {
	int n;
	scanf("%d", &n);
	T *t = (T *)malloc(n * sizeof(T));
	for (int i = 0; i < n; i++) {
		printf("%d번 탑의 금액,높이 입력: ", i + 1);
		scanf("%d%d", &t[i].m, &t[i].h);
	}
	int sum = 0;
	for (int i = 0; i < n; i++) {
		sum += f(t, i);
	}
	printf("최종금액은 %d입니다.\n", sum);

	return 0;
}

'웹_프론트_백엔드 > C언어' 카테고리의 다른 글

[자료구조] 2020.07.20  (0) 2020.07.21
[자료구조] 2020.07.17  (0) 2020.07.21
[자료구조] 2020.07.13  (0) 2020.07.14
2020.03.24  (0) 2020.03.25
2020.03.23  (0) 2020.03.23