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;
}
'웹_프론트_백엔드 > 단과' 카테고리의 다른 글
[단과_자료구조] 2020.07.20 (0) | 2020.07.21 |
---|---|
[단과_자료구조] 2020.07.17 (0) | 2020.07.21 |
[단과_자료구조] 2020.07.13 (0) | 2020.07.14 |
[단과_C] 2020.03.24 (0) | 2020.03.25 |
[단과_C] 2020.03.23 (0) | 2020.03.23 |