PAT|中國大學MOOC-翁愷-C語言程式設計習題集21-24
06-1. 簡單計算器(20)
模擬簡單運算器的工作。假設計算器只能進行加減乘除運算,運算數和結果都是整數,4種運算子的優先順序相同,按從左到右的順序計算。
輸入格式:
輸入在一行中給出一個四則運算算式,沒有空格,且至少有一個運算元。遇等號”=”說明輸入結束。
輸出格式:
在一行中輸出算式的運算結果,或者如果除法分母為0或有非法運算子,則輸出錯誤資訊“ERROR”。
輸入樣例:
1+2*10-10/2=
輸出樣例:
10
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
int len, i, j, a, sum, n,begin,flag;
char sign[200];
float num[200];
char str[400];
gets(str);
len=strlen(str);
n = 0;
begin = 0;
flag = 0;
for (i = 0; i < len; i++)
{
if (str[i] >= 48 && str[i] <= 57 || str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/' || str[i] == '=')//如果字元是‘0’-‘9’‘+’‘-’‘*’‘/’‘=’則合法
{
if (str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/' || str[i] == '=')//當遇到加減乘除的時候,計算出每一位的數字
{
sum = 0;
for (j = begin; j < i; j++)
{
a = (str[j] - '0')*pow(10.0, i - 1 -j);
sum = sum + a;
}
num[n] = sum;//記錄數字
sign[n] = str[i];//記錄符號
begin = i + 1;
n++;
}
}
else//否則不合法,提示出錯
{
printf("ERROR" );
flag = 1;
break;
}
}
if (flag == 0)//當全部字符合法,則進行計算
{
for (i = 0; i <= n-1 ; i++)//將所有數字提出來計算,將計算好的數字放在下一位,方便後來的計算,最後一位則為結果
{
if (sign[i] == '+')
{
num[i + 1] = num[i] + num[i + 1];
}
else if (sign[i] == '-')
{
num[i + 1] = num[i] - num[i + 1];
}
else if (sign[i] == '*')
{
num[i + 1] = num[i] * num[i + 1];
}
else if (sign[i] == '/')
{
if (num[i + 1] == 0)//當被除數為0,提示錯誤
{
printf("ERROR");
break;
}
num[i + 1] = num[i] / num[i + 1];
}
else if (sign[i] == '=')//當看到‘=’算出結果
{
printf("%.0f", num[i]);
}
}
}
return 0;
}
06-2. 字串字母大小寫轉換(10)
輸入一個以#結束的字串,本題要求將小寫字母全部轉換成大寫字母,把大寫字母全部轉換成小寫字母,其它字元不變。
輸入格式:
輸入在一行中給出一個長度不超過40的、以#結束的非空字串。
輸出格式:
在一行中按照要求輸出轉換後的字串。
輸入樣例:
Hello World! 123#
輸出樣例:
hELLO wORLD! 123
#include <stdio.h>
#include <string.h>
int main()
{
char str[1000];
int len, i;
gets(str);
len = strlen(str);
for (i = 0; i <= len - 2; i++)
{
if (str[i] >= 65 && str[i] <= 90)
{
str[i] = str[i] + 32;
}
else if (str[i]>=97&& str[i]<=122)
{
str[i] = str[i] - 32;
}
}
for (i = 0; i <= len - 2; i++)
{
printf("%c", str[i]);
}
return 0;
}
06-3. 單詞長度(15)
你的程式要讀入一行文字,其中以空格分隔為若干個單詞,以‘.’結束。你要輸出每個單詞的長度。這裡的單詞與語言無關,可以包括各種符號,比如“it’s”算一個單詞,長度為4。注意,行中可能出現連續的空格;最後的‘.’不計算在內。
輸入格式:
輸入在一行中給出一行文字,以‘.’結束。
提示:用scanf(“%c”,…);來讀入一個字元,直到讀到‘.’為止。
輸出格式:
在一行中輸出這行文字對應的單詞的長度,每個長度之間以空格隔開,行末沒有最後的空格。
輸入樣例:
It’s great to see you here.
輸出樣例:
4 5 2 3 3 4
#include <stdio.h>
#include <string.h>
int main()
{
char str[100];
int count, i,len,n,m;
int num[100];
int num1[100];
n = 0;
count = 0;
m = 0;
gets(str);
len=strlen(str);
for (i = 0; i <= len - 1; i++)
{
if (str[i] == ' ' || str[i] == '.')
{
num[n] = count;
count = 0;
n++;
}
else
{
count++;
}
}
for (i = 0; i <= n - 1; i++)
{
if (num[i] != 0)
{
num1[m] = num[i];
m++;
}
}
for (i = 0; i <= m - 1; i++)
{
if (i < m - 1)
{
printf("%d ", num1[i]);
}
else
{
printf("%d", num1[i]);
}
}
return 0;
}
07-0. 寫出這個數 (20)
讀入一個自然數n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。
輸入格式:每個測試輸入包含1個測試用例,即給出自然數n的值。這裡保證n小於10100。
輸出格式:在一行內輸出n的各位數字之和的每一位,拼音數字間有1 空格,但一行中最後一個拼音數字後沒有空格。
輸入樣例:
1234567890987654321123456789
輸出樣例:
yi san wu
#include <stdio.h>
#include <string.h>
#include <math.h>
int readnumber(int x);
int main()
{
char str[1000000];
int num,len,sum,i;
sum = 0;
gets(str);
len = strlen(str);
for (i = 0; i <= len - 1; i++)
{
num= str[i] - 48;
sum = sum + num;
}
readnumber(sum);
}
int readnumber(int x)
{
int n, num, len, i, j, a, b;
int m[10];
num = x;
n = 1;
if (num > 0)
{
for (i = 0; i <= 9; i++)
{
if (num >= pow(10.0, i) && num <= pow(10.0, i + 1) - 1)
{
len = i + 1;
break;
}
}
m[0] = num / pow(10.0, len - 1);
for (i = len - 1; i >= 1; i--)
{
a = num % (int)pow(10.0, i) / (int)pow(10.0, i - 1);
m[n] = a;
n++;
}
for (j = 0; j <= n - 1; j++)
{
b = m[j];
if (j < n - 1)
{
switch (b)
{
case 0:printf("ling "); break;
case 1:printf("yi "); break;
case 2:printf("er "); break;
case 3:printf("san "); break;
case 4:printf("si "); break;
case 5:printf("wu "); break;
case 6:printf("liu "); break;
case 7:printf("qi "); break;
case 8:printf("ba "); break;
case 9:printf("jiu "); break;
}
}
else
{
switch (b)
{
case 0:printf("ling"); break;
case 1:printf("yi"); break;
case 2:printf("er"); break;
case 3:printf("san"); break;
case 4:printf("si"); break;
case 5:printf("wu"); break;
case 6:printf("liu"); break;
case 7:printf("qi"); break;
case 8:printf("ba"); break;
case 9:printf("jiu"); break;
}
}
}
}
else if (num == 0)
{
printf("ling");
}
else
{
num = -num;
for (i = 0; i <= 9; i++)
{
if (num >= pow(10.0, i) && num <= pow(10.0, i + 1) - 1)
{
len = i + 1;
break;
}
}
m[0] = num / pow(10.0, len - 1);
for (i = len - 1; i >= 1; i--)
{
a = num % (int)pow(10.0, i) / (int)pow(10.0, i - 1);
m[n] = a;
n++;
}
printf("fu ");
for (j = 0; j <= n - 1; j++)
{
b = m[j];
if (j < n - 1)
{
switch (b)
{
case 0:printf("ling "); break;
case 1:printf("yi "); break;
case 2:printf("er "); break;
case 3:printf("san "); break;
case 4:printf("si "); break;
case 5:printf("wu "); break;
case 6:printf("liu "); break;
case 7:printf("qi "); break;
case 8:printf("ba "); break;
case 9:printf("jiu "); break;
}
}
else
{
switch (b)
{
case 0:printf("ling"); break;
case 1:printf("yi"); break;
case 2:printf("er"); break;
case 3:printf("san"); break;
case 4:printf("si"); break;
case 5:printf("wu"); break;
case 6:printf("liu"); break;
case 7:printf("qi"); break;
case 8:printf("ba"); break;
case 9:printf("jiu"); break;
}
}
}
}
return 0;
}