今天在华赛笔试,倒真被鄙视了,笔试试卷(成都)

wickboycn 2009-02-20 05:06:32
发上来,共同探讨下,基础不扎实,代码写得乱七八糟,自己还要学的东西很多




C语言实现

题一:给出一个函数,原型为 int compare(char* dest,char* src)
要求比较两个字符串(由dest与src字符指针标识)
1,如果两字符串所含字母完全相同,则返回0;
2,如果两字符串所含字母相同(不区分大小写;A与a也算字母相同) ,则返回1
3,否则返回3


题二:有一文件abc.in 里面有m(m<2000)行字符串;
在每行字符串中,数字字符('0'-'9')总数最多不超过25个,且彼此之间用空格字符相隔;
设一值k(k<26),求出本文件中第k列数字字符的平均值,与他们的最大(小)值
注:若某行数字字符的数目小于k,则将此行其余数字字符为视为0
...全文
7056 158 打赏 收藏 转发到动态 举报
写回复
用AI写文章
158 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhongmiao07262 2011-10-30
  • 打赏
  • 举报
回复
124868260 这是华赛2012即将入职人员的群号! 如果是即将入职欢迎加入哈
you19891003 2011-09-08
  • 打赏
  • 举报
回复
/*
题二:有一文件abc.in 里面有m(m<2000)行字符串;
在每行字符串中,数字字符('0'-'9')总数最多不超过25个,且彼此之间用空格字符相隔;
设一值k(k<26),求出本文件中第k列数字字符的平均值,与他们的最大(小)值
注:若某行数字字符的数目小于k,则将此行其余数字字符为视为0
*/
# include "stdafx.h"
# include <stdio.h>
# include <string.h>
# include <ctype.h>
# define M 2000

char num[M];
char str[200];
char temp[25];
int now=0;//当前位置
int k;

void getdata()
{
puts(str);
int len=strlen(str);
int i,j;
i=j=0;
for(i=0;i<len;i++)
{
if(isdigit(str[i]))
{
if(j==k)
{
num[now++]=str[i];
return ;
}
j++;
}
}
if(j<=k)
{
num[now++]='0';
}
}
void show()
{
int i;
int sum=0;
int Max,Min;
Max=Min=num[0];
for(i=0;i<now;i++)
{
sum+=num[i];
if(Max<num[i]) Max=num[i];
if(Min>num[i]) Min=num[i];
printf("%c ",num[i]);
if(i%5==4) printf("\n");
}
printf("\nAverger:%c\n",sum/now);//
printf("Max:%c\n",Max);
printf("Min:%c\n",Min);
}
void main()
{
//open file
FILE * fp;
fp=fopen("abc.in","r");
if(fp==NULL)
{
printf("open file error!\n");
return ;
}

printf("INPUT (k):");
scanf("%d",&k);
k--;//转化为数组下标
getchar();

memset(str,0,200);
while(!feof(fp))
{
memset(str,0,200);
fgets(str,200,fp);
if(*str==0) break;//还会再读取一个空的字符串
getdata();
}
show();
fclose(fp);
}
you19891003 2011-09-08
  • 打赏
  • 举报
回复
int compare(char * dest,char * src)
{
if(strcmp(dest,src)==0)
{
return 0;
}
while(*dest!='\0'&&*src!='\0')
{
if(tolower(*dest++)!=tolower(*src++))
{
return 3;
}
}
if(*dest=='\0'&&*src=='\0')
{
return 1;
}
else
{
return 3;
}
}
孤独小剑 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cjiajiailoveu 的回复:]

int strcmp(char *s1,char *s2)
{
int a=0;
do{

if(*s1 != *s2 && abs(*s1-*s2)!=32 ) return 3;
if(abs(*s1-*s2)=32)
{
a=1;
}
s1++;s2++;
}
while((*s1!='\0'&&*s2!='\0'));……
[/Quote]
笼统地用abs后判断是否和32相等,是可能出问题的,不可见字符也是字符。
querdaizhi 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 148 楼 qq120848369 的回复:]

C/C++ code
#include <stdlib.h>
#include <stdio.h>

