C언어 포인터 문제1

성민개발로그·2021년 7월 10일
0

C언어

목록 보기
5/9
post-thumbnail

요즘 리눅스 환경에서 vim쓰면서 C코딩 하다보니 다소 불편한점이 많다 특히 디버깅 gdb쪽이 너무 힘들게 느껴진다... 너무 복잡하다 보면 다시 비쥬얼 스튜디오 프로그램으로 돌아와서 디버깅을 한다 리눅스 쉘 환경에서 적응 할수 있도록 노력하면서 쓰는중이다 화이팅..

문제1

数组元素循环移位

有n个整数,使前面的各整数顺序向后移动m个位置,后面的m个整数则变成最前面的m个数。写一函数实现以上功能。
在主函数中输入n及n个整数,输入m (m<n),调用编写的上述函数,然后输出调整后的n个整数。
要求:用指向数组元素的指针的方法来实现。

#include<stdio.h>
#include<stdlib.h>
int swap(int n,int m,int *arr,int *arr2){
        for(int i=0;i<m;i++){
                arr2[i]=arr[n-m+i];
        }
        for (int i=m;i<n;i++){
                arr2[i]=arr[i-m];
        }
        return 0;
}

int main(void){
        int n,m;
        int *arr;
        int *arr2;
        printf("input n m:");
        scanf("%d %d",&n,&m);
        arr=malloc(sizeof(int)*n);
        arr2=malloc(sizeof(int)*n);
        printf("input number:");
        for(int i=0;i<n;i++) scanf("%d",&arr[i]);
        swap(n,m,arr,arr2);
        for(int i=0;i<n;i++) printf("%d ",arr2[i]);
        free(arr);
        free(arr2);
        return 0;

}

실행결과

문제2

矩阵与排序

在一个m×n的二维整数型矩阵进行排序,排序操作可能有以下几种形式:
(1)sort1():在矩阵的每一行内,对行内元素进行局部排序,即每行之间不变,只在每行内对于行内元素进行排序。排序规则为,在每一行内矩阵元素按照从左到右的顺序依次递增。
(2)sort2():对于矩阵的每一行,在行内对于元素进行局部排序,行间按照每一行中的最大元素进行排序。 排序规则为,每行内元素从左到右依次递增,各行间最大元素值按照每行递增排序。
(3)sort3():对于矩阵中所有的元素进行排序。排序规则为,所有矩阵元素按照从左到右,从上到下的顺序依次递增。
在主函数中输入该矩阵,分三次调用编写的上述排序函数,每次调用后在主函数中输出排序后的矩阵。
要求:用指向一维数组的指针、指针数组、指向数组元素的指针等方法来实现。

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

void q_sort(int* arr, int start, int end) {//큌 정렬 알고리즘 
    if (start >= end) return 0;
    int pivot = arr[start];
    int left = start + 1;
    int right = end;
    int temp;
    while (right >= left) {
        while ((pivot >= arr[left]) && left <= end) left++;
        while ((pivot <= arr[right]) && right > start) right--;
        if (left <= right) {
            temp = arr[right];
            arr[right] = arr[left];
            arr[left] = temp;
        }
    }
    arr[start] = arr[right];
    arr[right] = pivot;
    q_sort(arr, start, right - 1);
    q_sort(arr, right + 1, end);




}
void sort1(int m, int n, int** arr) {// 행마다 정렬후 출력
    for (int i = 0; i < m; i++) {
        q_sort(arr[i], 0, n - 1);
        for (int j = 0; j < n; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }


}

void sort2(int m,int n,int **arr) {// 각 행의 가장 큰수의 기준으로 내림차수 정렬
    int* arr2 = malloc(sizeof(int) * m);
    int* check= malloc(sizeof(int) * m);
 
    for (int i = 0; i < m; i++) {
        check[i] = 0;
        arr2[i] = arr[i][n - 1];
    }
    q_sort(arr2, 0, m- 1);
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < m; j++) {
            if ((arr2[i] == arr[j][n - 1])&&check[j]==0) {
                check[j] = 1;
                for (int k = 0; k < n; k++) printf("%d ", arr[j][k]);
                printf("\n");
            }
        }
    }
    free(arr2);
    free(check);

}
void sort3(int m, int n, int** arr) {// 모든 원소 기준으로 왼쪽부터 오른쪽 위에서 아래로 크기순으로 정렬
    int* arr2 = malloc(sizeof(int) * m * n);
    int k = 0;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            arr2[k] = arr[i][j];
            k++;
        }
    }
    k = 0;
    q_sort(arr2, 0, m * n - 1);
    k = 0;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d ", arr2[k]);
            k++;
        }
        printf("\n");
    }
    free(arr2);

}

