Basics/자기주도 C언어 프로그래밍

[Chapter] 11 함수 I

whereareyoung 2023. 7. 14. 15:15
//1
사용자 정의 함수를 만들어 선을 그리는 프로그램을 작성하시오.
출력 예 
===============================
line 함수를 호출하였습니다.
line 함수를 다시 호출합니다.
===============================
 
(소스1)
#include <stdio.h>   
 
void line()
{
puts("===============================");
}
 
int main()
{
line();
 
puts("line 함수를 호출하였습니다.");
puts("line 함수를 다시 호출합니다.");
 
line();
 
return 0;
}
 
 
(소스2)
#include <stdio.h>  
void line();
 
int main()
{
line();
 
puts("line 함수를 호출하였습니다.");
puts("line 함수를 다시 호출합니다.");
 
line();
 
return 0;
}
 
void line()
{
puts("===============================");
}
 
 
 
자가진단 1 문자열 "~!@#$%^&*()_+|"를 출력하는 함수를 작성하고 정수를 입력받아 입력받은 수만큼 함수를 호출하는 프로그램을 작성하시오.
입력 예 3
출력 예 
~!@#$%^&*()_+|
~!@#$%^&*()_+|
~!@#$%^&*()_+|
 
#include <stdio.h>
   
void mark();
 
int main()
{
int i;
int a;
 
scanf("%d", &a);
 
for (i = 1; i <= a; i++)
{
mark();
}
 
return 0;
}
 
void mark()
{
puts("~!@#$%^&*()_+| ");
}
 
//2 정수를 입력 받아 10큰 수와 10작은 수를 출력하는 프로그램을 작성하시오.
입력 예 50
출력 예 
10큰수 : 60
10작은수 : 40
 
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>   
 
void plusten(int su)
{
printf("10큰수 : %d \n", su + 10);
}
 
void minusten(int su)
{
printf("10큰수 : %d \n", su - 10);
}
 
int main()
{
int num;
 
scanf("%d", &num);
 
plusten(num);
minusten(num);
 
return 0;
}
 
자가진단 2 반지름의 길이를 전달받아 넓이를 출력하는 함수를 작성하고 반지름의 길이를 입력받아 함수를 호출하여 넓이를 출력하는 프로그램을 작성하시오. (원주율은 3.14로 하고 반올림하여 소수 둘쨰자리까지 출력한다. 원의 넓이 = 반지름 * 반지름 * 원주율이다.)
 
입력 예 10
출력 예 314.00
 
#include <stdio.h>   
void width(int r)
{
printf("%.2f", r*r*3.14);
}
 
int main()
{
int num;
 
scanf("%d", &num);
 
width(num);
return 0;
}
 
//3 정수를 전달받아 출력 예와 같이 '*'로 이루어진 직각삼각형을 출력하는 함수를 작성하고 입력받은 정수를 전달하여 출력하는 프로그램을 작성하시오.
입력 예 5
출력 예 
*
**
***
****
*****
 
#include <stdio.h>   
void star(int n)
{
int i, j;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= i; j++)
{
printf("*");
}
printf("\n");
}
}
 
int main()
{
int n;
 
scanf("%d", &n);
star(n);
 
return 0;
}
 
자가진단 3 정수를 전달받아 다음과 같이 숫자 정사각형을 출력하는 함수를 작성하고 함수를 호출하여 입력받은 정수를 함수로 전달하여 출력하는 프로그램을 작성하시오.
입력 예 4
출력 예 
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
 
#include <stdio.h>   
void num(int n)
{
int i, j;
int num = 1;
 
for (i = 1; i <= n; i++)
{
for (j = 1; j <= 4 ; j++)
{
printf("%d ", num++);
}
printf("\n");
}
}
 
int main()
{
int a;
 
scanf("%d", &a);
num(a);
 
return 0;
}
 
//4 합과 차를 각각 리턴하는 함수를 작성한 후 두 정수를 입력받아 함수를 호출하여 두 수의 합과 차를 출력하는 프로그램을 작성하시오.
입력 예 30 50
출력 예 
두 수의 합 = 80
두 수의 차 = 20
 
#include <stdio.h>
  
int add(int x, int y)
{
return x + y;
}
 
int sub(int x, int y)
{
int cha = x - y;
if (cha < 0) cha *= -1;
return cha;
}
 
int main()
{
int a, b, sum;
 
scanf("%d %d", &a, &b);
 
sum = add(a, b);
 
printf("두 수의 합 = %d \n", sum);
printf("두 수의 차 = %d \n", sub(a,b));
 
return 0;
}
 
자가진단 4 세 개의 정수를 전달받아 최대값을 구하여 리턴하는 함수를 작성하고 세 정수를 입력받아 최대값을 출력하는 프로그램을 작성하시오.
입력 예 -10 115 33
출력 예 115
 
 
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>  
int compare(int x, int y, int z)
{
int max = x;
 
if (max < y) max = y;
if (max < z) max = z;
 
return max;
}
 