#define ToLower(x) ( x&(~0x20) )
#define IsLetter(x) ( 'a' <= x && x <='z' || 'A' <= x && x <= 'Z' )

in……
[/Quote]

没说里面的字符就是从a-z,A-Z吧。
querdaizhi 2011-09-08
  • 打赏
  • 举报
回复
我第一题的想法是打两张字符表,把dest里面的字符添加到表中,如果表中有一样的字符,则这个字符的出现的次数+1。src用同样的方法处理一遍。最后做一遍比较就行了。

字符表用结构体
typedef struct
{
char t; // 用来保存dest,src里面出现的字符
int num; //用来保存对应字符出现的次数
}word;
yeluowuhen069 2011-03-29
  • 打赏
  • 举报
回复

int compare(char *dest,char *src)
{
int ans=0;
int i=0;
int slen=0;
int temp=0;
if(strlen(dest)!=strlen(src))
return 3;
while(dest[i]!='\0')
{
if(fabs(dest[i]-src[i])==32)
ans=1;
else if(dest[i]!=src[i])
return 3;
i++;
}
if(ans==0) //逆序
{
slen=strlen(dest);
i=0;
while(i<=slen/2)
{
temp=dest[i];
dest[i]=dest[slen-i-1];
dest[slen-i-1]=temp;
i++;
}
printf("%s\n",dest);
}
return ans;
}
qq120848369 2011-01-25
  • 打赏
  • 举报
回复
第二题也是很简单的,fgets获取一行,由于每个数字都是单独的'0'~'9',所以只要写一个函数顺序扫描这一行,遇到数字就存起来就可以了,能填到哪一列就哪一列,其他剩下的都是0.

像这种面试题,用库函数肯定没有自己写效果好,最好能把功能都独立成一些小函数,并且带上简明扼要的注释,肯定是加分的.
qq120848369 2011-01-25
  • 打赏
  • 举报
回复
额,第一题是所含字母相同,那只能先把str1和str2都转化成小写,之后排序,顺序比较一次即可.
qq120848369 2011-01-25
  • 打赏
  • 举报
回复
#include <stdlib.h>
#include <stdio.h>

#define ToLower(x) ( x&(~0x20) )
#define IsLetter(x) ( 'a'<= x && x <='z' || 'A' <= x && x <= 'Z' )

int compare(char *dest,char *src)
{
if(dest==NULL || src==NULL) //字符串非法
{
abort();
}

if(dest == src) //同一字符串
{
return 0;
}

char *first=dest,*second=src;
bool hasChanged=false;

while(*first!=0 && *second!=0)
{
if(IsLetter(*first) && IsLetter(*second))
{
if(*first == *second)
{
++first,++second;
}
else if(ToLower(*first) == ToLower(*second))
{
++first,++second;
hasChanged=true;
}
else
{
return 3;
}
}
else
{
if(*first == *second)
{
++first,++second;
}
else
{
return 3;
}
}
}

if(*first == 0 && *second == 0)
{
if(hasChanged)
{
return 1;
}

--first,--second;

while(dest <= first)
{
char temp=*dest;
*dest=*src=*first;
*first=*second=temp;
++dest,++src,--first,--second;
}

return 0;
}
else
{
return 3;
}
}

int main()
{
char str1[]="abcd",str2[]="abcd";

printf("%d\n%s\n%s\n",compare(str1,str2),str1,str2);

return 0;
}


个人感觉第一题就随便写一下就可以。
bluepei28 2011-01-25
  • 打赏
  • 举报
回复

#include<stdio.h>
#include<string.h>
int compare(char *dest, char *scr);

int main(char agrv[], char *agg)
{

char *str1 = "strInG";
char *str2 = "sTring";
printf("*** %d ****", compare(str1, str2));

return 0;
}


