2024年6月15日发(作者:)
华为机试题
【2011】
1、
(stdlib.h里面定义了五种类型、一些宏和通用工具函数。 类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t; 宏
例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX等等; 常用的函数如malloc()、calloc()、
realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit())
#include
#include
#include
#include
#define LENGTH 13
int verifyMsisdn(char *inMsisdn)
{
char *pchar=NULL;
assert(inMsisdn!=NULL);
if(LENGTH==strlen(inMsisdn))
{
if(('8'==*inMsisdn)&&(*(inMsisdn+1)=='6'))
{
while(*inMsisdn!='0')
{
if((*inMsisdn>='0')&&(*inMsisdn<='9'))
inMsisdn++;
else
return 2 ;
}
}
else
return 3;
}
else
return 1;
return 0;
}
int main()
{
char *pchar=NULL;
unsigned char ichar=0;
int result;
switch(ichar)
{
case 0:
pchar="86";break;
case 1:
pchar="8611";break;
case 2:
pchar="86s1234536366"; break;
default:
break;
}
result =verifyMsisdn(pchar);
printf("result is %dn",result);
}
华赛面试:
1.
char m[]={"I", "LOVE", "CHINA"}
char* p=m;
printf("%s", *p++);
printf("%c", **p);
int main()
{
double x=1;
double y;
y=x+3/2;
printf("%fn",y);
return 0;
} ////// 结果为2.000000
3.
4.找错
unsigned int f()
{
unsigned char a=123;
unsigned char res;
while(a-->=0)
{
res+=a;
}
return res;
}//res没有初始化
5.
struct node
{
int data;
node* pre;
node* next;
}
结构体数组转双向循环链表
1. 数组比较(20 分)
• 问题描述:
比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果 2 个数组
长度不等,则只比较较短长度数组个数元素。请编程实现上述比较,并返回比较
中发现的不相等元素的个数
比如:
数组{1,3,5}和数组{77,21,1,3,5}按题述要求比较,不相等元素个数为 0
数组{1,3,5}和数组{77,21,1,3,5,7}按题述要求比较,不相等元素个数为 3
• 要求实现函数:
int array_compare(int len1, int array1[], int len2, int array2[])
【输入】 int len1:输入被比较数组 1 的元素个数;
int array1[]:输入被比较数组 1;
int len2:输入被比较数组 2 的元素个数;
int array2[]:输入被比较数组 2;
【输出】 无
【返回】 不相等元素的个数,类型为 int
• 示例
1) 输入:int array1[] = {1,3,5},int len1 = 3,
int array2[] = {77,21,1,3,5},int len2 = 5
函数返回:0
2) 输入:int array1[] = {1,3,5},int len1 = 3,
int array2[] = {77,21,1,3,5,7},int len2 = 6
函数返回:3
#include
#include
#include
int array_compare(int len1, int array1[], int len2, int array2[])
{
int count=0;
for( ;len1>0&&len2>0 ;len1--,len2--)
{
if(array1[len1-1]!=array2[len2-1])
{
count++;
}
} //蓝色字体部分也可以换成如下的代码
if(array1[len1-1]==array2[len2-1]) break; else count++;
return count;
}
int main()
{
int result=0;
int array1[]={1,3,5};
int len1=3;
int array2[]={77,12,1,3,5};
int len2=5;
result=array_compare( len1, array1, len2, array2);
///result=array_compare( len1, array1[], len2, array2[]);不能这样
// 函数形参
中永远只是传得首地址,不能传数组 切记切记!!!!!!
printf("the result is %d", result);
}
2. 约瑟夫问题
• 问题描述:
输入一个由随机数组成的数列(数列中每个数均是大于 0 的整数,长度已知),
和初始计数值 m。从数列首位置开始计数,计数到 m 后,将数列该位置数值替换
计数值 m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列
所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。请编
程实现上述计数过程,同时输出数值出列的顺序
比如: 输入的随机数列为:3,1,2,4,初始计数值 m=7,从数列首位置开始计数
(数值 3 所在位置)
第一轮计数出列数字为 2,计数值更新 m=2,出列后数列为 3,1,4,从数值 4 所
在位置从新开始计数
第二轮计数出列数字为 3,计数值更新 m=3,出列后数列为 1,4,从数值 1 所在
位置开始计数
第三轮计数出列数字为 1,计数值更新 m=1,出列后数列为 4,从数值 4 所在位
置开始计数
最后一轮计数出列数字为 4,计数过程完成。
输出数值出列顺序为:2,3,1,4。
• 要求实现函数:
void array_iterate(int len, int input_array[], int m, int output_arra
y[])
【输入】 int len:输入数列的长度;
int intput_array[]:输入的初始数列
int m:初始计数值
【输出】 int output_array[]:输出的数值出列顺序
【返回】 无
• 示例
输入:int input_array[] = {3,1,2,4},int len = 4, m=7
输出:output_array[] = {2,3,1,4}
////////////循环链表实现//////////////////////
#include
#include
#include
typedef struct Node
{
int num;
struct Node *next;
}node;
node *creat(int len,int input_array[])
{
node *h,*p,*s;
int i;
h=(node*)malloc(sizeof(node));
h->num=input_array[0];
p=h;
for(i=1;i { s=(node*)malloc(sizeof(node)); s->num=input_array[i]; p->next=s; p=s; } p->next=h; return(h); } void array_iterate(int len, int input_array[], int m, int output_array[]) { node *p,*q,*s; int i=0,j=0,k; p=creat(len,input_array); while(p->next!=p) { for(i=1;i { q=p; p=p->next; } m=p->num; printf("%5d",m); output_array[j++]=m; s=p; q->next=p->next; p=p->next; free(s); s=NULL; } m=p->num; printf("%5dn",m); output_array[j]=m; k=j; for(j=0;j<=k;j++) { printf("%5d",output_array[j]); } } int main() { int input_array[]={3,1,2,4}; int len=4; int m=7; int output_array[4]; array_iterate(len,input_array,m,output_array); } 3. 简单四则运算 • 问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值 注: 1、表达式只含 +, -, *, / 四则运算符,不含括号 2、表达式数值只包含个位整数(0-9),且不会出现 0 作为除数的情况 3、要考虑加减乘除按通常四则运算规定的计算优先级 4、除法用整数除法,即仅保留除法运算结果的整数部分。比如 8/3=2。输入表 达式保证无 0 作为除数情况发生 5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算 符字符,除此之外不含其它任何字符,不会出现计算溢出情况 • 要求实现函数: int calculate(int len,char *expStr) 【输入】 int len: 字符串长度; char *expStr: 表达式字符串; 【输出】 无 【返回】 计算结果 • 示例 1) 输入:char *expStr = “1+4*5-8/3” 函数返回:19 2) 输入:char *expStr = “8/3*3” 函数返回:6 第六题:类似昨天 Sara 说的最后一题: 给你一个数组 a[],数组长度 len 以及一个整数 m 从数组中第一个数字数起 找到第 m 个数字 输出 a[m] 然后再将 a[m]赋值给 m,从数组的下一个元素数起,找到第 m 个元素输出,以此进行直到数组中的元素 全部输出 第五题:一副牌中发五张扑克牌给你:让你判断数字的组成: 有以下几种情况: 1:四条:即四张一样数值的牌(牌均不论花色) 2:三条带一对 3:三条带两张不相同数值的牌 4:两对 5:顺子 包括 10,J,Q,K,A 6:什么都不是 7:只有一对 第一题:比较一个数组的元素 是否为回文数组 #include #include int huiwen(char str[]) { int i,len,k=1; len=strlen(str); for(i=0;i { if(str[i]!=str[len-i-1]) { k=1; break; } } if(k==0) printf("%s 不是一个回文数n",str); else printf("%s 是一个回文数n",str); } void main() { char str[100] = {0}; int i; int len; printf("Input a string:"); /*提示输入 Input a string:*/ scanf("%s", str); /*scan()函数输入一个字符串:*/ huiwen(str); } 第二题:求两个数组的和差 就是去掉两个数组中相同的元素 然后将两个数组 中的元素存放在一个新的数组中 切数组 A 中元素要在 B 数组元素之前 第三题:比较汗 求简单的四则运算 参与运算的数字只有 0--9 逆序单链表 第一题【20 分】:鉴定回文数组。 第二题【30 分】:求两个整型数组的异集,即 A+B-(A 与 B 的交集)。 第三题【50 分】:判定德州扑克的牌型。给 5 张牌,返回它的牌型,4 个的,3 个+对子,顺子,3 个+2 个单张,2 对,1 对,其他。 上午是输入一个数组,然后找出哪个比平均值大 上午是输入一个数组,然后找出哪个比平均值大 1. 手机号码合法性判断(20 分) 问题描述: 我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如: 86。特点如下: 1、 长度 13 位; 2、 以 86 的国家码打头; 3、 手机号码的每一位都是数字。 请实现手机号码合法性判断的函数要求: 1) 如果手机号码合法,返回 0; 2) 如果手机号码长度不合法,返回 1 3) 如果手机号码中包含非数字的字符,返回 2; 4) 如果手机号码不是以 86 打头的,返回 3; 【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如 果判断出长度不合法,直接返回 1 即可,不需要再做其他合法性判断。 要求实现函数: int s int verifyMsisdn(char* inMsisdn) 【输入】 char* inMsisdn,表示输入的手机号码字符串。 【输出】 无 【返回】 判断的结果,类型为 int。 示例 输入: inMsisdn = “869123456789“ 输出: 无 返回: 1 输入: inMsisdn = “889“ 输出: 无 返回: 3 输入: inMsisdn = “869“ 输出: 无 返回: 0 2. 将一个字符串的元音字母复制到另一个字符串,并排序(30 分) 问题描述: 有一字符串,里面可能包含英文字母(大写、小写)、数字、特殊字符,现在需 要实现一函数,将此字符串中的元音字母挑选出来,存入另一个字符串中,并对 字符串中的字母进行从小到大的排序(小写的元音字母在前,大写的元音字母在 后,依次有序)。 说明: 1、 元音字母是 a,e,i,o,u,A,E,I,O,U。 2、 筛选出来的元音字母,不需要剔重; 最终输出的字符串,小写元音字母排在前面,大写元音字母排在后面,依次有序。 要求实现函数: void sortVowel (char* input, char* output); 【输入】 char* input,表示输入的字符串 【输出】 char* output,排好序之后的元音字符串。 【返回】 无 示例 输入:char *input = “Abort!May Be Some Errors In Out System. “ 输出:char *output =“aeeeooAEIO “ 3. 身份证号码合法性判断 问题描述: 我国公民的身份证号码特点如下: 1、 长度为 18 位; 2、 第 1~17 位只能为数字; 3、 第 18 位可以是数字或者小写英文字母 x。 4、 身份证号码的第 7~14 位表示持有人生日的年、月、日信息。 例如:511002 19880808 0111 或 511002 x。 请实现身份证号码合法性判断的函数。除满足以上要求外,需要对持有人生日的 年、月、日信息进行校验。年份大于等于 1900 年,小于等于 2100 年。需要考虑 闰年、大小月的情况。所谓闰年,能被 4 整除且不能被 100 整除 或 能被 400 整除的年份,闰年的 2 月份为 29 天,非闰年的 2 月份为 28 天。其他情况的合法 性校验,考生不用考虑。 函数返回值: 1) 如果身份证号合法,返回 0; 2) 如果身份证号长度不合法,返回 1; 3) 如果身份证号第 1~17 位含有非数字的字符,返回 2; 4) 如果身份证号第 18 位既不是数字也不是英文小写字母 x,返回 3; 5) 如果身份证号的年信息非法,返回 4; 6) 如果身份证号的月信息非法,返回 5; 7) 如果身份证号的日信息非法,返回 6(请注意闰年的情况); 【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如 果判断出长度不合法,直接返回 1 即可,不需要再做其他合法性判断。 要求实现函数: int verifyIDCard(char* input) 示例 1) 输入:”511002 111222”,函数返回值:1; 2) 输入:”511002 abc123456789”,函数返回值:2; 3) 输入:”511002 a”,函数返回值:3; 4) 输入:”511002 4”,函数返回值:4; 5) 输入:”511002 4”,函数返回值:5; 6) 输入:”511002 4”,函数返回值:6; 7) 输入:”511002 1989 0229 1234”,函数返回值:7; 8) 输入:”511002 4”,函数返回值:0; 第一个:比较两个数组的元素是否相同 从后向前比较 ,直到比较完较短的一个数组为止。出现不同元素就返 回 0 相同则返回 1 第二题:比较一个数组的元素 是否为回文数组 第三题:求两个数组的和差 就是去掉两个数组中相同的元素 然后将两个数组 中的元素存放在一个新的数组中 切数组 A 中元素要在 B 数组元素之前 第四题:比较汗 求简单的四则运算 第五题:一副牌中发五张扑克牌给你:让你判断数字的组成: 有以下几种情况: 1:四条:即四张一样数值的牌(牌均不论花色) 2:三条带一对 3:三条带两张不相同数值的牌 4:两对 5:顺子 包括 10,J,Q,K,A 6:什么都不是 第六题:类似昨天 Sara 说的最后一题: 给你一个数组 a[],数组长度 len 以及一个整数 m 从数组中第一个数字数起 找到第 m 个数字 输出 a[m] 然后再将 a[m]赋值给 m,从数组的下一个元素数起,找到第 m 个元素输出,以此进行直到数组中的元素 全部输出 第一题【20 分】:鉴定回文数组。 第二题【30 分】:求两个整型数组的异集,即 A+B-(A 与 B 的交集)。 第三题【50 分】:判定德州扑克的牌型。给 5 张牌,返回它的牌型,4 个的,3 个+对子,顺子,3 个+2 个单张,2 对,1 对,其他。 【2012】 1、删除子串,只要是原串中有相同的子串就删掉,不管有多少个,返回子串个数。 #include #include #include #include int delete_sub_str(const char *str,const char *sub_str,char *result) { assert(str != NULL && sub_str != NULL); const char *p,*q; char *t,*temp; p = str; q = sub_str; t = result; int n,count = 0; n = strlen(q); temp = (char *)malloc(n+1); memset(temp,0x00,n+1); while(*p) { memcpy(temp,p,n); if(strcmp(temp,q) == 0 ) { count++; memset(temp,0x00,n+1); p = p + n; } else { *t = *p; p++; t++; memset(temp,0x00,n+1); } } free(temp); return count; } int main() { char s[100] = {‘0’}; int num = delete_sub_str(“123abc12de234fg1hi34j123k”,”123”,s); printf(“The number of sub_str is %drn”,num); printf(“The result string is %srn”,s); } 2、约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号 为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复 下去,直到圆桌周围的人全部出列。 #include #include typedef struct Node { int num; struct Node *next; }LinkList; LinkList *creat(int n) { LinkList *p,*q,*head; int i=1; p=(LinkList *)malloc(sizeof(LinkList)); p->num=i; head=p; for(i=2;i<=n;i++) { q=(LinkList *)malloc(sizeof(LinkList)); q->num=i; p->next=q; p=q; } p->next=head; /*使链表尾指向链表头 形成循环链表*/ return head; } void fun(LinkList *L,int m) { int i; LinkList *p,*s,*q; p=L; printf("出列顺序为:"); while(p->next!=p) { for(i=1;i { q=p; p=p->next; } printf("%5d",p->num); s=p; q->next=p->next; p=p->next; free(s); } printf("%5dn",p->num); } int main() { LinkList *L; int n, m; n=9; m=5; L=creat(n); fun(L,m); return 0; } 3、比较一个数组的元素 是否为回文数组 #include #include Void huiwen(char str[]) { int i,len,k=1; len=strlen(str); for(i=0;i { if(str[i]!=str[len-i-1]) { k=0; break; } } if(k==0) printf("%s 不是一个回文数n",str); else printf("%s 是一个回文数n",str); } void main() { char str[100] = {0}; printf("Input a string:");/*提示Input a string:*/ scanf("%s", str); /*scan()函数输入一个字符串:*/ huiwen(str); } 4、 数组比较(20分) • 问题描述: 比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果2个数组长度不等,则只比较较短长度数组 个数元素。请编程实现上述比较,并返回比较中发现的不相等元素的个数 比如: 数组{1,3,5}和数组{77,21,1,3,5}按题述要求比较,不相等元素个数为0 数组{1,3,5}和数组{77,21,1,3,5,7}按题述要求比较,不相等元素个数为3 • 要求实现函数: int array_compare(int len1, int array1[], int len2, int array2[]) 【输入】 int len1:输入被比较数组1的元素个数; int array1[]:输入被比较数组1; int len2:输入被比较数组2的元素个数; int array2[]:输入被比较数组2; 【输出】 无 【返回】 不相等元素的个数,类型为int • 示例 1) 输入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5},int len2 = 5 函数返回:0 2) 输入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5,7},int len2 = 6 函数返回:3 #include #include #include int array_compare(int len1, int array1[], int len2, int array2[]) { int count=0; for( ;len1>=0&&len2>=0 ;len1--,len2--) { if(array1[len1-1]==array2[len2-1]) { count++; } } return count; } int main() { int result=0; int array1[]={1,3,5}; int len1=3; int array2[]={77,12,1,3,5}; int len2=5; result=array_compare( len1, array1, len2, array2); ///result=array_compare( len1, array1[], len2, array2[]);不能这样,函数形参中永远只是传得首地址,不能传数组切记!! printf("the result is %d", result); } #include #include int array_compare(int len1,int array1[],int len2,int array2[]); int main() { int arr1[] = {1,3,5}; int arr2[] = {77,21,1,3,5,7}; int len1 = 0,len2 = 0; len1 = sizeof(arr1)/sizeof(int); len2 = sizeof(arr2)/sizeof(int); printf("%d %dn",len1,len2); printf("%d",array_compare(len1,arr1,len2,arr2)); return 0; } int array_compare(int len1,int array1[],int len2,int array2[]) { int num = 0; int i = 0,j = 0; for(i = len1 - 1,j = len2 - 1;i >= 0 && j >= 0;i--,j--) if(array1[i] != array2[j]) num++; return num; } /*int array_compare(int len1, int array1[], int len2, int array2[]) { if(len1 == len2) { int count = 0; for (int i=0;i { if(array1[i]!=array2[i]) count++; } return count; } else if(len1 return array_compare(len1,array1,len1,array2+len2-len1); } else { return array_compare(len2,array1+len1-len2,len2,array2); } }*/ #include int compare_array(int len1,int array1[],int len2,int array2[]) { int i,t,small,num=0; //把ã?两¢?数ºy组Á¨¦倒Ì1置? for(i=0;i { t=array1[i]; array1[i]=array1[len1-i-1]; array1[len1-i-1]=t; } for(i=0;i { t=array2[i]; array2[i]=array2[len2-i-1]; array2[len2-i-1]=t; } /* for(i=0;i printf("%d ",array1[i]); printf("n"); for(i=0;i printf("%d ",array2[i]); */ printf("n"); if(len1>len2) small=len2; else small=len1; num=small; for(i=0;i { if(array1[i]==array2[i]) num--; } printf("num=%dn",num); return num; } void main() { int array1[5]={77,21,1,3,5},array2[3]={1,3,5}; int len1=5,len2=3; compare_array(len1,array1,len2,array2); } 5、约瑟夫问题 • 问题描述: 输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数列首位置开始 计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直 到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。请编程实现上述计数过程,同时 输出数值出列的顺序 比如: 输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置) 第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从数值4所在位置从新开始计数 第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数 第三轮计数出列数字为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数 最后一轮计数出列数字为4,计数过程完成。 输出数值出列顺序为:2,3,1,4。 • 要求实现函数: void array_iterate(int len, int input_array[], int m, int output_array[]) 【输入】 int len:输入数列的长度; int intput_array[]:输入的初始数列 int m:初始计数值 【输出】 int output_array[]:输出的数值出列顺序 【返回】 无 • 示例 输入:int input_array[] = {3,1,2,4},int len = 4, m=7 输出:output_array[] = {2,3,1,4} ////////////循环链表实现////////////////////// #include #include #include typedef struct Node { int num; struct Node *next; //结构体定义时注意大小写一致 } node; node *creat(int len , int input_array[]) { node *h,*s,*p; int i; h=(node*)malloc(sizeof(node)); h->num=input_array[0]; p=h; for(i=1;i { s=(node*)malloc(sizeof(node)); s->num=input_array[i]; p->next=s; p=s; } p->next=h; return (h); } void array_iterate(int len, int input_array[], int m, int output_array) { node *q,*p,*s; int i=0,j=0,k; p=creat(len,input_array); while(p->next!=p) { for(i=1;i { q=p; p=p->next; } m=p->num; printf("%5d",m); output_array[j++]=m; s=p; q->next=p->next; p=p->next; free(s); s=NULL; } m=p->num; printf("%5dn",m); output_array[j]=p->num; k=j; // for(j=0 ; j<=k; j++) // { printf("%5d",output_array[j]);} } int main() { int input_array[]={3,1,2,4}; int len=4; int m=7; int output_array[4]; array_iterate(len, input_array, m, output_array); } 6、 手机号码合法性判断(20分) 问题描述: 我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:86。特点如下: 1、 长度13位; 2、 以86的国家码打头; 3、 手机号码的每一位都是数字。 请实现手机号码合法性判断的函数要求: 1) 如果手机号码合法,返回0; 2) 如果手机号码长度不合法,返回1 3) 如果手机号码中包含非数字的字符,返回2; 4) 如果手机号码不是以86打头的,返回3; 【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1 即可,不需要再做其他合法性判断。 要求实现函数: int verifyMsisdn(char* inMsisdn) 【输入】 char* inMsisdn,表示输入的手机号码字符串。 【输出】 无 【返回】 判断的结果,类型为int。 示例 输入: inMsisdn = “869123456789“ 输出: 无 返回: 1 输入: inMsisdn = “889“ 输出: 无 返回: 3 输入: inMsisdn = “869“ 输出: 无 返回: 0 #include #include #include #include #define LENGTH 13 int verifyMsisdn(char *inMsisdn) { char *pchar=NULL; assert(inMsisdn!=NULL); if(LENGTH==strlen(inMsisdn)) { if(('8'==*inMsisdn)&&(*(inMsisdn+1)=='6')) { while(*inMsisdn!='0') { if((*inMsisdn>='0')&&(*inMsisdn<='9')) inMsisdn++; else return 2 ; } } else return 3; } else return 1; return 0; } int main() { char *pchar=NULL; unsigned char ichar=0; int result; switch(ichar) { case 0: pchar="86";break; case 1: pchar="8611";break; case 2: pchar="86s1234536366"; break; default: break; } result =verifyMsisdn(pchar); printf("result is %dn",result); } ???多看7、简单四则运算 问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的 值 注: 1、表达式只含 +, -, *, / 四则运算符,不含括号 2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况 3、要考虑加减乘除按通常四则运算规定的 计算优先级 4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生 5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字 符,不会出现计算溢出情况 • 要求实现函数: int calculate(int len,char *expStr) 【输入】 int len: 字符串长度; char *expStr: 表达式字符串; 【输出】 无 【返回】 计算结果 • 示例 1) 输入:char *expStr = “1+4*5-8/3” 返回:19 2) 输入:char *expStr = “8/3*3” 函数返回:6 #include using namespace std; int calculate(int len,char *expStr) { struct { char opdata[200]; int top; }opstack; //定义操作符栈 = -1; int i=0;//遍历字符串的下标 int t=0;//当前后缀表达式的长度 char ch = expStr[i]; while (ch!='0') { switch (ch) { case '+': case '-': while ( != -1) { expStr[t] = []; --; t++; } ++; [] = ch; break; case '*': case '/': while ( != -1 && ([] =='*' || [] =='/') ) { expStr[t] = []; --; t++; } ++; [] = ch; break; default: expStr[t] = ch; t++; break; } i++; ch = expStr[i]; } while ( != -1)//将栈中所有的剩余的运算符出栈 { expStr[t] = []; --; t++; } expStr[t]='0'; struct { int numeric[200]; int top; }data; = -1; i=0; ch = expStr[i]; while (ch!='0') { if (ch>='0' && ch <= '9' ) { ++; c[] = ch-'0'; } else if('+' == ch) { int tmp = c[-1]+c [da ]; --; c[] = tmp; } else if('-' == ch) { int tmp = c[-1]-c [da ]; --; c[] = tmp; } else if('*' == ch) { int tmp = c[-1]*c [da ]; --; c[] = tmp; } else if('/' == ch) { if(c[] == 0) { printf("cannot be zero of the dividen"); exit(1); } int tmp = c[-1]/c [da ]; --; c[] = tmp; } i++; ch = expStr[i]; } return c[]; } void main() { char expStr[] = "8/3*3"; printf("%s = ",expStr); int result = calculate(strlen(expStr),expStr); printf("%dn",result); } 8、选秀节目打分,分为专家评委和大众评委,score[] 数组里面存储每个评委打的分数,judge_type[] 里存储与 score[] 数组对应的评委类别,judge_type[i] == 1,表示专家评委,judge_type[i] == 2,表示大众评委,n表 示评委总数。打分规则如下:专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分 = 专家 评委平均分 * 0.6 + 大众评委 * 0.4,总分取整。如果没有大众评委,则 总分 = 专家评委平均分,总分取整。 函数最终返回选手得分。 函数接口 int cal_score(int score[], int judge_type[], int n) #include #include #include #include #define N 5 int cal_score(int score[], int judge_type[], int n) { int expert=0; int dazhong=0; int zongfen=0; int i; int number=0; for(i=0;i { if(judge_type[i]==1) { expert=expert+score[i]; number++; } else dazhong=dazhong+score[i]; } if(number==N) { zongfen=(int)(expert/N); } Else { expert=(int)(expert/number); dazhong=(int)(dazhong/(N-number)); zongfen=int(0.6*expert+0.4*dazhong); } return zongfen; } int main() { int score[N]; int judge_type[N]; int numberlast=0; int i; printf("please input the %d score:n",N); for(i=0;i scanf("%d",&score[i]); printf("please input the level(1:expert,2:dazhong)n "); for(i=0;i scanf("%d",&judge_type[i]); numberlast=cal_score(score,judge_type,N); score is %dn",numberlast); return 0; } #include #include #include #include using namespace std; #define N 5 int cal_score(int score[],int judge_type[],int n); int main() { int score[N] = {99,95,93,87,80}; int judge_type[N] = {2,1,2,1,1}; cal_score(score,judge_type,N); return 0; } int cal_score(int score[],int judge_type[],int n) { int sum = 0; int aver1 = 0,aver2 = 0; int j = 0,k = 0; for(int i = 0;i < n;i++) { printf("the last if(judge_type[i] == 1) { aver1 += score[i]; j++; } else if(judge_type[i] == 2) { aver2 += score[i]; k++; } } aver1 = aver1 /j; aver2 = aver2 /k; sum = aver1 * 0.6 + aver2 * 0.4; printf("%d %d %dn",aver1,aver2,sum); return sum; } 9、给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组最中间的位置, 如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上,然后再按从 大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。 Eg:input[] = {3, 6, 1, 9, 7},output[] = {3, 7, 9, 6, 1}; input[] = {3, 6, 1, 9, 7, 8} output[] = {1, 6, 8, 9, 7, 3} #include #include #include void sort(int input[], int n, int output[]) { int i,j; int k=1; int temp; int med; for(i=0;i for(j=0;j if(input[j]>input[j+1]) {temp=input[j];input[j]=input[j+1];input[j+1]=temp;} if(n%2!=0) { for(i=0;i printf("%2d",input[i]); printf("n"); med=(n-1)/2; output[med]=input[n-1]; for(i=1;i<=med;i++) { output[med-i]=input[n-1-k]; output[med+i]=input[n-2-k]; k=k+2; } } else { for(i=0;i printf("%2d",input[i]); printf("n"); med=n/2; output[med]=input[n-1]; for(i=1;i<=med-1;i++) { output[med-i]=input[n-1-k]; output[med+i]=input[n-2-k]; k=k+2; } output[0]=input[0]; } for(i=0;i printf("%2d",output[i]); printf("n"); } int main() { int a[6]={3,6,1,9,7,8}; int b[6]={0}; for(int i=0;i<6;i++) printf("%2d",a[i]); printf("n"); sort(a,6,b); return 0; } #include #include #include void sort(int input[],int n,int output[]); int main() { int input[] = {3,6,1,9,7,8}; int output[6]; //长度根据输入数组的长度改变 int len = 0; len = sizeof(input)/sizeof(int); for(int i = 0;i < len;i++) printf("%d ",input[i]); printf("n"); sort(input,len,output); return 0; } void sort(int input[],int n,int output[]) { int i = 0,j = 0; int tmp = input[0]; for(i = 0;i < n - 1;i++) for(j = i + 1;j < n;j++) { if(input[i] < input[j]) { tmp = input[i];input[i] = input[j];input[j] = tmp; } } for(int i = 0;i < n;i++) printf("%d ",input[i]); printf("n"); if(n % 2 == 0) { for(i = 0;i < n;i++) { if(i % 2 == 0) output[n/2 + i/2] = input[i]; else if(i % 2 == 1) output[n/2 - (i+1)/2] = input[i]; } } else if(n % 2 == 1) { for(i = 0;i < n;i++) { if(i % 2 == 0) output[(n-1)/2 + i/2] = input[i]; else if(i % 2 == 1) output[(n-1)/2 - (i+1)/2] = input[i]; } } for(int i = 0;i < n;i++) printf("%d ",output[i]); printf("n"); } 10、操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 < 50,用户 任务的优先级 >= 50且 <= 255。优先级大于255的为非法任务,应予以剔除。现有一任务队列task[],长度为n, task中的元素值表示任务的优先级,数值越小,优先级越高。函数scheduler实现如下功能,将task[] 中的任务 按照系统任务、用户任务依次存放到 system_task[] 数组和 user_task[] 数组中(数组中元素的值是任务在task[] 数组中的下标),并且优先级高的任务排在前面,数组元素为-1表示结束。 例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99} system_task[] = {0, 3, 1, 7, -1} user_task[] = {4, 8, 2, 6, -1} 函数接口void scheduler(int task[], int n, int system_task[], int user_task[]) #include #include #include #include void scheduler1(int task[], int n, int system_task[], int user_task[]) { int i; int j=0; int *p,*pp,*p_user,*pp_user; int index=0; int count,count2; int min=0; int k=0; p=(int*)malloc(sizeof(int)*n); for(i=0;i p[i]=0; pp=(int*)malloc(sizeof(int)*n); for(i=0;i pp[i]=0; p_user=(int*)malloc(sizeof(int)*n); for(i=0;i p_user[i]=0; pp_user=(int*)malloc(sizeof(int)*n); for(i=0;i pp_user[i]=0; for(i=0;i { if(task[i]<50) { { system_task[j]=task[i]; pp[j]=i; j++; } count=j; } else if(task[i]<=255) { { user_task[k]=task[i]; pp_user[k]=i; k++; } count2=k; } else task[i]=task[i]; } for(i=0;i printf("%3d",system_task[i]); printf("n"); for(i=0;i { min=system_task[0]; for(j=1;j { if(system_task[j] { min=system_task[j]; p[i]=j; } } system_task[p[i]]=51; } pp[count]=-1; for(i=0;i printf("%3d",pp[p[i]]); printf("%3dn",pp[count]); /***********************************************/ for(i=0;i printf("%4d",user_task[i]); printf("n"); for(i=0;i { min=user_task[0]; for(j=1;j { if(user_task[j] { min=user_task[j]; p_user[i]=j; } } user_task[p_user[i]]=256; } pp_user[count2]=-1; for(i=0;i printf("%4d",pp_user[p_user[i]]); printf("%3dn",pp_user[count2]); } int main() { int task[9]={0, 30, 155, 1, 80, 300,170, 40, 99}; int system_task[9]={0}; int user_task[9]={0}; scheduler1(task,9,system_task,user_task); return 0; } #include #include #include void scheduler(int task[],int n,int system_task[],int user_task[]); int main() { int task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99}; int system_task[9]; int user_task[9]; int n = 9; scheduler(task,n,system_task,user_task); return 0; } void scheduler(int task[],int n,int system_task[],int user_task[]) { int i = 0; int j = 0,k = 0; int len1 = 0,len2 = 0; int tmp = 0; for(i = 0;i < n;i++) { if(task[i] < 50) { system_task[j++] = i; len1 = j; } else if(task[i] >= 50 && task[i] <= 255) { user_task[k++] = i; len2 = k; } } for(i = 0;i < len1 - 1;i++) for(j = i + 1;j < len1;j++) { if(task[system_task[i]] > task[system_task[j]]) { tmp = system_task[i]; system_task[i] = system_task[j]; system_task[j] = tmp; } } system_task[len1] = -1; for(i = 0;i < len1 - 1;i++) for(j = i + 1;j < len1;j++) { if(task[user_task[i]] > task[user_task[j]]) { tmp = user_task[i]; user_task[i] = user_task[j]; user_task[j] = tmp; } } user_task[len2] = -1; for(i = 0;i < len1 + 1;i++) { printf("%d ",system_task[i]); } printf("n"); for(i = 0;i < len2 + 1;i++) { printf("%d ",user_task[i]); } } 11、输入一个字符串,用指针求出字符串的长度。 #include int main() { char str[20], *p; int length=0; printf(“Please input a string: ”); gets(str); p=str; while(*p++) { length++; } printf(“The length of string is %dn”, length); return 0; } 12、使用C语言实现字符串中子字符串的替换 描述:编写一个字符串替换函数,如函数名为 StrReplace(char* strSrc, char* strFind, char* strReplace), strSrc为原字符串,strFind是待替换的字符串,strReplace为替换字符串。 举个直观的例子吧,如:“ABCDEFGHIJKLMNOPQRSTUVWXYZ”这个字符串,把其中的“RST”替换为“ggg”这个字符 串,结果就变成了: ABCDEFGHIJKLMNOPQgggUVWXYZ 答案一: #include #include void StrReplace(char* strSrc, char* strFind, char* strReplace); #define M 100; void main() {char s[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char s1[]="RST"; char s2[]="ggg"; StrReplace(s,s1,s2); printf("%sn",s); } void StrReplace(char* strSrc, char* strFind, char* strReplace) { int i=0; int j; int n=strlen(strSrc); int k=strlen(strFind); for(i=0;i { if(*(strSrc+i)==*strFind) { for(j=0;j { if(*(strSrc+i+j)==*(strFind+j)) *(strSrc+i+j)=*(strReplace+j); else continue; } } } } 答案二: #include #define MAX 100 Void StrReplace(char *s, char *s1, char *s2) { char *p; for(; *s; s++) { for(p = s1; *p && *p != *s; p++); if(*p) *s = *(p - s1 + s2); } } //perfect !! int main() { char s[MAX]; //s是原字符串 char s1[MAX], s2[MAX]; //s1是要替换的 //s2是替换字符串 puts("Please input the string for s:"); scanf("%s", s); puts("Please input the string for s1:"); scanf("%s", s1); puts("Please input the string for s2:"); scanf("%s", s2); StrReplace(s, s1, s2); puts("The string of s after displace is:"); printf("%sn", s); return 0; } 答案三: #include #include #include #define M 100 void StrReplace(char* strSrc, char* strFind, char* strReplace); int main() { char s[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char s1[]="RST"; char s2[]="ggg"; StrReplace(s,s1,s2); printf("%sn",s); return 0; } void StrReplace(char* strSrc, char* strFind, char* strReplace) { while(*strSrc != '0') { if(*strSrc == *strFind) { if(strncmp(strSrc,strFind,strlen(strFind)) == 0 ) { int i = strlen(strFind); int j = strlen(strReplace); printf("i = %d,j = %dn",i,j); char *q = strSrc + i; printf("*q = %sn",q); //while((*strSrc++ = *strReplace++) != '0');替换为: for(int k = 0;k < j;k++) { *(strSrc+k) = *(strReplace+k); } for(int k = 0;k < j;k++) { *strSrc++; } printf("strSrc - 1 = %sn",strSrc-1 ); printf("*q = %sn",q); //while((*strSrc++ = *q++) != '0');该句删除 } else strSrc++; } else strSrc++; } } 13、编写一个程序实现功能:将字符串”Computer Secience”赋给一个字符数组,然后从第一个字母开始间隔的 输出该串,用指针完成。 答案: #include #include int main() { char str[]=”Computer Science”; int flag=1; char *p=str; while(*p) { if ( flag ) { printf(“%c”,*p); } flag = (flag + 1) % 2; p++; } printf(“n”); return 0; } #include #include #include int main() { char str[] = "Computer Secience"; char *p = str; while(*(p - 1)) { printf("%c",*p++); p++; } printf("n"); return 0; } 14、编写一个程序实现功能:将两个字符串合并为一个字符串并且输出,用指针实现。 char str1[20]={“Hello ”}, str2[20]={“World ”}; 答案: #include int main() { char str1[20]={“Hello ”}, str2[20]={“World ”}; char *p=str1, *q=str2; while( *p ) p++; while( *q ) { *p = *q; p++; q++; } *p = ‘0’; //注意字符串结尾的标志 printf(“%sn”, str1); return 0; } 15、算分数的问题,去掉一个最高分一个最低分,求平均分 #include float avescore(float score[],int n) { float min=0; float max=0; int minindex=0; int maxindex=0; float sum=0; min=score[0]; for(int i=0;i if(score[i] { min=score[i]; minindex=i; } score[minindex]=0; max=score[0]; for(i=0;i if(score[i]>max) { max=score[i]; maxindex=i; } score[maxindex]=0; for(i=0;i sum+=score[i]; sum=sum/(n-2); return sum; } void main() { float score[6]={70,80,90,98,87,86}; float lastscore; lastscore=avescore(score,6); printf("the last score is :%5.2fn",lastscore); } 运行结果:the last score is :85.75 #include #include #include #define M 6 float aver(float *score,int n); int main() { float score[M] = {70,80,90,98,87,86};//{9,8,7,6,8,9,7,8,9,10}; printf("%fn",aver(score,M)); return 0; } float aver(float score[],int n) { float max = score[0],min = score[0]; for(int i = 1;i < n;i++) if(max <= score[i]) max = score[i]; for(int i = 1;i < n;i++) if(score[i] <= min) min = score[i]; float aver = 0; for(int i = 0;i < n;i++) aver += score[i]; aver = aver - max - min; aver /= n - 2; return aver; } 16、对一个数组,将数组中偶数从大到小排序,奇数从小到大排序,奇数和偶数交叉着放且输出数组第一位放奇 数 若奇数和偶数不等长,则把剩下的直接放到数组中。 思路:先进行奇偶判断,得到奇数和偶数数组。然后对两数组排序,进行长度判断,最后组织数据。 #include #include void jiou(int a[],int n) { int *p1; int *p2; int i,j; int k=0; int kk=0; int count1=0; int count2=0; int temp; int temp2; int m=0; p1=(int*)malloc(sizeof(int)*n); p2=(int*)malloc(sizeof(int)*n); for(i=0;i { p1[i]=0; p2[i]=0; } for(i=0;i { if((a[i]%2)!=0) {p2[kk++]=a[i];} else {p1[k++]=a[i];} } count1=k; count2=kk; for(i=0;i printf("%3d",p2[i]); printf("n"); for(i=0;i for(j=0;j if(p2[j]>p2[j+1]) {temp2=p2[j];p2[j]=p2[j+1];p2[j+1]=temp2;} for(i=0;i printf("%3d",p2[i]); printf("n"); for(i=0;i printf("%3d",p1[i]); printf("n"); for(j=0;j if(p1[j] {temp=p1[j];p1[j]=p1[j+1];p1[j+1]=temp;} for(i=0;i printf("%3d",p1[i]); printf("n"); if(count1>count2) { for(i=0;i { a[i+m]=p2[i]; a[i+1+m]=p1[i]; m=m+1; } for(i=0;i a[2*count2+i]=p1[i+count2]; } else { for(i=0;i { a[i+m]=p2[i]; a[i+1+m]=p1[i]; m=m+1; } for(i=0;i a[2*count1+i]=p2[i+count1]; } for(i=0;i for(i=0;i printf("%3d",a[i]); printf("%n"); } void main() { int a[10]={2,3,14,6,2,15,12,14,4,11}; jiou(a,10); } 运行结果: 3 15 11 3 11 15 2 14 6 2 12 14 4 14 14 12 6 4 2 2 3 14 11 14 15 12 6 4 2 2 #include #include #define M 10 void sort(int arr[],int n); int main() { int arr[M] = {7,3,14,6,5,15,12,1,4,11}; sort(arr,M); return 0; } void sort(int arr[],int n) { int *odd,*even; odd = (int *)malloc(sizeof(int) * n); even = (int *)malloc(sizeof(int) * n); int len1 = 0,len2 = 0; int j = 0,k = 0; for(int i = 0;i < n;i++) { if(arr[i] % 2 != 0) odd[len2++] = arr[i]; else even[len1++] = arr[i]; } printf("%d %dn",len1,len2); //len1是数组even的长度¨,len2是odd的长度 for(j = 0;j < len1 - 1;j++) for(k = j + 1;k < len1 ;k++) { if( even[j] <= even[k]) { int tmp = even[j];even[j] = even[k];even[k] = tmp; } } for(j = 0;j < len2 - 1;j++) for(k = j + 1;k < len2 ;k++) { if( odd[j] >= odd[k]) { int tmp = odd[j];odd[j] = odd[k]; odd[k] = tmp; } } for(int i = 0;i < len1;i++) printf("%d,",even[i]); printf("n"); for(int i = 0;i < len2;i++) printf("%d,",odd[i]); printf("n"); //len1是数组even的长度¨, len2是odd的长度 if(len1 <= len2) { for(int j = 0;j < len1;j++) { arr[2*j] = odd[j]; //注意数组的存储方式,尤其是剩余段起始下标的选取 arr[2*j+1] = even[j]; } for(int j = len1,k = 2 * j;k < n,j < len2;j++) { arr[k++] = odd[j]; } } else { for(int j = 0;j < len2;j++) { arr[2*j] = odd[j]; arr[2*j+1] = even[j]; } for(int j = len2,k = 2 * j;k < n,j < len1;j++) { arr[k++] = even[j]; } } for(int i = 0;i < n;i++) printf("%d,",arr[i]); } 1、如何从一个字符串中找出整数并将其以数字的形式输出; 2、如何做IP地址匹配,给出一个IP地址1和子网掩码,然后再给一个IP地址2,判断IP地址1和IP地址2是 不是同一个子网。 【2013】 题目描述: 通过键盘输入任意一个字符串序列,字符串可能包含多个子串,子串以空格分隔。请编写一个程序,自 动分离出各个子串,并使用’,’将其分隔,并且在最后也补充一个’,’并将子串存储。 如果输入“abc def gh i d”,结果将是abc,def,gh,i,d, 要求实现函数: void DivideString(const char *pInputStr, long lInputLen, char *pOutputStr); 【输入】 pInputStr: 输入字符串 lInputLen: 输入字符串长度 【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长; 【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出 示例 输入:“abc def gh i d” 输出:“abc,def,gh,i,d,” long j = 0; for(long i=0;i { if(pInputStr[i]!=’ ’) { pOutputStr[j]= pInputStr[i]; j++; } else { If(pOutputStr[j-1] != ’,’) { pOutputStr[j]=’,’; j++; } } } C_C++_CY_01. 逆序链表输出。 题目描述: 将输入的一个单向链表,逆序后输出链表中的值。链表定义如下: typedef struct tagListNode { int value; struct tagListNode *next; }ListNode; 要求实现函数: void converse(ListNode **head); 【输入】head: 链表头节点,空间已经开辟好 【输出】head: 逆序后的链表头节点 【返回】无 【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出 示例 输入:链表 1->2->3->4->5 的头节点head 输出:链表 5->4->3->2->1 的头节点head { ListNode *p = new ListNode; ListNode *q = new ListNode; ListNode *t = new ListNode; p = *head; q = p ->next; t = NULL; while(q != NULL) { t =q->next; q->next = p; p = q; q = t; } *head = q; delete p; delete q; delete t; } 【2014】 1.第一题的题目大概是输入整型数组求数组的最小数和最大数之和,例如输入1,2,3,4则输出为5,当输入只有一 个数的时候,则最小数和最大数都是该数,例如只输入1,则输出为2;另外数组的长度不超过50 #include { int min_num=num[0]; int num[50]={0}; int max_num=num[0]; int i,n; for(int j=0;j { printf("请输入整型数组的长度(1~50):"); if(max_num scanf("%d",&n); max_num=num[j]; else if(min_num>num[j]) printf("请输入整型数组的元素:"); min_num=num[j]; for (i=0;i { int sum=min_num+max_num; scanf("%d",&num[i]); printf("数组中最大与最小值之和:%dn",sum); } return 0; } 2.求两个长长整型的数据的和并输出,例如输入33333 。。。 311.。。。,则输 出。。。。 #include #include #include main() len_num1--; { } char *num1,*num2; //两个长长整型数据 if(len_num2>0) char *sum; { // int temp; sum[len_max--]=num1[len_num2 - 1]-'0'; int len_num1,len_num2; // 两个长长整型数据的长度 len_num2--; int len_max,len_min; } num1=(char*)malloc(sizeof(char)); for(int j=len_max1;j>=0;j--) //实现进位操作 num2=(char*)malloc(sizeof(char)); { printf("输入两个长长整型数据:"); // temp=sum[j]-'0'; scanf("%s",num1); if(sum[j]>=10) printf("输入两个长长整型数据:"); { scanf("%s",num2); sum[j-1]+=sum[j]/10; len_num1=strlen(num1); sum[j]%=10; len_num2=strlen(num2); } len_max=(len_num1>=len_num2)? } len_num1:len_num2; char len_min=(len_num1<=len_num2)? *outsum=(char*)malloc(sizeof(char)*len_max1); len_num1:len_num2; j=0; int len_max1=len_max; while(sum[j]==0) //跳出头部0元素 sum=(char*)malloc(sizeof(char)*len_max); j++; memset(sum,0x00,len_max+1);//切忌初始化 for(int m=0;m for(;len_num1>0&&len_num2>0;len_num1--,len_ outsum[m]=sum[j]+'0'; num2--) outsum[m]='0'; { printf("输出两长长整型数据之 sum[len_max--]=((num1[len_num1-1]-'0')+(num和:%sn",outsum); 2[len_num2-1]-'0')); return 0; } } 3.通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符, 将非首次出现的字符过滤掉。 比如字符串“abacacde”过滤结果为“abcde”。 要求实现函数: void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr); 【输入】 pInputStr: 输入字符串 lInputLen: 输入字符串长度 【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长; #include #include #include void stringFilter(const char *p_str, long len, char *p_outstr) { int array[256]={0}; const char *tmp = p_str; for(int j=0;j { if(array[tmp[j]]==0) *p_outstr++= tmp[j]; array[tmp[j]]++; } *p_outstr = '0'; } void main() { char *str = "cccddecc"; int len = strlen(str); char * outstr = (char *)malloc(len*sizeof(char)); stringFilter(str,len,outstr); printf("%sn",outstr); free(outstr); outstr = NULL; } 4.通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母 进行压缩,并输出压缩后的字符串。 压缩规则: 1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc". 2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz" 要求实现函数: void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr); 【输入】 pInputStr: 输入字符串 lInputLen: 输入字符串长度 【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长; #include #include
发布评论