// // main.m // 练习 // // Created by zhangxueming on 14/12/26. // Copyright (c) 2014年 zhangxueming. All rights reserved. // #import <Foundation/Foundation.h> // // main.c // 字符串练习 // // Created by zhangxueming on 14/12/24. // Copyright (c) 2014年 zhangxueming. All rights reserved. // #include <stdio.h> //*****************************/ // */ // 数组习题 */ //*****************************/ #include <stdio.h> //1.给定某个字符数组,统计数组中所有英文字符的个数,比如“123fdd”中有 3 个。 //int main(int argc, const char * argv[]) { // char str[100]={}; // int cnt=0; // int len=0;//统计字母的个数 // for (int i=0; i<100; i++) { // str[i] = getchar(); // if (str[i]=='\n') { // str[i]='\0';//让字符数组中的字符以'\0'结束 // break; // } // cnt++; // } // for (int i=0; i<cnt; i++) { // if ((str[i]>='A' && str[i]<='Z') || (str[i]>='a'&& str[i]<='z')) { // len++; // } // } // printf("len = %d\n" , len); // return 0; //} //3.给定某个拥有 5 个元素的字符数组,数组的成员都有阿拉伯字符构成,试着将该数 //组转换成一个整数,比如字符数组的内容是:{‘1’,’2’,’3’,’3’,’2’} 则将被转换成 12332。 //#include <stdlib.h> //#include <ctype.h> // //int main(int argc,const char *argv[]) //{ // //atoi("123")//把字符串转换成整型数据"123" ==> 123 // //printf("%d\n", atoi("-12345adc")); // //printf("%d \n",digittoint('9'));//把0~f --> 0 ~ 15 // char ch[5]={}; // int num=0; // for (int i=0; i<5; i++) { // ch[i]=getchar(); // ch[i]=ch[i]-48; // num=num*10+ch[i]; // } // printf("num = %d\n", num); // return 0; //} //5.给定一个完全由英文字符构成的数组,将数组中下标为偶数的字符都转换为大写(如 //果原来是大写则不变)。 //int main(int argc,const char *argv[]) //{ // char ch[100]={}; // int cnt =0; // for(int i=0; i<100; i++){ // ch[i]=getchar(); // if(ch[i]=='\n') // { // ch[i]='\0'; // break; // } // cnt++; // } // // for (int i=0; i<cnt; i++) { // if (!(i%2) && (ch[i]>='a' && ch[i]<='z')) { // ch[i]-=32; // } // printf("%c", ch[i]); // } // printf("\n"); // return 0; //} //6.给一个完全由英文字符构成的字符数组加密,加密原则如下,除了字符‘Z’和‘z’ //之外,每个字符变成 ASCII 码值比它大 1 的字符,也就是‘A’变成‘B’。‘Z’或 //者‘z’转化为‘A’或者‘a’。 //int main(int argc, const char *argv[]) //{ // char ch[100]={}; // int cnt=0; // for (int i=0; i<100; i++) { // ch[i]=getchar(); // if (ch[i]=='\n') { // ch[i]='\0'; // break; // } // cnt++; // } // // for (int i=0; i<cnt; i++) { // if ((ch[i]>='A' && ch[i]<'Z')||(ch[i]>='a'&&ch[i]<'z')) { // ch[i]+=1; // } // else if(ch[i]=='Z') // { // ch[i] ='A'; // } // else if(ch[i]=='z') // { // ch[i]='a'; // } // // printf("%c", ch[i]); // } // printf("\n"); // return 0; //} //7.计算某个由英文、数字以及标点符号构成的数组的总宽度,其中英文字符的宽度为 //1cm,数字宽度为 0.5cm、标点符号宽度为 0.8cm。 float lengthChar(char ch) { if ((ch>='A'&&ch<='Z') || (ch>='a'&&ch<='z')) { return 1.0; } else if(ch>='0'&&ch<='9') { return 0.5; } else { return 0.8; } } //int main(int argc,const char *argv[]) //{ // char ch[100]={}; // int cnt=0; // float len=0; // for ( int i=0; i<100; i++) { // ch[i]=getchar(); // if (ch[i]=='\n') { // ch[i]='\0'; // break; // } // cnt++; // } // for (int i=0; i<cnt; i++) { // len+=lengthChar(ch[i]); // } // printf("len = %.2f\n", len); // // return 0; //} //8.接上题,如果规定行的宽度为 10cm,将某个字符长度超过 50 的字符串截断,恰好 使 10cm 宽的行能容纳。输出这个被截断的子数组。 //1234asd!@#$rtyukl;fghjk //int main(int argc,const char *argv[]) //{ // char ch[100]={}; // char str[100]={}; // int cnt=0; // float len=0; // for ( int i=0; i<100; i++) { // ch[i]=getchar(); // if (ch[i]=='\n') { // ch[i]='\0'; // break; // } // cnt++; // } // // for (int i=0; i<cnt; i++) { // len+=lengthChar(ch[i]); // if (len>10) { // // break; // } // str[i]=ch[i]; // printf("%c", str[i]); // } // printf("\n"); // return 0; //} //9.给定某个整型数组,计算该数组所有偶数的和。 //10.给某个整型数组赋值,赋值规律如下,下标能被 3 整除的都赋值为 1,能被 5 整除 //的都赋值为 2,能被 7 整除的都赋值为 3,能被 3、5、7 任意两个或者 3 个都能整除 //的数赋值为 8,其余都赋值为 0. //int main(int argc,const char *argv[]) //{ // int a[100]; // for (int i=0; i<10; i++) { // if (i%3==0) { // a[i]=1; // if (i%5==0||i%7==0) { // a[i]=8; // } // } // else if(i%5==0) // { // a[i]=2; // if (i%7==0) { // a[i]=8; // } // } // else if(i%7==0) // { // a[i]=3; // } // else // { // a[i]=0; // } // printf("%d " ,a[i]); // } // printf("\n"); // return 0; //} //11.通过终端输入 10 个整数并将其保存在一个整型数组中,数字保存在数组中的顺序与 //下标正好相反,也就是第一个被输入的数放在数组最后一个元素中,最后一个输入 //的数字放到第一个元素中。 #include <stdio.h> //int main(int argc,const char *argv[]) //{ // int a[10]; // for (int i=10-1; i>=0; i--) { // scanf("%d", &a[i]); // } // for (int i=0; i<10; i++) { // printf("%d ", a[i]); // } // printf("\n"); // return 0; //} //13.给定一个 5 个元素构成的整型数组,每个元素的值都在 0-9 之间,按照位置将其组 //成一个 5 位数并输出,例如 int a[5] = {1,2,2,3,7};则输出 73221。 //int main(int argc, const char *argv[]) //{ // int a[5]; // int num=0; // for (int i=0; i<5; i++) { // scanf("%d", &a[i]); // } // for (int i=4; i>=0; i--) { // num = num*10+a[i]; // } // printf("%d\n", num); // return 0; //} //17.给定一个有 10 个整形数的元素,将前 5 个元素跟后 5 个元素做整体交换,比如 //{1,1,1,1,1,2,3,2,2,2}->{2,3,2,2,2,1,1,1,1,1}。 //int main(int argc, const char *argv[]) //{ // int a[10]; // for (int i=0; i<10; i++) { // scanf("%d", &a[i]); // } // for (int i=0; i<5; i++) { // int temp = a[i]; // a[i]=a[i+5]; // a[i+5]=temp; // } // for (int i=0; i<10; i++) { // printf("%d ", a[i]); // } // return 0; //} //18.判断一个整型数组是否是对称数组,例如{1,2,3,3,2,1}和{1,6,8,1,8,6,1}都是对称数组。 //int main(int argc,const char *argv[]) //{ // int a[100]={}; // int cnt = 0; // int flag =0;//标志变量 // // for (int i=0; i<100; i++) { // scanf("%d", &a[i]); // cnt++; // if (getchar()=='\n') { // break; // } // } // // for (int i=0; i<cnt/2; i++) { // if (a[i]!=a[cnt-i-1]) { // flag =1; // } // } // // if (flag) { // printf("不是对称数组\n"); // } // else // { // printf("是对称数组\n"); // } // return 0 ; //} //int main(int argc,const char *argv[]) //{ // int a[5]; // int b[5]; // for (int i=0; i<5; i++) { // scanf("%d", &a[i]); // } // for (int i=0; i<5; i++) { // scanf("%d", &b[i]); // } // for (int i=0; i<5; i++) { // a[i]=b[i]=a[i]+b[i]; // printf("%d ", a[i]); // } // printf("\n"); // return 0; //} //21.给定一个能容纳 10 个元素的整型数组,现有 9 个元素,现在第 5 个元素的位置插入 //一个数字 88,后面的数字顺序后移。 //int main(int argc, const char *argv[]) //{ // int a[10]={}; // for (int i=0; i<9; i++) { // scanf("%d", &a[i]); // } // // for (int j=8; j>=4; j--) { // a[j+1]=a[j]; // } // a[4]=88; // for (int i=0; i<10; i++) { // printf("%d ", a[i]); // } // return 0; //} //22.给定一个 10 个元素的整型数组,现在将第 2 个元素删除,后面的数组顺序前移。 //int main(int argc,const char *argv[]) //{ // int a[10]={}; // for (int i=0; i<10; i++) { // scanf("%d", &a[i]); // } // for (int i=1; i<9; i++) { // a[i]=a[i+1]; // } // for (int i=0; i<9; i++) { // printf("%d ",a[i]); // } // return 0; //} //25.给定一个整型数组,求该数组中第二大的数的下标。 //int main(int argc,const char *argv[]) //{ // int a[20]; // int cnt=0; // int max; // for (int i =0; i<20; i++) { // scanf("%d", &a[i]); // cnt++; // if (getchar()=='\n') { // break; // } // } // max=a[0]; // for (int i=1; i<cnt; i++) { // if (a[i]>max) { // max = a[i]; // } // } // int k=-1;// // int temp=0; // for (int i=0; i<cnt; i++) {//找到第一个不等于max的值赋值给temp // if (a[i]==max) { // continue; // } // temp = a[i]; // k=i; // break; // } // if (k==-1) {//判断是否有第二大的值 // return -1; // } // // for (int i=0; i<cnt; i++) {//找第二大的值,记录下标 // if (max==a[i]) { // continue; // } // if (temp<a[i]) { // temp = a[i]; // k=i; // } // } // printf("k =%d\n", k); // return 0; //} //30.给定一个英文句子,单词之间用 1 个空格分开,求出第 2 个单词的偏移位置。例如 //“Professor du comes from Korea”的偏移位置是 10。 //int main(int argc,const char *argv[]) //{ // char str[100]; // int cnt=0; // int index=0; // for (int i=0; i<100; i++) { // str[i]=getchar(); // if (str[i]=='\n') { // str[i]='\0'; // break; // } // cnt++; // } // for (int i=0; i<cnt; i++) { // if (str[i]==' ') { // index = i; // break; // } // } // printf("index = %d\n", index+1); // return 0 ; //} //32.给定两个字符数组,将这两个拼接起来放在第一个数组中(假定第一个数组足够长), //比如“abc”和“123”构成“abc123”。 #include <string.h> //int main(int argc,const char *argv[]) //{ // char str1[100]={}; // char str2[50]={}; // scanf("%s%s",str1,str2); // int len1= (int)strlen(str1);//求字符串有效字符个数"qianfeng" // int len2= (int)strlen(str2); // // for (int i=len1; i<len1+len2; i++) { // str1[i]=str2[i-len1]; // } // printf("%s\n", str1); // return 0 ; //} //34.给定一个整型数组,数组的长度为 N(N>3),从数组中寻找一个连续的长度为 3 的 //子数组,要求该子数组的和最大。 //12345 // //int main(int argc,const char *argv[]) //{ // int a[100]; // int cnt = 0; // int max; // for (int i=0; i<100; i++) { // scanf("%d", &a[i]); // cnt++; // if (getchar()=='\n') { // break; // } // } // if (cnt<=3) { // return -1; // } // max = a[0]+a[1]+a[2]; // int k=0; // for (int i=1; i<cnt-2; i++) { // if (max<a[i]+a[i+1]+a[i+2]) { // max=a[i]+a[i+1]+a[i+2]; // k=i; // } // } // printf("k = %d\n", k); // // return 0 ; //} //35.给定两个长度一样的整型数组,判断两个数组是否相同,相同的原则是数组中的每 一个相互对应的元素的“和值”相同,“和值”是指元素对应的整数所有位的合,例 如:a[0]的值是 1112,b[0]的值是 23,则这两个元素“相同”。 int sumBit(int num) { int sum=0; while (num) { sum+=num%10; num/=10; } return sum; } //int main(int argc, const char *argv[]) //{ // int a[5]; // int b[5]; // for (int i=0; i<5; i++) { // scanf("%d", &a[i]); // } // for (int i=0; i<5; i++) { // scanf("%d", &b[i]); // } // // for (int i=0; i<5; i++) { // if (sumBit(a[i])!=sumBit(b[i])) { // printf("两个数组不相等\n"); // return -1; // } // } // printf("两个数组相等\n"); // return 0; //} //36.给定两个字符数组,比较这两个字符数组的大小,比较的原则是字符数组中所有字 符的 ASCII 值相加后的和值,和值越大则字符数组越大。 //int main(int argc,const char *argv[]) //{ // char str1[100]; // char str2[100]; // scanf("%s%s",str1,str2); // int sum1=0,sum2=0; // int len1 = (int)strlen(str1); // int len2 = (int)strlen(str2); // for (int i=0; i<len1; i++) { // sum1+=str1[i]; // } // for (int i=0; i<len2; i++) { // sum2+=str2[i]; // } // if (sum1 < sum2) { // printf("str1 < str2\n"); // } // else if(sum1 == sum2) // { // printf("str1 == str2\n"); // } // else // { // printf("str1 > str2\n"); // } // // return 0; //} //输入一串小写字母(以"."为结束标志),统计出每个字母在该字符串中出现的次数(若某字母不出现,则不要输出)。 //int main(int argc,const char *argv[]) //{ // //aaabbabbccccc // //4004000050000 // // // char str[100]; // int cnt[100]; // int len=0; // for (int i=0; i<100; i++) { // str[i]=getchar(); // if (str[i]=='.') { // str[i]='\0'; // break; // } // len++; // cnt[i]=1; // } // for (int i=0; i<len; i++) { // if (cnt[i]!=0) { // for (int j=i+1; j<len; j++) { // if (cnt[j]!=0 && str[i]==str[j]) { // cnt[i]++; // cnt[j]=0; // } // } // } // } //// for (int i=0; i<len; i++) { //// printf("%d ", cnt[i]); //// } // for (int i=0; i<len; i++) { // if (cnt[i]) { // printf("char = %c cnt = %d\n", str[i],cnt[i]); // } // } // // return 0; //} //41.编写函数将一个n*n矩阵转置,例如:(****) //1 2 3 4 1 5 3 4 //5 6 7 8 -> 2 6 2 7 //3 2 5 9 3 7 5 2 //4 7 2 3 4 8 9 3 //*/ //int main(int argc,const char *argv[]){ // int a[4][4]={{1,2,3,4}, // {5,6,7,8}, // {3,2,5,9}, // {4,7,2,3}}; // // for (int i=0; i<4; i++) { // for (int j=i; j<4; j++) { // int temp=a[i][j]; // a[i][j]=a[j][i]; // a[j][i]=temp; // } // } // for (int i=0; i<4; i++) { // for (int j=0; j<4; j++) { // printf("%4d",a[i][j]); // } // printf("\n"); // } // return 0; //} //3.输入十个数,任意相邻的两个数不同,输出所有的递增,递减序列 //比如: //输入:1 5 9 8 12 21 3 0 -1 9 //输出: //1 5 9 //9 8 //8 12 21 //21 3 0 -1 //-1 9 // //输入: 3 9 8 -11 4 21 8 -3 0 2 //输出: //3 9 //9 8 -11 //-11 4 21 //21 8 -3 //-3 0 2 //int main(int argc, const char *argv[]) //{ // int a[10]; // for (int i=0; i<10; i++) { // scanf("%d", &a[i]); // } // // printf("%d ", a[0]); // for (int i=1; i<=8; i++) { // printf("%d ",a[i]); // if ((a[i]>a[i-1] && a[i]>a[i+1]) || (a[i]<a[i-1] && a[i]<a[i+1])) { // printf("\n%d ",a[i]); // } // } // printf("%d\n",a[9]); // // return 0; //} //1. 有m个人围成一圈,开始报数,报道n,退出,问最后剩下的是几号。(从1号开始) //比如: //输入:5 3 //输出: //4 // //输入: 6 2 //输出: //5 //0 0 0 4 0 // //int main(int argc, const char *argv[]) //{ // int a[100]; // int m, n; // int cnt=0;//统计出局人数 // int k=0; // int i; // scanf("%d%d", &m,&n); // if (m>100) { // return -1; // } // for (i=0; i<m; i++) { // a[i]=i+1; // } // i=0; // while (cnt<m-1) { // if (a[i]) {//计数 // k++; // } // if (k==n) {//统计出局人数 // k=0; // a[i]=0; // cnt++; // } // i++; // if (i==m) {//处理边界 // i=0; // } // } // i=0; // while (!a[i++]); // // printf("%d\n", a[i-1]); // // return 0; //} //2. 输入两个数,第一个数决定一个nXn的矩阵,第二个数决定从1开始赋值,赋值的上限 //比如: //输入:5 18 //输出:p q //1 2 3 4 5 //16 17 18 0 6 //15 0 0 0 7 //14 0 0 0 8 //13 12 11 10 9 // //输入: 4 12 //输出: //1 2 3 4 //12 0 0 5 //11 0 0 6 //10 9 8 7 //#define RIGHT 1 //#define DOWN 2 //#define LEFT 3 //#define UP 4 // //int main(int argc, const char * argv[]) { // int a[20][20]={}; // int n, m; // scanf("%d%d", &n,&m); // if (n<1||m<1||m>n*n||n>20) { // return -1; // } // int type=RIGHT;//1:从左往右赋值 2:从上往下赋值 3:从右往左赋值4:从下往上赋值 // int p=0,q=0; // int s1=n-1; // int s2=n-1; // int s3=0; // int s4=1; // int i=1; // while (i<=m) { // a[p][q]=i; // switch (type) { // case RIGHT: // if (++q==s1) {//判断是否到边界 // type = DOWN; // s1--; // } // break; // case DOWN: // if (++p==s2) { // type = LEFT; // s2--; // } // break; // case LEFT: // if (--q==s3) { // type = UP; // s3++; // } // break; // case UP: // if (--p==s4) { // type=RIGHT; // s4++; // } // break; // default: // break; // } // i++; // } // // for (int i=0; i<n; i++) { // for (int j=0; j<n; j++) { // printf("%4d", a[i][j]); // } // printf("\n"); // } // return 0; //} //4..输入10个数,找出出现次数最多的数 (如果多个并列,则按数字出现顺序分别输出) //比如: //输入:1 2 2 3 4 5 6 7 8 9 //输出:2 //数据结构: 定义一个整型数组 int count[10] 存储每个元素的个数, 开始时每个元素个数初始化为1 // //算法: //(1) 利用双层循环, 每一个元素都与后面一个元素比较, 如果两者相同, 则该元素次数+1, //(2) 以上的算法中两个相同的元素的次数是一样的, 优化如下, 比较两个元素的时候, 如果两者相等, 则该元素次数+1, 后面的元素次数设置为0, 比较的时候再判断这个元素是否已经比较 // //伪代码: // //定义数组保存每个元素次数 // //使用双层循环遍历数组 //如果当前元素后后面元素相等, 并且后面的元素次数不为0 //当前元素次数+1, 后面的元素次数设置为0 // //从保存每个元素次数的数组中查找最大的值 //a[10] //1 2 2 3 4 3 4 5 8 5 //count[10] //1 2 0 4 2 0 0 0 1 0 // //int main(int argc,const char *argv[]) //{ // int a[10]; // int count[10]; // for (int i=0; i<10; i++) { // scanf("%d", &a[i]); // count[i]=1; // } // // for (int i=0; i<10; i++) { // if (count[i]) { // for (int j=i+1; j<10; j++) { // if (a[j]==a[i]) { // count[i]++; // count[j]=0; // } // } // } // } //// for (int i=0; i<10; i++) { //// printf("%d ", count[i]); //// } // //找最大值 // int max = count[0]; // for (int i=0; i<10; i++) { // if (max<count[i]) { // max=count[i]; // } // } // //查找cnt最大值对应的数 // for (int i=0; i<10; i++) { // if (max==count[i]) { // printf("%d ", a[i]); // } // } // printf("\n"); // return 0; //} //5.魔方阵是一个古老的智力问题,它要求在一个m*m的矩阵中填入1~m^2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等。请编程实现输入m,输出m*m的魔方阵出来。 //比如: //输入:3 //输出: //6 1 8 上一个数i=0 下一个数i=n-1 j-- //7 5 3 上一个数j=n-1 下一个数j=0 i-- //2 9 4 i++; //(1)将1放在第一行中间一列; //(2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1/减1(例如上面的三阶魔方阵,5在4的上一行后一列); //(3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1; //(4)当上一个数的列数为1时,下一个数的列数应为n,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列; //(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面; //int main(int argc,const char *argv[]) //{ // int a[19][19]={}; // int n; // scanf("%d", &n); // if (!(n%2) || n>19 || n<3) { // return -1; // } // int k=1; // int i=0,j=n/2; // int tempi,tempj;//保存上一次的位置 // while (k<=n*n) { // a[i][j]=k; // tempi =i; // tempj =j; // i--; // j--; // if (tempi==0) { // i=n-1; // } // if (tempj==0) { // j=n-1; // } // if (a[i][j]) { // i=tempi+1; // j=tempj; // } // k++; // } // // for (i=0; i<n; i++) { // for (j=0; j<n; j++) { // printf("%4d", a[i][j]); // } // printf("\n"); // } // return 0; //} //随机数问题 #include <stdlib.h> #include <unistd.h> #include <time.h> /*int main(int argc,const char *argv[]) { //void srand(unsigned); //int rand(void); while (1) { // //time_t time(time_t *); //time(NULL) //srand((unsigned)time(NULL));//利用系统时间产生随机数种子 int num = rand()%101; printf("num = %d\n" , num); sleep(1); //usleep(1000); } // int a[100]; // srand((unsigned)time(NULL)); // for (int i=0; i<50; i++) { // a[i]=rand()%100; // } // for (int i=0; i<50; i++) { // printf("%d ", a[i]); // } return 0; } */ //atoi函数的实现 //实现一个函数,传递一个字符数组,返回字符数组中的整数值,并在main函数中输出。 //例如: //输入:134a231b //输出:134 //输入:-129cde //输出:-129 /*#include <stdlib.h> int myatoi(char *src) { char *pstr=src; int num=0; int flag=1; while (*pstr==' ') { pstr++; } if (*pstr=='+') { pstr++; } else if (*pstr=='-') { flag=-flag; pstr++; } while (*pstr>='0' && *pstr<='9') { num =num*10+(*pstr-48); pstr++; } num*=flag; return num; } int main(int argc, const char * argv[]) { printf("%d\n", myatoi("123abe")); return 0; }*/ //实现一个函数,传递一个有10个整形元素的数组,将数组中的0全部移动到数组末尾,将非0的值移至开始(保持原来顺序不变),并在main函数中将转换的结果输出。 //例如: //输入: 5 9 -1 0 2 8 0 3 7 0 //5 9 -1 2 8 0 3 7 4 0 //输出: 5 9 -1 2 8 3 7 4 0 0 //void func(int *arr, int len) //{ // //int *p = arr; // int cnt = 0;//统计0的个数 // for (int i=0; i<len-cnt-1; i++) { // if (*(arr+i)==0) { // for (int j=i; j<len-cnt-1; j++) { // *(arr+j) = *(arr+j+1); // } // *(arr+len-cnt-1)=0; // cnt++; // i--; // } // } //} //void func(int *arr, int len) //{ // int *p = arr; // int cnt = 0;//统计0的个数 // for (int i=0; i<len-cnt-1; i++) { // if (!(*p)) { // for (int j=0; j<len-cnt-1-i; j++) { // *(p+j) = *(p+j+1); // } // *(p+len-cnt-i-1)=0; // cnt++; // p--; // i--; // } // p++; // } //} // //int main(int argc,const char *argv[]) //{ // int a[10]={5,0,-1,0,2,8,0,3,7,0}; // func(a, 10); // for (int i=0; i<10; i++) { // printf("%d ", a[i]); // } // printf("\n"); // return 0; //} //*****************************************/ // 字符串练习 //*****************************************/ //注:字符串的习题中有的地方用了 sscanf 跟sprintf 这两个函数,大纲中没有要求这两个函数,但是希望大家可以通过看官方文档自己把这两个函数学习下 #include <string.h> //实现一个函数,传递两个字符数组,输出第二个字符数组在第一个字符数组中出现的次数。 //比如: //输入: //abcdfewabcssaba //abc //输出:2 //int main(int argc, const char *argv[]) //{ // char *str1="abcdfewabcssaba"; // char *str2="abc"; // int cnt = 0; // char *pstr=str1; // // while ((pstr = strstr(pstr, str2))) { // cnt++; // pstr+=strlen(str2); // } // printf("cnt = %d\n", cnt); // // return 0; //} //查找一个字符串2在字符串1中第一次出现的位置 //比如: //输入 //asdfwd //df //输出为 //3 // //输入 //hhff //hf //输出为 //2 #include <stdlib.h> #include <string.h> /* int main(int argc, const char * argv[]) { char *str = (char *)malloc(100*sizeof(char)); char *substr = (char *)malloc(100*sizeof(char)); if (!str || !substr) { return -1; } scanf("%s%s", str,substr); int index=0; char *pstr = strstr(str,substr); if (pstr) { index = (int)(pstr-str+1); } printf("%d\n", index); return 0; }*/ //int main(int argc,const char *argv[]) //{ // char *str = (char *)malloc(100*sizeof(char)); // if (!str) { // return -1; // } // // //方法一 //// gets(str); //// printf("%s\n", str); // //方法二 // //scanf("%[^\n]",str); // scanf("%[A-Z,a-z,0-9]",str);//必须是A-Z之间 // printf("%s\n", str); // return 0; //} //int main(int argc,const char *argv[]) //{ //// char str[100]={}; //// scanf("%s", str); //// char ch; //// //fflush(stdin); //// getchar(); //// scanf("%c", &ch); //// if (ch =='\n') { //// printf("hello world\n"); //// } //// printf("%s %c\n", str,ch); // // char ch1 ; // ch1 = getchar(); // printf("%c\n", ch1); // // return 0; //} //查找一个字符串2在字符串1中所有出现的位置 //比如: //输入 //asdfdfdfwd //df //输出为 //3 5 7 // //输入 //hhfhf //hf //输出为 //2 //4 //int searchStringIndex(char *src, char *substr, int *index) //{ // int count = 0; // int len = (int)strlen(substr); // char *pstr = src; // while ((pstr = strstr(pstr, substr))) { // index[count++] = (int)(pstr-src)+1; // pstr+=len; // } // return count; //} //int main(int argc,const char *argv[]) //{ // char *str = malloc(100*sizeof(char)); // char *substr = malloc(100*sizeof(char)); // int index[100]={}; // if (!str || !substr) { // exit(-1); // } // scanf("%s %s", str,substr); // // int cnt = searchStringIndex(str,substr,index); // // for (int i=0; i<cnt; i++) { // printf("%d ", index[i]); // } // printf("\n"); // // return 0; //} //int main(int argc,const char *argv[]) //{ // int len = (int)strlen(NULL);//不能传入NULL // printf("len = %d\n", len); // return 0; //} //字符串原地压缩。题目描述:“eeeeeaaaff" 压缩为 "e5a3f2"。 //字符串压缩算法,把s字符串压缩处理后结果保存在res中 // //比如: //输入 //aaaaeefggg //输出为 //a4e2f1g3 // //输入 //hhfhhhhff //输出为 //h2f1h4h2 //char * compress(char *src, char *buf) //{ // char *pstr = src; // int cnt = 1; // char *pbuf = buf; // while (*pstr) { // if (*pstr == *(pstr+1)) { // cnt++; // } // else // { // pbuf += sprintf(pbuf,"%c%d", *pstr,cnt); // cnt = 1; // } // pstr++; // } // return buf; //} // //int main(int argc,const char *argv[]) //{ // char str[100]={}; // char buf[200]={}; // scanf("%s",str); // // printf("%s\n", compress(str, buf)); // return 0; //} //int main(int argc,const char *argv[]) //{ // int a=100; // char *str = "hello world"; // float f = 3.14; // // char buf[100]={}; // int len = sprintf(buf, "%f",f); // printf("%s\n", buf); // printf("len = %d\n", len); // // return 0; //} //字符串原地压缩。题目描述:"e5a3f2" 解压缩为 “eeeeeaaaff"。 //字符串压缩算法,把s字符串压缩处理后结果保存在res中 // //比如: //输入 //a14e2f1g3 //输出为 //aaaaeefggg // //输入 //h2f1h4h2 //输出为 //hhfhhhhff //#include <ctype.h> // //int main(int argc,const char *argv[]) //{ // char str[100]={}; // char buf[1000]={}; // // char ch; // int cnt=0; // scanf("%s", str); // // char *pbuf = buf; // char *pstr = str; // while (*pstr) { // sscanf(pstr,"%c%d",&ch,&cnt); // memset(pbuf, ch, cnt); // pbuf+=cnt; // pstr++; // while (isdigit(*pstr)) { // pstr++; // } // } // printf("%s\n",buf); // // return 0; //} //求一个字符串s的最大连续递增数字子串。 // // //比如: //输入 //f123fffwf3256789:abcd //输出为 //123 // //输入 //abcd345bbw1357f123 //输出为 //123 //#include <ctype.h> // //int main(int argc,const char *argv[]) //{ // char str[100]={}; // scanf("%s", str); // char *pstr = str; // int max=0; // char *pmax = NULL; // int cnt=0; // while (*pstr) { // if (isdigit(*pstr)) { // cnt = 1; // while ((*pstr == *(pstr+1)-1) && (*pstr!='9')) { // cnt++; // pstr++; // } // pstr++; // if (max < cnt) { // max = cnt; // cnt = 0; // pmax = pstr-max; // } // } // else // { // pstr++; // } // } // if (pmax) { // *(pmax+max)='\0'; // printf("%s\n", pmax); // } // return 0; //} //字符串排序。比较三个字符串的大小,然后按从小到大的顺序将字符串输出。 //比如: //输入 //asdfwd //ddrwf //ffweff //输出为 //asdfwd //ddrwf //ffweff // //输入 //sgfgeasdfw //aabbe //wrwwdfaf //输出为 //aabbe //sgfgeasdfw //wrwwdfaf /* int main(int argc, const char *argv[]) { char *pstr[20]={NULL}; int cnt = 0; for (int i=0; i<20; i++) { pstr[i] = calloc(100, sizeof(char)); if (pstr[i]) { scanf("%s", pstr[i]); cnt++; } if (getchar() == '\n') { break; } } //排序 for (int i=0; i<cnt-1; i++) { for (int j=0; j<cnt-i-1; j++) { if (strcmp(pstr[j], pstr[j+1])>0) { char *ptemp = pstr[j]; pstr[j]= pstr[j+1]; pstr[j+1] = ptemp; } } } for (int i=0; i<cnt; i++) { printf("%s\n", pstr[i]); free(pstr[i]); pstr[i]=NULL; } return 0; } */ //memmem() //void *memmem(const void *srcmem, size_t size1, const void *submem, size_t size2) //srcmem: 源内存块的地址 //size1:源内存块的大小 //submem: 子内存块的首地址 //size2: 查找字节个数 void *my_memmem(const void *srcmem,size_t len1,const void *submem,size_t len2) { char *psrc = (char *)srcmem; for (int i=0; i<len1; i++) { char *ptmp = psrc; char *psub = (char *)submem; int j=0; while (*psrc == *psub) { psrc++; psub++; j++; if (j==len2) { return ptmp; } } psrc = ptmp+1; } return NULL; } //int main(int argc,const char *argv[]) //{ // char srcmem[100]="hello world qian feng"; // char submem[20]="world"; // printf("%s\n", my_memmem(srcmem, 100, submem, 6)); // // return 0; //} //返回在两字符串中第一个相同的子串(大于1个字符),并将子串输出 // // //比如: //输入 //adbAFEHHFS //acwfagAFEf //输出为 //AFE // //输入 //qfdgJKlin //qdfgJKwfo //输出为 //gJK /* int main(int argc,const char *argv[]) { char str1[100]={}; char str2[100]={}; scanf("%s%s", str1,str2); int len1 = (int)strlen(str1); int len2 = (int)strlen(str2); char *pstr = str2; char *ptmp=NULL; for (int i=0; i<len2-1; i++) { if ((ptmp = (char *)my_memmem(str1, len1, pstr, 2))) { //printf("%s\n",ptmp); int j=2; while (*(ptmp+j) == *(pstr+j)) { j++; } *(ptmp+j)='\0'; printf("%s\n",ptmp); break; } pstr++; } return 0; }*/ //泛型算法 //实现排序整型, 浮点 ,字符型 //从小到大 //冒泡排序 /* #include <math.h> int compare_int(void *a, void *b) { return *(int *)a-*(int *)b; } int compare_float(void *a, void *b) { if (fabs(*(float *)a-*(float *)b)<0.00005) { return 0; } else if(*(float *)a>*(float *)b) { return 1; } else { return -1; } } int compare_char(void *ch1, void *ch2) { return *(char *)ch1-*(char *)ch2; } //7 6 4 5 3 //第一次 //6 7 4 5 3 //6 4 7 5 3 //6 4 5 7 3 //6 4 5 3 7 //第二次 //4 6 5 3 7 //4 5 6 3 7 //4 5 3 6 7 void sort_data(int (*pfunc)(void *, void *), void *pdata,size_t len,size_t size) { char *p_i = (char *)pdata; for (int i=0; i<len-1; i++) { for (int j=0; j<len-i-1; j++) { if (pfunc(p_i+j*size, p_i+(j+1)*size) > 0) { char temp[size]; memcpy(temp, p_i+j*size, size); memcpy(p_i+j*size, p_i+(j+1)*size, size); memcpy(p_i+(j+1)*size, temp, size); } } } } int main(int argc,const char *argv[]) { // int a[10]={7,6,4,5,3}; // sort_data(compare_int, a, 5, sizeof(int)); // for (int i=0; i<5; i++) { // printf("%d ", a[i]); // } // float a[10]={7.8,6.7,4.3,5.2,3.0}; // sort_data(compare_float, a, 5, sizeof(float)); // for (int i=0; i<5; i++) { // printf("%.2f ", a[i]); // } char a[10]="hello"; sort_data(compare_char, a, 5, sizeof(char)); for (int i=0; i<5; i++) { printf("%c ", a[i]); } return 0; }*/ //输入一个字符串,然后返回连续最大的字符串 // //比如demo //1,3,3,3,4,4,4,4,4,0,0,0,4,4,4,4 //,此例中由5个连续的4为最大连续子串,返回结果为44444. //1,3,3,3,4,4,4,4,4,0,0,0,5,5,5,5 返回44444; //1,3,3,3,5,5,5,5,5,4,4,4,4,4,0,0,0,0,0,0,4,4,4,4},返回000000; //int main(int argc, const char * argv[]) { // @autoreleasepool { // char str[100]={}; // scanf("%s", str); // char *pstr = str; // while (*pstr) { // if (*pstr == ',') { // int len = (int)strlen(pstr+1); // memmove(pstr, pstr+1, len); // *(pstr+len)='\0'; // pstr--; // } // pstr++; // } // //printf("%s\n", str); // pstr = str; // int cnt = 1; // int max =0; // char *pmax = NULL; // while (*pstr) { // while(*pstr == *(pstr+1)) { // cnt++; // pstr++; // } // if (cnt>max) { // max = cnt; // pmax = pstr-cnt+1; // } // cnt = 1; // pstr++; // } // *(pmax+max) = '\0'; // printf("%s\n", pmax); // } // return 0; //} //从键盘输入个数不定的字符串(不超过10个),以最后一个字符串整体连接到每两个字符串之间,组成一个新的字符串,并且输出这个字符串; //比如: //输入: //I am Optimus Prime! //: //输出为 //I:am:Optimus:Prime! //输入: //Hi welcome to qianfeng //#@ //输出为 //Hi#@welcome#@to#@qianfeng //输入 //abc def ghi jkl heihei haha mygod //** //输出为 //abc**def**ghi**jkl**heihei**haha**mygod //int main(int argc,const char *argv[]) //{ // char *pstr[10]={NULL}; // char demi[10]={}; // char *pbuf = (char *)malloc(1000*sizeof(char)); // int cnt = 0; // for (int i=0; i<10; i++) { // pstr[i]=(char *)malloc(100*sizeof(char)); // scanf("%s", pstr[i]); // cnt++; // if (getchar() =='\n') { // break; // } // } // scanf("%s", demi); // char *p = pbuf; // int length =(int)strlen(demi); // for (int i=0; i<cnt; i++) { // strcat(p, pstr[i]); // p+=(int)strlen(pstr[i]); // if (i<cnt-1) { // strcat(p, demi); // p+=length; // } // } // printf("%s\n", pbuf); // // return 0; //} //输入两个字符串,以第二个字符串整体作为分割条件把第一个字符串进行分割,然后输出分割之后的单词。 //比如: //输入: //I:am:Optimus:Prime! //: //输出: //I //am //Optimus //Prime! //输入: //Hi#@welcome#@to#@qianfeng#@ //#@ //int main(int argc, const char *argv[]) //{ // char str[100]={}; // char substr[10]={}; // scanf("%s%s", str,substr); // char *p,*q; // p = q = str; // int len = (int)strlen(substr); // while ((p = strstr(p, substr))) { // *p = '\0'; // printf("%s\n",q); // p += len; // q = p; // } // if(*q!='\0') // { // printf("%s\n", q); // } // // return 0; //}