int main(void) {
    int m, n;
    int** arr;
    printf("input m,n:");
    scanf_s("%d %d", &m, &n);
    arr = malloc(sizeof(int*) * m);
    for (int i = 0; i < m; i++) arr[i] = malloc(sizeof(int) * n);
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) scanf_s("%d", &arr[i][j]);
    }
    printf("sort1:\n");
    sort1(m, n, arr);
    printf("sort2:\n");
    sort2(m, n, arr);
    printf("sort3:\n");
    sort3(m, n, arr);
    for (int i = 0; i < m; i++) free(arr[i]);
    free(arr);
    return 0;

}

실행결과

문제3

字符串压缩

编写一个函数,形参为一个字符串,然后采用如下的规则对该字符串当中的每一个字符进行压缩:
(1) 如果该字符是空格,则保留该字符。
(2) 如果该字符是第1次出现或第3次出现或第6次出现,则保留该字符
(3) 否则删除该字符。
例如,若用户输入occurrence,经过压缩后,字符c的第2次出现被删除,第1和第3次出现仍保留;字符r和e的第2次出现均被删除,因此最后的结果为: ocurenc 。
并请编写一个主函数来输入字符串,并测试自己编写的字符串压缩函数。
要求:用字符指针、返回指针的函数的方法来完成。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void zip(char *str,int l) {

	char* str2 = malloc(sizeof(char) * l-1);
	for (int i = 0; i < l-1; i++) str2[i] = 0; // 문자열 초기화
	int word[93] = { 0 };// ascii코드 출력가능한 모든 문자경우의수93개.
	int k = 0;
	for (int i=0; i < l; i++) {
		int p = (int)str[i] - 33;
		if (str[i] == ' ') {
			str2[k] = ' ';
			k++;
		}
		else if (word[p] == 0 || word[p] == 2 || word[p] == 5) {
			str2[k] = str[i];
			word[p]++;
			k++;
		}
		else {
			word[p]++;
		}
	}
	printf("%s", str2);
	free(str2);
}
int main(void) {
	char* str = malloc(sizeof(char) * 100);
	printf("input str:");
	fgets(str, 100, stdin);
	printf("zip str:", str);
	int l = strlen(str);
	zip(str,l);
	free(str);
	return 0;
}

실행결과

문제4

字符串库函数的实现

请使用指针的方法来实现如下的函数:
input(char s, char t, int n)//输入字符串s、字符串t、整数t传回主函数
char
strncpy( char s, char t, int n) //复制t的前n个字符至s
char strncat( char s, char t, int n) //连接t的前n个字符至s的末尾
int strncmp( char
s, char * t, int n) //比较s和t的前n个字符
并请编写一个主函数来调用自己的输入函数,并测试自己编写的字符串操作函数。
要求:用字符指针、返回指针的函数的方法来完成。

#include<stdio.h>
#include<stdlib.h>
void input(char* s, char* t, int* n) {
	printf("input s:");
	gets(s);
	fflush(stdin);
	printf("input t:");
	gets(t);
	fflush(stdin);
	printf("input n:");
	scanf_s("%d", n);
}

char* strncpy(char* s, char* t, int n) {
	for (int i = 0; i < n; i++) {
		s[i] = t[i];
	}
	return s;
}
char* strncat(char* s, char* t, int n) {
	int l=0;
	while (s[l] != NULL) l++;
	for (int i = 0; i < n; i++) s[l + i] = t[i];
	return s;
}
int strncmp(char *s,char *t,int n) {
	for (int i = 0; i < n; i++) {
		if (s[i] != t[i]) return -1;
	}
	return 1;
}
int main(void) {
	char s[20] = { 0 }, t[20] = { 0 };
	int *n=malloc(sizeof(int));
	char s2[20] = { 0 };
	input(s, t, n);
	strncpy(s2, t, *n);
	printf("%s \n", s2);
	strncat(s, t, *n);
	printf("%s \n", s);
	printf("%d", strncmp(s, t, *n));

	free(n);

	return 0;
}