int main()
{
int a, b, c, answer;
 
scanf("%d %d %d", &a, &b, &c);
printf("%d \n", compare(a, b, c));
return 0;
}
 
//5 평균을 구하는 함수를 작성한 후 세과목의 점수를 입력받아 평균을 구하여 소수 둘째자리까지 반올림하여 출력하는 프로그램을 작성하시오.
입력 예 세과목의 점수를 입력하세요. 80 65 95
출력 예 평균 : 80.00
 
(소스1)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>   
 
double pyung(int a, int b, int c)
{
int sum = a + b + c;
return sum / 3.0;
}
 
int main()
{
int kor, eng, mat;
double avg;
 
printf("세과목의 점수를 입력하세요. ");
scanf("%d %d %d", &kor, &eng, &mat);
 
avg = pyung(kor, eng, mat);
printf("평균 : %.2f \n", avg);
 
return 0;
}
 
 
(소스2)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>   
 
double pyung(int a, int b, int c)
{
return (a + b + c) / 3.0;
}
 
int main()
{
int kor, eng, mat;
double avg;
 
printf("세과목의 점수를 입력하세요. ");
scanf("%d %d %d", &kor, &eng, &mat);
 
printf("평균 : %.2f \n", pyung(kor, eng, mat));
 
return 0;
}
 
자가진단 5 10 이하의 두 정수 m과 n을 입력 받아서 m을 n만큼 거듭제곱하여 나온 값 (mn)을 리턴하는 함수를 작성하여 다음과 같이 출력하는 프로그램을 작성하시오.
입력 예 2 10
출력 예 1024
 
 
< Pow 함수 이용했을 경우 >
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>  
#include<math.h>
#include<cmath>
 
int mul(int a, int b)
{
return pow(a, b);
}
 
int main()
{
int m, n;
 
scanf("%d %d", &m, &n);
printf("%d", mul(m, n));
return 0;
}
 
< 반복문 이용했을 경우 >
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>  
int mul(int a, int b)
{
int i;
int num = 1;
 
for (i = 0; i < b; i++)
{
num *= -a;
}
return num;
}
 
int main()
{
int m, n;
 
scanf("%d %d", &m, &n);
printf("%d", mul(m, n));
 
return 0;
}
 
 
 
//6 정수의 연산식을 입력받아 연산을 위한 함수를 호출하여 사칙연산의 결과를 출력하는 프로그램을 작성하시오. ('/'의 경우는 정수 부분만 출력하고 사칙연산 이외의 연산 결과는 0으로 한다.)
입력 예 10 + 20
출력 예 10 + 20 = 30
 
 
 
#include <stdio.h>  
int gesan(int x, int y, char op)
{
switch(op)
{
case'+':
return x + y;
case'-':
return x - y;
case'*':
return x * y;
case'/':
return x / y;
}
return 0;
}
 
int main()
{
int a, b;
char c;
 
scanf("%d %c %d", &a, &c, &b);
printf("%d %c %d = %d \n", a, c, b, gesan(a, b, c));
 
return 0;
}
 
자가진단 6 위 소스에서 함수내의 switch 문을 if ~ else if ~ else 문으로 바꾸어 실행해보자.
 
#include <stdio.h>  
int gesan(int x, int y, char op)
{
if (op == '+') return x + y;
else if (op == '-') return x - y;
else if (op == '*') return x * y;
else return x / y;
}
 
int main()
{
int a, b;
char c;
 
scanf("%d %c %d", &a, &c, &b);
printf("%d %c %d = %d \n", a, c, b, gesan(a, b, c));
 
return 0;
}
 
//7 두 수를 입력받아 아래 예와 같이 순서를 바꾸어 출력하는 프로그램을 작성하시오.
입력 예 두 수를 입력하세요. 35 15
출력 예 
첫 번째 함수 실행중 x = 15, y = 35
첫 번째 함수 실행후 a = 35, b = 15
두 번째 함수 실행중 x = 15, y = 35
두 번째 함수 실행후 a = 15, b = 35
 
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>  
 
void swapvalue(int x, int y)
{
int tmp;
 
tmp = x;
x = y;
y = tmp;
 
printf("첫 번째 함수 실행중 x = %d, y = %d \n", x, y);
}
 
void swapreference(int &x, int &y)
{
int tmp;
 
tmp = x;
x = y;
y = tmp;
 
printf("두 번째 함수 실행중 x = %d, y = %d \n", x, y);
}
 
int main()
{
int a, b;
 
printf("두 수를 입력하세요. ");
scanf("%d %d", &a, &b);
 
swapvalue(a, b);
printf("첫 번째 함수 실행후 a = %d, b = %d \n", a, b);
 
swapreference(a, b);
printf("두 번째 함수 실행후 a = %d, b = %d \n", a, b);
 
return 0;
}
 
 
 