int compare(char *dest, char *scr)
{

if(strcmp(dest, scr) == 0)
{


return 0;
}
else
{
if(strlen(dest) == strlen(scr))
{


while(*dest++)
{
scr++;
if(*dest > 96)
{
if((*dest == *scr)||(*dest == *scr + 32))
{

;
}
else
{
return 3;

}

}
else
{
if((*dest == *scr)||(*dest == *scr - 32))
{

;
}
else
{
return 3;

}

}


}

return 1;
#if 0
if(1)
{
return 1;
}
else
{
return 3;

}
#endif
}
else
{

return 3;

}

}



}
bluepei28 2011-01-25
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<string.h>
int compare(char *dest, char *scr);
int main(char agrv[], char *agg)
{
char *str1 = "strInG";
char *str2 = "sTring";
printf("*** %d ****", compare(str1, str2));
return 0;
}

int compare(char *dest, char *scr)
{
if(strcmp(dest, scr) == 0)
{

return 0;
}
else
{
if(strlen(dest) == strlen(scr))
{
while(*dest++)
{
scr++;
if(*dest > 96)
{
if((*dest == *scr)||(*dest == *scr + 32))
{

;
}
else
{
return 3;

}
}
else
{
if((*dest == *scr)||(*dest == *scr - 32))
{
;
}
else
{
return 3;
}
}
}
return 1;
}
else
{
return 3;

}
}

}

这个验证通过,不支持数字哦,支持单纯的字母
we_sky2008 2011-01-21
  • 打赏
  • 举报
回复

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

int compare(const char *src1, const char *src2)
{
unsigned char tab1[256] = {0};
unsigned char tab2[256] = {0};
int i, cnt = 0;

assert (NULL != src1 && NULL != src2);

while (*src1)
{
++tab1[*src1++];
++cnt;
}
while (*src2)
{
++tab2[*src2++];
--cnt;
}

//如果字符串长度不相等,返回3
if (cnt != 0)
return 3;

for (i = 0; i < 256; i++)
{
if (tab1[i] != tab2[i])
break;
}

//如果完全相同返回0
if (i == 256)
return 0;
else
{
//不是仅由于大小写造成的不同返回3
if (i < 'A')
return 3;
for (; i <= 'Z'; i++)
{
if ((tab1[i] + tab1[i | 0x20]) != (tab2[i] + tab2[i | 0x20]))
return 3;
}
for (; i < 'a'; i++)
{
if (tab1[i] != tab2[i])
return 3;
}
for (; i <= 'z'; i++)
{
if ((tab1[i] + tab1[i & ~0x20]) != (tab2[i] + tab2[i & ~0x20]))
return 3;
}
for (; i < 256; i++)
{
if (tab1[i] != tab2[i])
return 3;
}
return 1;
}
}


int main()
{
char *p1 = "dahxdasdDaa";
char *p2 = "adhdadadAsx";

printf("%d\n", compare(p1, p2));

system("pause");
return 0;
}
elegant87 2011-01-21
  • 打赏
  • 举报
回复

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

#define MAX_SIZE 255

int strlen(char *str);
int compare(char *dest,char *src);

int main()
{
char *dest = (char*)malloc(MAX_SIZE);
char *src = (char*)malloc(MAX_SIZE);
printf("Enter two string\n");
scanf("%s",dest);
scanf("%s",src);
int result = compare(dest,src);
printf("the return value is %d\n",result);
free(dest);
free(src);
return 0;
}

int compare(char *dest,char *src)
{
int destLen = strlen(dest);
int srcLen = strlen(src);
char *d = dest;
char *s = src;
int result = -1;
int count1 = 0;
int count2 = 0;
if(destLen == srcLen)
{
while(*d !='\0' && *s != '\0' )
{
if(*d == *s)
count1++;
if(*d == *s || *d == *s-32 || *d == *s+32)
count2++;
d++;
s++;
}
if(destLen == count1)
result = 0;
if(destLen == count2)
result = 1;
else
result = 3;
}
else
result = 3;
return result;
}

int strlen(char *str)
{
char * temp = str;
while((*temp++ ) != '\0');
return (temp - str -1);
}
bfdeh 2011-01-20
  • 打赏
  • 举报
回复

/*
题一:给出一个函数,原型为 int compare(char* dest,char* src)
要求比较两个字符串(由dest与src字符指针标识)
1,如果两字符串所含字母完全相同,则返回0;
2,如果两字符串所含字母相同(不区分大小写;A与a也算字母相同) ,则返回1
3,否则返回3

PS:
1、手上没编译器,就这么写吧,要是有谁愿意帮忙验证下,我就感激不尽了
2、比较赞成80楼jackyid对题目的理解
3、题目并没有要求字母出现次数相同,所以abc和abcc也应该返回0

*/
int compare(char* dest,char* src)
{
int sdRet_1 = 0;
int sdRet_2 = 0;
unsigned int i = 0;
const unsigned int dArraySize = 256;
char szDestBitmap[dArraySize];
char szSrcBitmap[dArraySize];
char *pszTmpBitmap = NULL;
char *pszTmpStr = NULL;

if(!dest||!src)
{
return -1;//题目没定义这个行为,返回-1吧
}

//保证初始值为0
memset(szDestBitmap, 0, dArraySize);
memset(szSrcBitmap, 0, dArraySize);

//遍历dest和src,建立位图
while(dest[i]&&src[i])
{
szDestBitmap[dest[i]] = 1;
szSrcBitmap[src[i]] = 1;
i++;
}
if(dest[i]==0)
{
pszTmpBitmap = szSrcBitmap;
pszTmpStr = src;
}
else
{
pszTmpBitmap = szDestBitmap;
pszTmpStr = dest;
}
while(pszTmpStr[i])
{
pszTmpBitmap[pszTmpStr[i]] = 1;
i++;
}

//比较位图,只需要比较A-Z和a-z,如果比较结果相同,则直接返回0
sdRet_1 = memcmp(szDestBitmap+'A',szSrcBitmap+'A', 'Z'-'A'+1);
sdRet_2 = memcmp(szDestBitmap+'a',szSrcBitmap+'a', 'z'-'a'+1);
if((sdRet_1==0) && (sdRet_2==0))
{
return 0;
}
else//不同
{
//分别将dest和src的A-Z和a-z合并
for(i=0; i<26; i++)
{
szDestBitmap[i+'A'] = (szDestBitmap[i+'a']||szDestBitmap[i+'A']) ? 1 : 0;
szSrcBitmap[i+'A'] = (szSrcBitmap[i+'a']||szSrcBitmap[i+'A']) ? 1 : 0;
}

//比较合并结果
sdRet_1 = memcmp(szDestBitmap+'A',szSrcBitmap+'A', 'Z'-'A'+1);
if(sdRet_1==0)
{
return 1;
}
else
{
return 3;
}
}

}
z56402344 2011-01-20
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 wickboycn 的回复:]
引用 17 楼 liangkaiyu 的回复:
虽然能实现功能,
但也自知比较烂的一个程序:

C/C++ code#include "stdio.h"
#include "string.h"
#include "math.h"

