1 數字字符串轉換為整型數(4分)
題目內容:
從鍵盤輸入一串字符(假設字符數少於8個),以回車表示輸入結束,編程將其中的數字部分轉換為整型數並以整型的形式輸出。
函數原型為 int Myatoi(char str[]);
其中,形參數組str[]對應用戶輸入的字符串,函數返回值為轉換后的整型數。
解題思路的關鍵是:1)判斷字符串中的字符是否是數字字符;2)如何將數字字符轉換為其對應的數字值;3)如何將每一個轉換后的數字值加起來形成一個整型數。
#define N 7
int Myatoi(char str[]);
int main()
{
char str[N + 1];
int result;
printf("Input a string:");
scanf("%7s",str);
result = Myatoi(str);
printf("%d\n",result);
return 0;
}
int Myatoi(char str[])
{
int i = 0,sum = 0;
for (i = 0; str[i] != '\0'; i++)
{
if(str[i] >= '0' && str[i] <= '9')
{
sum *= 10;
sum += str[i];
sum -= 48;
}
}
return sum;
}
2 查找子串(4分)
題目內容:
用字符數組作函數參數,編程實現在從鍵盤輸入的字符串(假設長度小於80)中查找與指定的子串,並輸出該子串在字符串中首次出現的位置,如果該字符不存在,則輸出"Not found!"。
函數原型:int SearchString(char s[], char d[])
函數功能:在字符數組s中查找子串d,返回d在s中首次出現的位置,若找不到,則返回-1。
#define STR_LEN 80
//在字符數組s中查找子串d,返回d在s中首次出現的位置,若找不到,則返回-1。
int SearchString(char s[], char d[]);
int main()
{
char s[STR_LEN + 1], d[STR_LEN + 1];
int result;
printf("Input a string:");
gets(s);
printf("Input another string:");
gets(d);
result = SearchString(s, d);
if(result != -1)
{
printf("Searching results:%d\n", result);
}
else
{
printf("Not found!\n");
}
return 0;
}
int SearchString(char s[], char d[])
{
int i, j, flag, result = -1;
for (i = 0; s[i] != '\0'; ++i)
{
if(s[i] == d[0])
{
flag = 1;
//遍歷子串
for (j = 1; d[j] != '\0'; ++j)
{
//如果不相等直接退出循環
if(s[i + j] != d[j])
{
flag = 0;
break;
}
}
if(flag)
{
result = i + 1;
break;
}
}
}
return result;
}
3 統計重復字符(4分)
題目內容:
輸入一串字符(字符數小於80),以回車表示輸入結束,編程計算並輸出這串字符中連續重復次數最多的字符和重復次數。如果重復次數最多的字符有兩個,則輸出最后出現的那一個。
已知函數原型:
//函數功能:統計字符串中連續重復次數最多的字符及其重復的次數
//函數參數:str指向待統計的字符串,指針形參tag返回重復字符最后出現的下標位置
//函數返回值:返回字符重復的次數
int CountRepeatStr(char str[], int *tag);
求解思路:設置一個計數器,遍歷字符串中的所有字符,若str[i] == str[i+1],則計數器加1,同時判斷計數器的值是否大於記錄的最大重復次數max,若大於,則用計數器的值更新max,並記錄該字符最后出現的位置i+1.若str[i] != str[i+1],則計數器重新初始化為1。遍歷結束時,函數返回max的值。
#define STR_LEN 80
//函數功能:統計字符串中連續重復次數最多的字符及其重復的次數
//函數參數:str指向待統計的字符串,指針形參tag返回重復字符最后出現的下標位置
//函數返回值:返回字符重復的次數
int CountRepeatStr(char str[], int *tag);
int main()
{
char str[STR_LEN + 1];
int i = 0, result;
printf("Input a string:\n");
gets(str);
result = CountRepeatStr(str, &i);
printf("%c:%d\n", str[i], result);
return 0;
}
int CountRepeatStr(char str[], int *tag)
{
int i, max = 0, count = 1;
for (i = 0; str[i] != '\0'; ++i)
{
if(str[i] == str[i + 1])
{
count++;
if(count > max)
{
max = count;
*tag = i + 1;
}
}
else
{
count = 1;
}
}
return max;
}
4 凱撒密碼(4分)
題目內容:
凱撒密碼是羅馬擴張時期朱利斯•凱撒(Julius Caesar)創造的,用於加密通過信使傳遞的作戰命令,其原理很簡單,就是通過將字母表中的字母移動一定位置而實現加密。例如,每個字母按字母表順序向后移3位,如a加密后變成d,b加密后變成e,……x加密后變成a,y加密后變成b,z加密后變成c。請編寫一個程序,將用戶從鍵盤輸入的文本字符串(只包含a~z的字符且長度小於100)進行加密后輸出。
函數原型:void Caesar(char c[]);
函數功能:計算凱撒密碼
#define STR_LEN 100
//計算凱撒密碼
void Caesar(char c[]);
int main()
{
char str[STR_LEN + 1];
printf("Input a string:");
gets(str);
Caesar(str);
puts(str);
return 0;
}
void Caesar(char c[])
{
for (int i = 0; c[i] != '\0'; ++i)
{
c[i] = ((c[i] - 'a') + 3) % 26 + 'a';
}
}