笔试题练习10道
1 输入一串字符串,其中有普通的字符与括号组成(包括’(’、’)’、’[,]‘),要求验证括号是否匹配,如果匹配则输出0、否则输出1.
#include iostream using namespace std; int verify(char* ch); void main() char* ch = "((([])))[]"; cout verify(ch) endl; int verify(char* ch) char marker[100] = {0}; while (*ch) if (*ch == ( || *ch == [) marker[strlen(marker)] = *ch; else if (*ch == )) if (marker[strlen(marker)-1] == () marker[strlen(marker)-1] = \0; else return 1; else if (*ch == ]) if (marker[strlen(marker)-1] == [) marker[strlen(marker)-1] = \0; else return 1; ch++; if (strlen(marker) == 0) return 0; else return 1; }
2 输入一行数字:123 423 5645 875 186523
在输入第二行:23将第一行中含有第二行中”23″的数输出并排序
结果即:123 423 186523
#include iostream using namespace std; void main() int num[20] = {0}; int sort[20] = {0}; int n; char c = ; int i = 0; int temp; while (c != \n) scanf("%d%c", temp, num[i++] = temp; scanf("%d", int index = 0; for (int j = 0; j j++) temp = num[j]; while (temp = n) if (temp % 100 == n) sort[index++] = num[j]; break; else temp /= 10; for (int k = 0; k index; k++) cout sort[k] endl; }
3 输入m个字符串 和一个整数n, 把字符串M化成以N为单位的段,不足的位数用0补齐。
如 n=8 m=9 , 123456789划分为:12345678 90000000 123化为:12300000#include iostream using namespace std; void main() char ch[20]; cin ch; int n; cin n; char temp[20] = {0}; char* word[10]; int index = 0; for (int i = 0; i strlen(ch); i += n) memcpy(temp,ch+i,n); if (strlen(ch) - i n) int k = 0; while (temp[k] != \0) k++; while (k n) temp[k++] = 0; cout temp endl; }
4 将电话号码 one two 。。。nine zero翻译成1 2 。。9 0,中间会有double
例如 输入:OneTwoThree 输出:123输入:OneTwoDoubleTwo 输出:1222
输入:1Two2 输出:ERROR
输入:DoubleDoubleTwo 输出:ERROR
有空格,非法字符,两个Double相连,Double位于最后一个单词都错误
#include iostream using namespace std; void main() char num[10][6] = {"Zero","One","Two","Three","Four","Five","Six","Seven","Eight","Nine"}; char phone[7]; char c = ; char result[10] = {0}; int countDouble = 0; int index = 0; while (c != \n) scanf("%s%c", phone, for (int i = 0; i i++) if (!strcmp(phone,num[i]) i 10) result[index++] = i + 0; if (countDouble == 1) result[index++] = i + 0; --countDouble; break; else if (!strcmp(phone,"Double")) ++countDouble; if (countDouble 1) cout "Error!" endl; return; break; else cout "Error!" endl; return; if (countDouble != 0) cout "Error!" endl; return; cout result endl; }
5 将整数倒序输出,删除重复数据
输入一个整数,如12336544,或1750,然后从最后一位开始倒过来输出,最后如果是0,则不输出,输出的数字是不带重复数字的,所以上面的输出是456321和571。如果是负数,比如输入-175,输出-571。
#include iostream using namespace std; void numreverse(char* num); void removezero(char* num); void removereplicate(char* num); void removereplicate2(char* num); void main() char num[20] = "-122001100"; removezero(num); numreverse(num); removereplicate2(num); cout num endl; void numreverse(char* num) char c; int i = 0; char* temp = num;; if (num[0] == -) temp++; int len = strlen(temp); for (; i len / 2; i++) c = temp[i]; temp[i] = temp[len-i-1]; temp[len-i-1] = c; void removezero(char* num) char* temp = num + strlen(num) - 1; while (*temp == 0) *temp = \0; temp--; //去掉相邻的重复字符 void removereplicate(char* num) char* temp = num; int index = 0; for (int i = 0; i strlen(num); i++) if (temp[i] != temp[i+1]) num[index++] = temp[i]; num[index] = \0; //去掉所有的重复字符 void removereplicate2(char* num) char* temp = num; int index = 0; bool exist[10] = {0}; if (temp[0] == -) num[index++] = -; for (int i = 1; i strlen(num); i++) if (exist[temp[i] - 0] == 0) num[index++] = temp[i]; exist[temp[i]-0] = 1; num[index] = \0; }
6 编程的时候,if条件里面的”(“、”)”括号经常出现不匹配的情况导致编译不过,请编写程序检测输入一行if语句中的圆括号是否匹配正确。同时输出语句中出现的左括号和右括号数量,如if((a==1) (b==1))是正确的,而if((a==1)) (b==1))是错误的。注意if语句的最外面至少有一对括号。提示:用堆栈来做。
输入:if((a==1) (b==1))输出:RIGTH 3 3
输入:if((a==1)) (b==1))
输出:WRONG 3 4
#include iostream using namespace std; void main() char ch[100]; cin.getline(ch,100); int left = 0; int right = 0; int countleft = 0; int countright = 0; bool existif = false; int flag = 0; //看连着if的括号是否过早被匹配 bool bflag = false; int i,j; for (i = 0; i strlen(ch); i++) if (ch[i] == i ch[i+1] == f) existif = true; break; if (!existif ch[i] == () break; for (int j = 0; j strlen(ch); j++) if (ch[j] == () left++; flag++; else if (ch[j] == )) right++; flag--; if (j strlen(ch) - 1 flag == 0) bflag = true; if (!bflag existif right == left) cout "RIGHT " left " " right endl; else cout "WRONG " left " " right endl; }
7 统计数字出现的次数,最大次数的统计出来 举例:
输入:323324423343
输出:3,6
#include iostream using namespace std; void main() char ch[50]; char* p = ch; cin ch; int b[10] = {0}; while (*p) b[*p++ - 0]++; int max = b[0]; int index = 0; for (int i = 1; i i++) if (b[i] max) max = b[i]; index = i; cout index " " b[index] endl; }
8 字符串首字母转换成大写
举例:
输入:this is a book
返回:This Is A Book
#include iostream using namespace std; void main() char ch[50]; cin.getline(ch,50); if (ch[0] != ) ch[0] -= 32; for (int i = 0; i strlen(ch); i++) if (ch[i] == ch[i+1] != ) ch[i+1] -= 32; i++; cout ch endl; }
9 子串分离
题目描述:
通过键盘输入任意一个字符串序列,字符串可能包含多个子串,子串以空格分隔。请编写一个程序,自动分离出各个子串,并使用’,将其分隔,并且在最后也补充一个’,并将子串存储。
如果输入”abc def gh i d”,结果将是abc,def,gh,i,d,
要求实现函数:
void DivideString(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
#include iostream using namespace std; void DivideString(const char *pInputStr, long lInputLen, char *pOutputStr); void DivideString2(const char *pInputStr, long lInputLen, char *pOutputStr); void DivideString3(const char *pInputStr, long lInputLen, char *pOutputStr); void main() char ch[50] = "abc def gh i d"; //char ch[50]; //cin.getline(ch,50); char output[50]; DivideString3(ch,strlen(ch),output); cout output endl; //使用strtok函数的实现方式 void DivideString(const char *pInputStr, long lInputLen, char *pOutputStr) char* temp; char* word[10]; char* input = const_cast char* (pInputStr); int index = 0; temp = strtok(input," "); while (temp != NULL) word[index++] = temp; temp = strtok(NULL, " "); for (int i = 0; i index; i++) if (i == 0) //strncpy(pOutputStr,word[i],sizeof(word[i])+1); strcpy(pOutputStr,word[i]); else strcat(pOutputStr,","); strcat(pOutputStr,word[i]); strcat(pOutputStr,","); //不适用strtok函数的实现方式 void DivideString2(const char *pInputStr, long lInputLen, char *pOutputStr) char* input = const_cast char* (pInputStr); char* temp = input; char* word[10]; int index = 0; int length = 0; while (*input) if (*input != ) length++; input++; else if (length != 0) temp[length] = \0; word[index++] = temp; temp = input+1; length = 0; input++; for (int i = 0; i index; i++) if (i == 0) strcpy(pOutputStr,word[i]); else strcat(pOutputStr,","); strcat(pOutputStr,word[i]); strcat(pOutputStr,","); //直接法实现 void DivideString3(const char *pInputStr, long lInputLen, char *pOutputStr) const char* p = pInputStr; int count = 0; while (*p) if (*p != ) count = 0; *pOutputStr++ = *p++; else count++; if (count == 1) *pOutputStr++ = ,; p++; *pOutputStr++ = ,; *pOutputStr++ = \0; }
10 评委打分
问题描述:
在评委打分的比赛中,通常采取去掉一个最高分和最低分,再求平均分的做法,主要是为了公平,公正和公开的原则,防止有人买通评委,有特别的高分出现,另外,也可以防止因为评委个人原因,对选手有“低见”给特别低的分。去掉最高分最低分能够求出较为准确的平均分。请编写程序实现上述计分过程
要求实现函数:
intscore_calc(int n, int score[])
【输入】 int n,评委人数n(n =3)
int score[],每个评委的打分(百分制)
【输出】 无
【返回】 选手最终得分(取整)
注:
取整和四舍五入不同,取整只保留数值的整数部分,小数部分丢弃。比如7.3和7.6,取整后都为7
示例
输入:int n = 5;int score[] = {75, 80, 75, 70, 80}
输出:无
返回:76
#include iostream using namespace std; int score_calc(int n, int score[]); void main() int n = 5; int score[] = {75, 80, 75, 70, 80}; cout score_calc(5,score) endl; int score_calc(int n, int score[]) int max = score[0]; int min = score[0]; int sum = 0; for (int i = 0; i i++) if (score[i] max) max = score[i]; else if (score[i] min) min = score[i]; sum += score[i]; sum = (sum - max - min) / (n - 2); return sum; }
/*考察结构体对齐和填充: 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如果不是,编译器会自动在成员间填充。