第12周編程題在線測試
NOTE:
- 結構體和共用體的區別就是:結構體成員所佔的內存空間彼此獨立,且需要遵循內存對齊,如64位系統則遵循8字節對齊,32位系統遵循4字節對齊;共用體成員所佔的內存空間共用,且等於所佔字節數最大的那個成員變量。
- 共用體成員的訪問與結構體成員相同,但只能對第一個成員進行初始化,當對其中一個成員賦值時就會覆蓋其他成員的值。
- 共用體的字節分配問題如下:
- 要找一個字符ans在某字符串中的首次出現的位置,可用 strchr(const char* a, ans) 函數,返回值爲一個指向字符串中指定字符位置的指針,若不存在,則返回空指針。如下圖所示:
- 不能向空指針指向內存單元寫數據,歸根到底還是要注意在使用指針前對其初始化,比如讓其指向一個已知的內存地址,如已經在前面定義過了的數組的首地址等。
1. 計算時間差V2.0
題目內容:
用結構體定義時鐘類型,編程從鍵盤任意輸入兩個時間(例如4時55分和1時25分),計算並輸出這兩個時間之間的間隔。要求不輸出時間差的負號。結構體類型定義如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct clock
{
int hour;
int minute;
int second;
}CLOCK;
CLOCK CalculateTime(CLOCK t1, CLOCK t2);
int main(void)
{
CLOCK t1,t2,t3;
printf( "Input time one:(hour,minute):");
scanf("%d,%d",&t1.hour, &t1.minute);
printf( "Input time two: (hour,minute):");
scanf("%d,%d",&t2.hour, &t2.minute);
t3 = CalculateTime(t1,t2);
printf("%dhour,%dminute\n",t3.hour,t3.minute);
return 0;
}
CLOCK CalculateTime(CLOCK t1, CLOCK t2)
{
CLOCK t3;
int min1, min2;
min1 = t1.hour * 60 + t1.minute;
min2 = t2.hour * 60 + t2.minute;
int minute = abs(min1 - min2);
t3.hour = minute/60;
t3.minute = minute - t3.hour*60;
t3.second = 0;
return t3;
}
2. 獎學金髮放
題目內容:
//自己寫吧兄弟
3. 評選最牛羣主v1.0
題目內容:
現在要評選最牛羣主,已知有3名最牛羣主的候選人(分別是tom,jack和rose),有不超過1000人蔘與投票,最後要通過投票評選出一名最牛羣主,從鍵盤輸入每位參與投票的人的投票結果,即其投票的候選人的名字,請你編程統計並輸出每位候選人的得票數,以及得票數最多的候選人的名字。候選人的名字中間不允許出現空格,並且必須小寫。若候選人名字輸入錯誤,則按廢票處理。
#include<stdio.h>
#include<string.h>
#define N 10
int main(void)
{
int n, i, pos = 0,max;
int num[3] = {0};
printf("Input the number of electorates:");
scanf("%d",&n);
char vote[n][N];
char name[3][5] = {"tom","jack","rose"};
char (*p)[N] = vote;
char (*q)[5] = name;
for(i = 0; i < n; i++)
{
printf("Input vote %d:",i+1);
scanf("%s",(p + i));
}
for(i = 0; i < n; i++)
{
for(int j = 0; j < 3; j++)
{
if(strcmp(q[j],p[i]) == 0)
{
num[j]++;
}
}
}
max = num[0];
for(i = 1; i < 3; i++)
{
if(num[i] > max)
{
pos = i;
max = num[i];
}
}
printf("Election results:\n");
for(i = 0; i < 3; i++)
{
printf("%s:%d\n",q[i],num[i]);
}
printf("%s wins\n",q[pos]);
return 0;
}
4. 星期判斷
題目內容:
請輸入星期幾的第一個字母(不區分大小寫)來判斷一下是星期幾,如果第一個字母一樣,則繼續判斷第二個字母(小寫),否則輸出“data error”。
#include<stdio.h>
#define M 7
#define N 20
int main()
{
char date[M][N] = {"monday\n","tuesday\n","wednesday\n","thursday\n",
"friday\n","saturday\n","sunday\n"};
char ch[2];
char *p = *date;
int flag = 0;
printf("please input the first letter of someday:\n");
scanf(" %c",&ch[0]);
if(ch[0]=='m'||ch[0]=='M'||ch[0]=='w'||ch[0]=='W'||ch[0]=='f'||ch[0]=='F')
{
switch(ch[0])
{
case 'm':
case 'M':
printf("monday\n");
break;
case 'w':
case 'W':
printf("wednesday\n");
break;
case 'f':
case 'F':
printf("friday\n");
break;
default:
break;
}
return 0;
}
else
{
for(int i = 0; i < M; i++)
{
if(ch[0] == p[i*N] || ch[0] == p[i*N] - 32)
flag = 1;
}
if(flag == 0)
{
printf("data error\n");
return 0;
}
else
{
printf("please input second letter:\n");
scanf(" %c",&ch[1]);
for(int i = 0;i < M; i++)
{
for(int j = 0; j < N; j++)
{
if((ch[0] == p[i*N] || ch[0] == p[i*N] - 32) && ch[1] == p[i*N+1])
{
puts(date[i]);
return 0;
}
}
}
}
printf("data error\n");
return 0;
}
}
第12周練兵區編程題
3. 單詞接龍
題目內容:
阿泰和女友小菲用英語短信玩單詞接龍遊戲。一人先寫一個英文單詞,然後另一個人回覆一個英文單詞,要求回覆單詞的開頭有若干個字母和上一個人所寫單詞的結尾若干個字母相同,重合部分的長度不限。(如阿泰輸入happy,小菲可以回覆python,重合部分爲py。)現在,小菲剛剛回復了阿泰一個單詞,阿泰想知道這個單詞與自己發過去的單詞的重合部分是什麼。他們兩人都是喜歡寫長單詞的英語大神,阿泰覺得用肉眼找重合部分實在是太難了,所以請你編寫程序來幫他找出重合部分。
#include<stdio.h>
#include<string.h>
#define N 100
int main()
{
char first[N],second[N],temp1[N],temp2[N];
int fir_len, sec_len, i, j;
scanf("%s%s", first, second);
fir_len = strlen(first);
sec_len = strlen(second);
for(i = 0; i < sec_len; i++)
{
memset(temp1, '\0', sizeof(temp1));
memset(temp2, '\0', sizeof(temp2));
strncpy(temp1, second, i + 1);
for(j = fir_len - (i + 1); j <= fir_len - 1; j++)
{
temp2[j - (fir_len - (i + 1))] = first[j];
}
if(strcmp(temp1, temp2) == 0)
{
printf("%s\n",temp1);
break;
}
}
return 0;
}
4. 分數比較
題目內容:
比較兩個分數的大小。人工方式下比較分數大小最常見的方法是:進行分數的通分後比較分子的大小。可以編程模擬手工解決。
具體要求爲首先輸出(“Input two FENSHU:\n”),然後輸入兩個分數分子分母的值,格式爲("%d/%d,%d/%d"),判斷完成後輸出("%d/%d<%d/%d\n")或("%d/%d>%d/%d\n")或("%d/%d=%d/%d\n");
#include<stdio.h>
int gcd(int a, int b) //求兩個參數的最大公約數,在本題中求這個是爲了防止整型溢出,擴大輸入有效範圍
{
int r;
while(b != 0)
{
r = a%b;
a = b;
b = r;
}
return a;
}
int main()
{
int a,b,c,d,fen1,fen2,g;
printf("Input two FENSHU:\n");
scanf("%d/%d,%d/%d", &a, &b, &c, &d);
g = gcd(b,d);
fen1 = a * (d / g);
fen2 = c * (b / g);
if(fen1 > fen2)
printf("%d/%d>%d/%d\n",a,b,c,d);
else if(fen1 == fen2)
printf("%d/%d=%d/%d\n",a,b,c,d);
else
printf("%d/%d<%d/%d\n",a,b,c,d);
return 0;
}
5. 百萬富翁的換錢計劃
題目內容:
有一天,一位百萬富翁遇到一個陌生人,陌生人找他談一個換錢的計劃,陌生人對百萬富翁說:“我每天給你10萬元,而你第一天只需給我1分錢,第二天我仍給你10萬元,你給我2分錢,第三天我仍給你10萬元,你給我4分錢……。你每天給我的錢是前一天的兩倍,直到滿一個月(30天)爲止”,百萬富翁很高興,欣然接受了這個契約。請編程計算在這一個月中陌生人總計給百萬富翁多少錢,百萬富翁總計給陌生人多少錢。程序中浮點數的數據類型均爲double。
#include<stdio.h>
#include<math.h>
int main()
{
double richman = 100000, sum = 0;
for(int i = 0; i < 30; i++)
sum += pow(2,i);
printf("to Stranger: %.2f yuan\n",sum);
printf("to Richman: %.2f yuan\n", richman * 30);
return 0;
}
6. 用計數控制的循環實現正數累加求和
題目內容:
輸入一些整數,編程計算並輸出其中所有正數的和,輸入負數時不累加,繼續輸入下一個數。輸入零時,表示輸入數據結束。要求最後統計出累加的項數。
#include<stdio.h>
int main(void)
{
int sum = 0, count = 0;
int n;
do
{
printf("Input a number:\n");
scanf("%d", &n);
if(n > 0)
{
sum += n;
count++;
}
}while(n != 0);
printf("sum=%d,count=%d\n", sum, count);
return 0;
}
7. 平方根表
題目內容:
輸出100(n2<=100)以內整數的平方根表,n的值要求從鍵盤輸入,並且滿足n2<=100 (即n的平方值在100以內)。
#include<stdio.h>
#include<math.h>
int main(void)
{
int n;
printf("Input n(n<=10):\n");
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
printf("%7d", i);
}
printf("\n");
for(int i = 0; i < n; i++)
{
printf("%d", i);
for(int j = 0; j < n; j++)
{
float add = sqrt(i * 10.0 + j);
printf("%7.3f",add);
}
printf("\n");
}
return 0;
}
8. 最大公約數
題目內容:
按照如下函數原型編寫子函數計算正整數a和b的所有公約數。第一次調用,返回最大公約數。以後只要再使用相同參數調用,每次返回下一個小一些的公約數。無公約數時,函數CommonFactors()返回-1,主函數中不輸出任何信息。
函數原型: int CommonFactors(int a, int b)
#include<stdio.h>
int CommonFactors(int a, int b);
int n = 1;
int main(void)
{
int a, b;
int ret;
printf("Input a and b:\n");
scanf("%d,%d", &a, &b);
ret = CommonFactors(a,b);
if(a > 0 && b > 0)
{
while(ret > 0)
{
printf("Common factor %d is %d\n", n, ret);
n++;
ret = CommonFactors(a,b);
}
}
return 0;
}
int CommonFactors(int a, int b)
{
int i, cnt = 0;
int temp;
if(a < b)
{
temp = a;
a = b;
b = temp;
}
for(i = a; i >= 1; i--)
{
if(a%i == 0 && b%i == 0)
cnt++;
if(n == cnt)
return i;
}
return -1;
}
9. 23根火柴遊戲
題目內容:
請編寫一個簡單的23 根火柴遊戲程序,實現人跟計算機玩這個遊戲的程序。爲了方便程序自動評測,假設計算機移動的火柴數不是隨機的,而是將剩餘的火柴根數對3求餘後再加1來作爲計算機每次取走的火柴數。如果剩餘的火柴數小於3,則將剩餘的火柴數減1作爲計算機移走的火柴數。但是計算機不可以不取,剩下的火柴數爲1時,必須取走1根火柴。假設遊戲規則如下:
1)遊戲者開始擁有23根火柴棒;
2)每個遊戲者輪流移走1 根、2 根或3 根火柴;
3)誰取走最後一根火柴爲失敗者。
#include<stdio.h>
int main()
{
int remain = 23, n = 0;
int i = 0;
int com = 0;
int player = 0;
printf("Game start!\nNote: the maximum number is 3\n");
while(remain)
{
if(i%2 == 0)
{
if(remain < 3)
{
printf("Please enter the number of matches you are moving:\n");
scanf("%d", &n);
while(n != 1)
{
printf("The number you entered is wrong, please re-enter!\n");
printf("Please enter the number of matches you are moving:\n");
scanf("%d", &n);
}
printf("The number of matches you are moving is:%d\n",n);
remain--;
printf("The number of matches left is:%d\n", remain);
if(remain == 1)
player = 1;
}
else
{
printf("Please enter the number of matches you are moving:\n");
scanf("%d", &n);
while(n < 1 || n > 3)
{
printf("The number you entered is wrong, please re-enter!\n");
printf("Please enter the number of matches you are moving:\n");
scanf("%d", &n);
}
printf("The number of matches you are moving is:%d\n",n);
remain -= n;
printf("The number of matches left is:%d\n", remain);
}
i++;
}
else
{
if(remain < 3)
{
printf("The number of matches that have been moved by the computer is:%d\n", 1);
remain--;
printf("The number of matches left is:%d\n", remain);
if(remain == 1)
com = 1;
}
else
{
printf("The number of matches that have been moved by the computer is:%d\n", remain%3+1);
remain = remain - (remain % 3 + 1);
printf("The number of matches left is:%d\n", remain);
}
i++;
}
}
if(player == 1)
printf("Congratulations! You won!\n");
else
printf("I'm sorry. You lost!\n");
return 0;
}