題目描述(60分):
通過鍵盤輸入一串小寫字母(a~z)組成的字符串。請編寫一個字符串過濾程序,若字符串中出現多個相同的字符,將非首次出現的字符過濾掉。
比如字符串“abacacde”過濾結果爲“abcde”。
要求實現函數:
void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr);
【輸入】 pInputStr: 輸入字符串
lInputLen: 輸入字符串長度
【輸出】 pOutputStr: 輸出字符串,空間已經開闢好,與輸入字符串等長;
【注意】只需要完成該函數功能算法,中間不需要有任何IO的輸入輸出
示例
輸入:“deefd” 輸出:“def”
輸入:“afafafaf” 輸出:“af”
輸入:“pppppppp” 輸出:“p”
void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr)
{
char a[26] = {0};
while(*pInputStr)
{
a[*pInputStr-'a'] += 1;
if(a[*pInputStr - 'a'] <= 1)
{
*pOutputStr++ = *pInputStr;
}
*pInputStr++;
}
}
題目描述(40分):
通過鍵盤輸入一串小寫字母(a~z)組成的字符串。請編寫一個字符串壓縮程序,將字符串中連續出席的重複字母進行壓縮,並輸出壓縮後的字符串。a
壓縮規則:
1. 僅壓縮連續重複出現的字符。比如字符串"abcbc"由於無連續重複字符,壓縮後的字符串還是"abcbc".
2. 壓縮字段的格式爲"字符重複的次數+字符"。例如:字符串"xxxyyyyyyz"壓縮後就成爲"3x6yz"
要求實現函數:
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
【輸入】 pInputStr: 輸入字符串
lInputLen: 輸入字符串長度
【輸出】 pOutputStr: 輸出字符串,空間已經開闢好,與輸入字符串等長;
【注意】只需要完成該函數功能算法,中間不需要有任何IO的輸入輸出
示例
輸入:“cccddecc” 輸出:“3c2de2c”
輸入:“adef” 輸出:“adef”
輸入:“pppppppp” 輸出:“8p”
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr)
{
char temp;
int number = 1;
char buttfer[30] = {'\0'};
while(*pInputStr)
{
temp = *pInputStr++;
number = 1;
while(*pInputStr == temp)
{
number++;
pInputStr++;
}
if(number >= 2)
{
itoa(number,buttfer,10);
strcat(pOutputStr, buttfer);
pOutputStr = pOutputStr + strlen(buttfer);
}
*pOutputStr++ = temp;
}
*pOutputStr = '\0';
}
題目描述(50分):
通過鍵盤輸入100以內正整數的加、減運算式,請編寫一個程序輸出運算結果字符串。
輸入字符串的格式爲:“操作數1 運算符 操作數2”,“操作數”與“運算符”之間以一個空格隔開。
補充說明:
1. 操作數爲正整數,不需要考慮計算結果溢出的情況。
2. 若輸入算式格式錯誤,輸出結果爲“0”。
要求實現函數:
void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr);
【輸入】 pInputStr: 輸入字符串
lInputLen: 輸入字符串長度
【輸出】 pOutputStr: 輸出字符串,空間已經開闢好,與輸入字符串等長;
【注意】只需要完成該函數功能算法,中間不需要有任何IO的輸入輸出
示例
輸入:“4 + 7” 輸出:“11”
輸入:“4 - 7” 輸出:“-3”
輸入:“9 ++ 7” 輸出:“0” 注:格式錯誤
void arithmetic(const char *pInputStr, int length, char * pOutputStr)
{
int Num1 = 0, Num2 = 0, SUM, i, j, res = 0;
char flag;
/*sscanf() - 從一個字符串中讀進與指定格式相符的數據.
函數原型:
int sscanf(const char *buffer,const char *format,[argument ]...);
buffer 存儲的數據
format 格式控制字符串
argument 選擇性設定字符串
sscanf會從buffer裏讀進數據,依照argument的設定將數據寫回。
頭文件:
#include<stdio.h>
返回值:
成功則返回參數數目,失敗則返回0,錯誤原因存於errno中。*/
res = sscanf(pInputStr, "%d %c %d", &Num1, &flag, &Num2);
if(res < 3 || (flag != '+' && flag != '-'))
{
strcpy(pOutputStr, "0");
return;
}
printf("%d %c %d \n", Num1, flag, Num2);
if(flag == '+')
SUM = Num1 + Num2;
else
SUM = Num1 - Num2;
/* 函數原型:
char *itoa(int value, char *string, int radix);
int value 被轉換的整數,char *string 轉換後儲存的字符數組,int radix 轉換進制數,如2,8,10,16 進制等
頭文件:
<stdlib.h>*/
itoa(SUM, pOutputStr, 10);
}
第三題源代碼複製於:http://www.cnblogs.com/bigrabbit/archive/2012/09/12.html
測試用的主函數:
#include <stdio.h>
#include <memory.h>
#include <string.h>
#include <stdlib.h>
void main()
{
/* TODO: 請測試時改變改用例 */
char pInputStr1[] = {"aaaababbbcccdde"};
char pInputStr2[] = {"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbddde"};
char pInputStr3[] = {"2 + 5"};
char pOutputStr1[MAXCHAR] = {0};
char pOutputStr2[MAXCHAR] = {0};
char pOutputStr3[MAXCHAR] = {0};
/* TODO: 調用被測函數 */
stringFilter(pInputStr1, strlen(pInputStr1), pOutputStr1);
stringZip(pInputStr2, strlen(pInputStr2), pOutputStr2);
arithmetic(pInputStr3, strlen(pInputStr3), pOutputStr3);
/* TODO: 執行完成後可比較是否是你認爲正確的值 */
printf(pOutputStr1); //abcde
printf(pOutputStr2); //3a3b3c2de
printf(pOutputStr3); //7
return;
}