실행장면

문제5

星期的查找

编写一个程序,输入一个1~7之间的整数,表示星期几,然后输出相应的文字。
例如:如用户输入3,则输出“星期三”。
要求:用指针数组的方法来实现。

#include<stdio.h>
#include<stdlib.h>
int main(void) {
	char** week = malloc(sizeof(char*) * 7);
	for (int i = 0; i < 7; i++) {
		week[i] = malloc(sizeof(char) * 15);
	}
	week[0] = "MONDAY";
	week[1] = "TUESDAY";
	week[2] = "WEDNEDAY";
	week[3] = "THURSDAY";
	week[4] = "FRIDAY";
	week[5] = "SATURDAY";
	week[6] = "SUNDAY";

	int n;
	scanf_s("%d", &n);
	printf("%s", week[n - 1]);


	/*for (int i = 0; i < 7; i++) {
		free(week[i]);
	}
	free(week);
*/
}

문제6

字符查找

用一个指针数组存储若干种计算机语言FORTRAN、PASCAL、Python、BASIC、C、C++、COBOL、SMALLTALK,根据用户输入的若干个开头字符,显示所有相匹配的计算机语言,例如:输入”BA”,显示”BASIC”; 输入”P”,显示”PASCAL”、”Python” ;输入”C”,显示”C”、 ”C++”和”COBOL”;如果输入的若干字符无法匹配,则返回”NULL”。
要求:用多级指针、指针数组的方法来实现。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void find(char **lang,char *word) {
	char f_word[8][10] = { 0,0 };
	int l = 0,k=0;
	while (word[l] != '\n') l++;
	for (int i = 0; i < 8; i++) {
		if (word[0] == lang[i][0]) {
			if (l == 1) {
				strcpy_s(f_word[k], 10, lang[i]);
				k++;
			}
			else {
				for (int j = 1; j < l; j++) {
					if (word[j] != lang[i][j]) break;
					if (j == l - 1) {
						strcpy_s(f_word[k], 10, lang[i]);
						k++;
					}
				}
			}
		}
	}
	if (k == 0) {
		printf("NULL");
	}
	else {
		for (int i = 0; i < k; i++) {
			printf("%s ", f_word[i]);
		}
	}
}
int main(void) {
	char** lang = malloc(sizeof(char*) * 8);
	for (int i = 0; i < 8; i++) lang[i] = malloc(sizeof(char) * 10);
	lang[0] = "FORTRAN", lang[1] = "PASCAL", lang[2] = "Python", lang[3] = "BASIC";
	lang[4] = "C", lang[5] = "C++", lang[6] = "COBOL"; lang[7] = "SMALLTALK";
	char word[10];
	fgets(word, 10, stdin);

	find(lang, word);

	return 0;
}

실행결과

문제7

算术练习程序

一位小朋友正在学习100以内的两个正整数的简单运算(加法、减法、乘法、除法四种运算),请编写一个程序来帮助她学习。
该主程序调用一个GetRandomExpression()函数,由它随机返回一个符合上述学习要求的简单的表达式;然后主程序提示用户输入表达式的计算结果,并判断答案是否正确。
要求:用指针型函数的方法来实现。

#include<stdio.h>
#include<stdlib.h>
int GetRandomExpression(int *a,int *b,char *c) {
	*a = rand() % 100;
	*b = rand() % 100;
	int e = rand() % 4;
	char f;
	int answer;
	switch (e)
	{
	case 0:
		f = '+';
		answer = (*a)+(*b);
		break;
	case 1:
		f = '-';
		answer = (*a) - (*b);
		break;
	case 2:
		f= '*';
		answer = (*a) * (*b);
		break;
	case 3:
		f = '%';
		answer = (*a) / (*b);
		break;
	default:
		break;
	}
	*c = f;

	return answer;

}
int main(void) {
	int a=0, b=0;
	char c= ' ';
	int num;
	int flag = 1;
	while (flag) {
		printf("input flag:");
		scanf_s("%d", &flag);
		if (flag == 0) break;
		int answer = GetRandomExpression(&a, &b, &c);
		printf("%d %c %d=", a, c, b);
		scanf_s("%d", &num);

		if (answer == num) printf("correct \n");
		else printf("wrong \n");
	}


	return 0;
}

실행결과

0개의 댓글