int compare(char *dest1, char *src1)
{
int i;
int flag = 1;
char des[100……
[/Quote]

for(i = 0; i < (strlen(des) > strlen(sr)? strlen(des):strlen(sr)); i++)

strlen()是判断字符串长度,上面的这个矩形意思是这样 a>b?a:b,a大于b为真的话,a和b中取a,否则取b!
k80179279 2011-01-20
  • 打赏
  • 举报
回复

这次没错了。。

// test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <process.h>
#include <string.h>
#include <math.h>

//题一:给出一个函数,原型为 int compare(char* dest,char* src)
//要求比较两个字符串(由dest与src字符指针标识)
//1,如果两字符串所含字母完全相同,则逆序输出字符串并返回0;
//2,如果两字符串所含字母相同(不区分大小写;A与a也算字母相同) ,则返回1
//3,否则返回3

//字母个数
#define ALPHANUM ('Z'-'A'+1)

//把字符串字母一个一个(重复算一个)按大小对应写入alpha中
//alpha字母排序如:A00000..Zab000...z
//返回值:src的长度
int fetchAlpha(char alpha[ALPHANUM*2],const char *src)
{
int i=0;
memset(alpha,'1',ALPHANUM*2);
for (; src[i] != '\0'; ++i)
{
if((src[i] >='a' && src[i] <='z'))
alpha[ src[i] - 'a' + ALPHANUM] = src[i];
else if((src[i] >='A' && src[i] <='Z'))
alpha[ src[i] - 'A' ] = src[i];
else ;
}
return i;
}

int compare(char *dest, char *src)
{
if(dest == NULL && src == NULL) return 0;
if(dest == NULL || src == NULL) return 3;

char alphaDest[ALPHANUM*2],alphaSrc[ALPHANUM*2];
int len = fetchAlpha(alphaDest,dest);
fetchAlpha(alphaSrc,src);

int count1 = 0;//记数:情况1
int count2 = 0;//记数:情况2
for(int i=0; i<ALPHANUM*2; ++i)
{
if(alphaDest[i] == alphaSrc[i])
++count1;
else if( abs(alphaDest[i] - alphaSrc[(ALPHANUM+i)%(ALPHANUM*2)]) == abs('A'-'a') ) //判断类似fetchAlpha中alpha数组中A与a(B与b...Z与z)的位置内容
++count2;
}

if(count1 == ALPHANUM*2)
{
for(int i=len-1; i>=0; --i) printf("%c",dest[i]);
return 0;
}
else if(count1 + count2*2 == ALPHANUM*2)
return 1;
else
return 3;
}

int _tmain(int argc, _TCHAR* argv[])
{
char *dest[] = {"abcabc","ABC","ABC","ABC","EFS","AZ"}; char *src[] = {"Abc","ABC","ABCD","!BC","EFA","za"};

for(int i=0; i<6; i++)
printf("[%s-%s:%d]\n",dest[i],src[i],compare(dest[i],src[i]));

system("pause");
return 0;
}


执行结果:
[abcabc-Abc:1]
CBA[ABC-ABC:0]
[ABC-ABCD:3]
[ABC-!BC:3]
[EFS-EFA:3]
[AZ-za:1]
k80179279 2011-01-20
  • 打赏
  • 举报
回复
所含字母
k80179279 2011-01-20
  • 打赏
  • 举报
回复

// test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <process.h>

//题一:给出一个函数,原型为 int compare(char* dest,char* src)
//要求比较两个字符串(由dest与src字符指针标识)
//1,如果两字符串所含字母完全相同,则逆序输出字符串并返回0;
//2,如果两字符串所含字母相同(不区分大小写;A与a也算字母相同) ,则返回1
//3,否则返回3

int isAlpha(char ch)
{
if( (ch >= 'a' && ch <='z') ||
(ch >= 'A' && ch <='Z') )
return 1;
else
return 0;
}

int compare(char *dest, char *src)
{
if(dest == NULL && src == NULL) return 0;
if(dest == NULL || src == NULL) return 3;

int i=0,j=0;
int sameA=0,sameB=0;
while(dest[i] != '\0' || src[j] != '\0')
{
if(i != j) break;

if(dest[i] == src[j]) ++sameA;//完全相等的次数
if(dest[i] - src[j] == 'A'-'a' || dest[i] - src[j] == 'a'-'A')
{
if(isAlpha(dest[i]) && isAlpha(src[j]))
++sameB;//字母仅大小写不同的次数
}

if( dest[i] != '\0') ++i;
if( src[j] != '\0') ++j;
}

if(i == j)//两字符串长度相等
{
if(sameA == i)
{
for(--i;i>=0;--i)
printf("%c",dest[i]);
return 0;
}
else if(sameA + sameB == i)//所有对应字母都是完全相等与忽略大小写之间。
return 1;
else
return 3;
}
else
return 3;
}

int _tmain(int argc, _TCHAR* argv[])
{
char *dest[] = {"abc","ABC","ABC","ABC","EFS"}; char *src[] = {"Abc","ABC","ABCD","!BC","EFA"};

for(int i=0; i<5; i++)
printf("[%s-%s:%d]\n",dest[i],src[i],compare(dest[i],src[i]));

system("pause");
return 0;
}


结果:
[abc-Abc:1]
CBA[ABC-ABC:0]
[ABC-ABCD:3]
[ABC-!BC:3]
[EFS-EFA:3]

ps:处理有些麻烦啊。。有无经典的处理???
zps007 2011-01-20
  • 打赏
  • 举报
回复
第一题:俩个字符串顺序不同怎么办?
比如:abcde和bcdea....大家考虑了没?
加载更多回复(133)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