002_C/C++笔试题_简单算法程序
(一)冒泡排序法
1 #include <iostream> 2 using namespace std; 3 void bubblesort(int a[], int m); 4 int main(void) 5 { 6 int i; 7 int array[]={5,4,8,44,56,4,5,9}; 8 bubblesort(array,sizeof(array)/4);/*sizeof(array)/4,取长度,int类型是4字节*/ 9 /*打印已经排序的数组*/ 10 for(i = 0; i < sizeof(array)/4; i++) 11 printf("array[%d] = %d \n",i,array[i]); 12 return 0; 13 } 14 void bubblesort(int a[], int m) 15 { 16 int i,j,z; 17 int tmp; 18 for(i = 0; i < m; i++) //外层循环控制循环次数 19 { 20 for(j = 0; j < m-1-i; j++) //内层循环控制每次循环里比较的次数。 21 { 22 if(a[j] > a[j+1]) 23 { 24 tmp = a[j]; 25 a[j] = a[j+1]; 26 a[j+1] = tmp; 27 } 28 } 29 /*打印未排序*/ 30 for(z = 0; z < m-1-i;z++) 31 printf(" %d \t",a[z]); 32 printf("\n"); 33 } 34 }
运行结果
冒泡排序法的具体实现方法是这样的,从数组的第一个元素`arr[0]`开始,两两比较**(`arr[n],arr[n+1]`),如果前面的数大于后面的数(`arr[n] > arr[n+1]`),那么交换两个元素的位置,把大的数往后移动。这样依次经过一轮比较以后,最大的数将会被交换到最后的位置(arr[n-1])。
(二)选择排序法
1 #include <iostream> 2 using namespace std; 3 void selectionsort(int a[],int m); 4 int main(void) 5 { 6 int i; 7 int array[]={5,4,8,44,56,4,5,9}; 8 selectionsort(array,sizeof(array)/4);/*sizeof(array)/4,取长度,int类型是4字节*/ 9 /*打印已经排序的数组*/ 10 for(i = 0; i < sizeof(array)/4; i++) 11 printf("array[%d] = %d \n",i,array[i]); 12 return 0; 13 } 14 void selectionsort(int a[],int m) 15 { 16 int i,j; 17 int k; 18 int z; 19 int tmp; 20 21 for(i = 0; i < m-1; i++)//控制循环次数,n个数需要n-1次循环 22 { 23 k = i; 24 for(j = i+1; j < m ; j++) 25 { 26 if(a[j] < a[k]) 27 k = j; 28 } 29 //i不等于k是就证明a[i]不是最小的, 30 //i等于k时证明a[i]就是本轮比较过程中最小的值 31 if(i != k) 32 { 33 tmp = a[i]; 34 a[i] = a[k]; 35 a[k] = tmp; 36 } 37 /*打印未排序*/ 38 for(z = i; z < m;z++) 39 printf(" %d \t",a[z]); 40 printf("\n"); 41 } 42 }
运行结果
选择排序法就是通过每一次循环查找出最大(小)的元素,通过下标记录最大(小)的元素,找完一轮之后将最大(小)的元素
放到前面,然后不再考虑这个元素。
(三)编写my_strcpy函数
strcpy函数:是一种C语言的标准库函数,strcpy把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间,返回值的类型为char*。
1 #include <iostream> 2 using namespace std; 3 char* my_strcpy(char *strDest,char *strSrc); 4 int main(void) 5 { 6 char arr1[20] = { 1 }; 7 char arr2[20] = "abcdefghij"; 8 char *ret=my_strcpy(arr1,arr2); 9 printf("%s\n", ret);//打印复制之后的字符串 10 return 0; 11 } 12 char* my_strcpy(char *strDest,char *strSrc) 13 { 14 if(strSrc == NULL) 15 return NULL; 16 if(strDest == strSrc) 17 return strDest; 18 char *temp = strDest; 19 while((*strDest++ = *strSrc++) != '\0'); 20 return temp; 21 }
运行结果
(四)编写my_strcmp函数
strcmp函数:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止
1 #include <iostream> 2 3 using namespace std; 4 5 #define MAX 10 6 7 int mystrcmp(const char *str1,const char *str2); 8 int main(int argc,char *argv[]) 9 { 10 char value; 11 char str1[MAX],str2[MAX]; 12 13 printf("Please input str1 and str2 :\n"); 14 gets(str1); //gets 和 printf的区别,gets可接收含空格的字符串,而scanf遇TAB,空格,回车即结束 15 gets(str2); 16 17 value = mystrcmp(str1,str2); 18 printf("value :%d\n",value); 19 20 return 0; 21 } 22 23 int mystrcmp(const char *str1,const char *str2) 24 { 25 char i = 0; 26 for(; i < MAX, *(str1+i) != '\0',*(str2+i) != '\0'; i++) 27 { 28 if(*(str1+i) == *(str2+i)) 29 continue; //相等时继续比较下一位 30 return (*(str1+i) > *(str2+i))?1:(-1); 31 } 32 return 0; 33 } 34
运行结果
(五)编写my_strcat函数
strcat函数:是用来连接两个字符串的,原型是char *strcat(char *dest,char *src),作用是把src所指字符串添加到dest结尾处
1 #include <iostream> 2 using namespace std; 3 char* MyStrcat(char *dst, const char *src); 4 int main(void) 5 { 6 char str1[10] = "abc"; 7 char str2[] = "bcd"; 8 char* str3 = MyStrcat(str1, str2); 9 10 printf("str1=%s\n", str1); 11 printf("str2=%s\n", str2); 12 printf("str3=%s\n", str3); 13 return 0; 14 } 15 16 char* MyStrcat(char *dst, const char *src) 17 { 18 char *temp = dst; 19 while (*temp != '\0') 20 temp++; 21 while ((*temp++ = *src++) != '\0'); 22 return dst; 23 }
运行结果
(六)编写my_strlen函数
strlen函数:所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。
1 #include <iostream> 2 using namespace std; 3 int my_strlen(const char *str); 4 int main(void) 5 { 6 printf("长度为:%d\n",my_strlen("abcd")); 7 return 0; 8 } 9 10 int my_strlen(const char *str) 11 { 12 int count = 0; 13 while(*str++) 14 count++; 15 return count; 16 }
运行结果
(七)求高于平均分的学生学号及成绩(学号和成绩人工输入)
1 #include <iostream> 2 using namespace std; 3 #define NUM 2 4 struct student 5 { 6 int data; 7 int score; 8 }; 9 int main(int argc, char* argv[]) 10 { 11 student student1[NUM]; 12 int i,average = 0; 13 for(i = 0;i < NUM; i++) 14 { 15 scanf("%d %d",&student1[i].data,&student1[i].score); 16 average += student1[i].score/NUM; 17 } 18 printf("平均分是:%d",average); 19 for(i = 0;i < NUM; i++) 20 { 21 if(student1[i].score > average) 22 printf("大于平均的学生学号及成绩:%d,%d",student1[i].data,student1[i].score); 23 } 24 return 0; 25 }
运行结果
(八)递归实现回文判断(如:abcdedcba就是回文)
1 #include <iostream> 2 using namespace std; 3 int find(char *str, int n); /*字符判断回文*/ 4 int IsPalindrome(long m); /*数据判断回文*/ 5 int main(int argc, char* argv[]) 6 { 7 char *str = "abcdedcba"; 8 int m=1881; 9 printf("%s: %s\n", str, find(str,strlen(str)) ? "Yes" : "No"); 10 printf("数据m:%d,%s\n",m,IsPalindrome(m)? "Yes" : "No"); 11 return getchar(); 12 } 13 int find(char *str, int n) 14 { 15 if(n<=1) return 1; 16 else if(str[0]==str[n-1]) 17 return find(str+1, n-2); 18 else 19 return 0; 20 } 21 int IsPalindrome(long m) 22 { 23 long i, n; 24 i=m; 25 n=0; 26 while(i) 27 { 28 n=n*10+i%10; 29 i/=10; 30 } 31 return m==n; //返回1说明就是回文数了. 32 }
运行结果