*** 주소 관련 추가 설명
다음의 경우 a, b 둘다 500을 찍습니다.
참조하는 주소가 같은 곳이기 때문입니다.
 
(1)
int a = 10;
int& x = a;
 
x = 500;
 
printf("%d /n", a);
 
(2)
int a = 10;
int& x = a;
 
a = 500;
 
printf("%d /n", a);
 
 
 
자가진단 7 두 개의 정수를 입력받아 큰 수는 2로 나눈 몫을 저장하고 작은 수는 2를 곱하여 저장한 후 출력하는 프로그램을 작성하시오. (참조에 의한 전달을 이용한 함수를 작성하여 값을 수정하고 출력은 메인함수에서 한다.)
입력 예 100 500
출력 예 200 250
 
(정리한 풀이)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>  
int opA(int x, int y);
int opB(int x, int y);
int main()
{
int a, b;
scanf("%d %d", &a, &b);
 
if (a == b) return 0;
 
printf("%d %d \n", opA(a, b), opB(a, b));
return 0;
}
 
int opA(int x, int y)
{
if (x > y)
{
x /= 2;
}
else
{
x *= 2;
}
return x;
}
 
int opB(int x, int y)
{
if (x < y)
{
y /= 2;
}
else
{
y *= 2;
}
return y;
}
 
(기본 풀이)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>  
 
int opA(int x, int y)
{
if (x > y)
{
x = x / 2;
}
else
{
x = x * 2;
}
return x;
}
 
int opB(int x, int y)
{
if (x < y)
{
y = y / 2;
}
else
{
y = y * 2;
}
return y;
}
 
int main()
{
int a, b;
 
scanf("%d %d", &a, &b);
printf("%d %d \n", opA(a, b), opB(a, b));
 
return 0;
}
 
 
 
//8 두 정수를 입력받아 합과 곱을 출력하는 프로그램을 구조화하여 작성하시오.
입력 예 두 수를 입력하세요. 35 26
출력 예 
합 : 61
곱 : 910
 
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
  
int a, b;
int hap, gop;
 
void input()
{
printf("두 수를 입력하세요. ");
scanf("%d %d", &a, &b);
}
 
void gesan()
{
hap = a + b;
gop = a * b;
}
 
void output()
{
printf("합 : %d \n", hap);
printf("곱 : %d \n", gop);
}
 
int main()
{
input();
gesan();
output();
return 0;
}
 
 
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
 
void input(int &x, int &y)
{
printf("두 수를 입력하세요. ");
scanf("%d %d", &x, &y);
}
 
int plus(int x, int y)
{
return x + y;
}
 
int multi(int &x, int &y)
{
return x * y;
}
 
void output(int x, int y)
{
printf("합 : %d \n", x);
printf("곱 : %d \n", y);
}
 
int main()
{
int a, b;
int hap, gop;
 
input(a, b);
hap = plus(a, b);
gop = multi(a, b);
output(hap, gop);
 
return 0;
}
 
 
글로벌 변수 안쓸수록 코딩을 잘하는 것이다.
 
자가진단 8 10 이하의 두 개의 정수를 입력받아서 작은 수부터 큰 수까지의 구구단을 차례대로 출력하는 프로그램을 구조화하여 작성하시오.
입력 예 3 5
출력 예 
== 3dan ==
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
3 * 4 = 12
3 * 5 = 15
3 * 6 = 18
 
.
.
.
 
5 * 9 = 45
 
 
(1번 풀이)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>  
 
int a, b;
int hap, gop;
 
void input()
{
scanf("%d %d", &a, &b);
}
 
void output()
{
int i, j;
for (i = a; i <= b; i++)
{
printf("== %ddan ==\n", i);
 
for (j = 1; j <= 9; j++)
{
printf("%d * %d = %d \n", i, j , i*j);
}
}
}
 
int main()
{
input();
output();
return 0;
}
 
(2번 풀이) - 참조형 연산자 활용
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>  
 
void input(int& a, int& b);
void output(int a, int b);
 
int main()
{
int a, b;
 
input(a, b);
output(a, b);
 
return 0;
}
 
void input(int& a, int& b)
{
scanf("%d %d", &a, &b);
}
 
void output(int a, int b)
{
int i, j;
 
for (i = a; i <= b; i++)
{
printf("== %ddan ==\n", i);
for (j = 1; j <= 9; j++)
{
printf("%d * %d = %d \n", i, j, i * j);
}
}
}
 
 
 
 
 

'Basics > 자기주도 C언어 프로그래밍' 카테고리의 다른 글

[Chapter] 13 함수 III  (0) 2023.07.14
[Chapter] 12 함수 II  (0) 2023.07.14
[Chapter] 10 배열 II  (0) 2023.07.14
[Chapter] 09 배열 I  (0) 2023.07.14
[Chapter] 08 반복제어문 III  (0) 2023.07.14