요즘 리눅스 환경에서 vim쓰면서 C코딩 하다보니 다소 불편한점이 많다 특히 디버깅 gdb쪽이 너무 힘들게 느껴진다... 너무 복잡하다 보면 다시 비쥬얼 스튜디오 프로그램으로 돌아와서 디버깅을 한다 리눅스 쉘 환경에서 적응 할수 있도록 노력하면서 쓰는중이다 화이팅..
有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;
}
실행결과
在一个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;
}
실행결과
编写一个函数,形参为一个字符串,然后采用如下的规则对该字符串当中的每一个字符进行压缩:
(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;
}
실행결과
请使用指针的方法来实现如下的函数:
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;
}
실행장면
编写一个程序,输入一个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);
*/
}
用一个指针数组存储若干种计算机语言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;
}
실행결과
一位小朋友正在学习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;
}
실행결과