MOOC哈工大2020C語言程序設計精髓編程題在線測試第十周


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';
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM