PTA C語言作業


6-1 使用函數輸出一個整數的逆序數 (20 分)

 

本題要求實現一個求整數的逆序數的簡單函數。

函數接口定義:

int reverse( int number ); 

其中函數reverse須返回用戶傳入的整型number的逆序數。

裁判測試程序樣例:

#include <stdio.h>

int reverse( int number ); int main() { int n; scanf("%d", &n); printf("%d\n", reverse(n)); return 0; } /* 你的代碼將被嵌在這里 */
 

 

輸入樣例:

-12340
 
結尾無空行

輸出樣例:

-4321
 
結尾無空行
 
解題思路: 循環取余獲得 余數 + temp值,temp變量用來保存x變量的值,number/10 一直到0循環即結束

下面是代碼實現:

#include <stdio.h>

int reverse( int number ); int main() { int n; scanf("%d", &n); printf("%d\n", reverse(n)); return 0; } /* 你的代碼將被嵌在這里 */
int reverse( int number ) { int temp, x, i; temp = 0; do{ x = (temp * 10) + (number % 10); temp = x; number /= 10; }while(number != 0); return x; }

 

 

7-1 逆序的三位數 (10 分)

 

程序每次讀入一個正3位數,然后輸出按位逆序的數字。注意:當輸入的數字含有結尾的0時,輸出不應帶有前導的0。比如輸入700,輸出應該是7。

輸入格式:

每個測試是一個3位的正整數。

輸出格式:

輸出按位逆序的數。

輸入樣例:

123
 
結尾無空行

輸出樣例:

321
 
結尾無空行

 

解題思路:這題和上一題一樣,不過多了一個輸入正數的條件,對輸入值n添加判斷即可

    scanf("%d", &n); if(n < 0) { return 0; }

 

 

7-2 查詢水果價格 (15 分)

 

給定四種水果,分別是蘋果(apple)、梨(pear)、桔子(orange)、葡萄(grape),單價分別對應為3.00元/公斤、2.50元/公斤、4.10元/公斤、10.20元/公斤。

首先在屏幕上顯示以下菜單:

[1] apple [2] pear [3] orange [4] grape [0] exit
 

用戶可以輸入編號1~4查詢對應水果的單價。當連續查詢次數超過5次時,程序應自動退出查詢;不到5次而用戶輸入0即退出;輸入其他編號,顯示價格為0。

輸入格式:

輸入在一行中給出用戶連續輸入的若干個編號。

輸出格式:

首先在屏幕上顯示菜單。然后對應用戶的每個輸入,在一行中按格式“price = 價格”輸出查詢結果,其中價格保留兩位小數。當用戶連續查詢次數超過5次、或主動輸入0時,程序結束。

輸入樣例1:

3 -1 0 2
 
結尾無空行

輸出樣例1:

[1] apple [2] pear [3] orange [4] grape [0] exit price = 4.10 price = 0.00
 
結尾無空行

輸入樣例2:

1 2 3 3 4 4 5 6 7 8
 

輸出樣例2:

[1] apple [2] pear [3] orange [4] grape [0] exit price = 3.00 price = 2.50 price = 4.10 price = 4.10 price = 10.20

解題思路:根據題目要求用float數組存放水果價格,再通過for循環進行數值判斷輸出水果價格,需要注意 price[v[i]] 這句是先獲取v下標對應的水果序號,然后再通過該序號獲取price的價格

#include <stdio.h>


void show_info(); void show_price(float price[], int v[]); int main() { show_info(); float price[5] = {0.00, 3.00, 2.50, 4.10, 10.20}; int v[5]; for(int i=0; i<5; i++) { scanf("%d", &v[i]); if(getchar() == '\n') { break; } } show_price(price, v); return 0; } void show_price(float price[], int v[]) { for(int i=0; i<5; i++) { if(v[i] >= 1 && v[i] <= 4) { printf("price = %.2f\n", price[v[i]]); continue; } else if(v[i] == 0) { break; } printf("price = %.2f\n", price[0]); } } void show_info() { printf("[1] apple\n[2] pear\n[3] orange\n[4] grape\n[0] exit\n"); }

 

 

7-3 簡單計算器 (20 分)

 

模擬簡單運算器的工作。假設計算器只能進行加減乘除運算,運算數和結果都是整數,四種運算符的優先級相同,按從左到右的順序計算。

輸入格式:

輸入在一行中給出一個四則運算算式,沒有空格,且至少有一個操作數。遇等號”=”說明輸入結束。

輸出格式:

在一行中輸出算式的運算結果,或者如果除法分母為0或有非法運算符,則輸出錯誤信息“ERROR”。

輸入樣例:

1+2*10-10/2=
 
結尾無空行

輸出樣例:

10
 
結尾無空行
解題思路:字符串存放計算內容,先判斷一組數字,遇到運算符結束並返回下標,再通過循環里switch分支計算數值
#include <stdio.h> #include <stdlib.h> #include <string.h>

int func(char *n) { int i; for(i=0; *(n+i)!='='; i++) { if( !((n[i] >= '0' && n[i] <= '9') || n[i] == '.') ) { break; } } return i; } int calulator(char *n) { char temp[20]; int x = 0; int y = 0; x = func(n); y = atoi(strncpy(temp, n, x)); do{ n += ++x; char temp[20] = ""; switch((n-1)[0]) { case '+': x = func(n); y += atoi(strncpy(temp, n, x)); break; case '-': x = func(n); y -= atoi(strncpy(temp, n, x)); break; case '*': x = func(n); y *= atoi(strncpy(temp, n, x)); break; case '/': if(n[0] == '0') { printf("ERROR\n"); exit(0); } x = func(n); y /= atoi(strncpy(temp, n, x)); break; case '=': return y; break; default: printf("ERROR\n"); exit(0); } }while(1); } int main() { char s[100]; gets(s); fflush(stdin); printf("%d\n", calulator(s)); return 0; }

 

 

7-4 英文字母替換加密(大小寫轉換+后移1位) (15 分)

 

本題要求編寫程序,將英文字母替換加密。為了防止信息被別人輕易竊取,需要把電碼明文通過加密方式變換成為密文。變換規則是:將明文中的所有英文字母替換為字母表中的后一個字母,同時將小寫字母轉換為大寫字母,大寫字母轉換為小寫字母。例如,字母a->B、b->C、…、z->A、A->b、B->c、…、Z->a。輸入一行字符,將其中的英文字母按照以上規則轉換后輸出,其他字符按原樣輸出。

輸入格式:

輸入一行字符,以回車符 '\n'作為 結束符。

輸出格式:

將輸入的一行字符中的所有英文字母替換為字母表中的后一個字母,同時將小寫字母轉換為大寫字母,大寫字母轉換為小寫字母后輸出,其他字符按原樣輸出。

輸入樣例:

在這里給出一組輸入。例如:

Reold Z123? 
 

輸出樣例:

在這里給出相應的輸出。例如:

sFPME a123?
 
結尾無空行
解題思路:據題意將明文中的所有英文字母替換為字母表中的后一個字母,同時將小寫字母轉換為大寫字母,大寫字母轉換為小寫字母。
     根據ASCII表循環替換 大轉小寫+33,小轉大寫-31,注意‘z’ -57 而 ‘Z’+7
#include <stdio.h> #include <string.h>


int main() { char s[100]; gets(s); fflush(stdin); for(int i=0; i<strlen(s); i++) { if(s[i] >= 'a' && s[i] <= 'y') { s[i] -= 31; } else if(s[i] == 'z') { s[i] -= 57; } else if(s[i] >= 'A' && s[i] <= 'Y') { s[i] += 33; } else if(s[i] == 'Z') { s[i] += 7; } } printf("%s", s); return 0; }

 

7-5 單詞首字母大寫 (15 分)

 

本題目要求編寫程序,輸入一行字符,將每個單詞的首字母改為大寫后輸出。所謂“單詞”是指連續不含空格的字符串,各單詞之間用空格分隔,空格數可以是多個。

輸入格式:

輸入給出一行字符。

輸出格式:

在一行中輸出已輸入的字符,其中所有單詞的首字母已改為大寫。

輸入樣例:

How are you?
 
結尾無空行

輸出樣例:

How Are You?
 
結尾無空行

解題思路:據題意設置標記變量,循環判斷首字母大寫狀態

#include <stdio.h> #include <string.h>


int main() { char s[100]; int flag = 1; gets(s); fflush(stdin); for(int i=0; i<strlen(s); i++) { if(s[i] >= 'a' && s[i] <= 'z' && flag) { s[i] -= 32; flag = 0; } if(s[i] >= 'A' && s[i] <= 'Z' && flag) { flag = 0; } else if(s[i] == ' ') { flag = 1; } } printf("%s", s); return 0; }

 


免責聲明!

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



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