1. 程式人生 > >來自剛剛進入打卡工作的落後者的練習題——05

來自剛剛進入打卡工作的落後者的練習題——05

好體力就要持久學,好習慣就要好堅持。繼續打卡!

近幾天又刷了很(ji)多(ge)題,這次不再問問題了,用後端類庫,啥都能解決。改變風格,講一講做題的思路。 第一題:到底是不是太胖了! 下面是題目要求: (其實不用仔細看,含金量不是太高) 據說一個人的標準體重應該是其身高(單位:釐米)減去100、再乘以0.9所得到的公斤數真實體重與標準體重誤差在10%以內都是完美身材(即 | 真實體重 − 標準體重 | < 標準體重×10%)。已知市斤是公斤的兩倍。現給定一群人的身高和實際體重,請你告訴他們是否太胖或太瘦了。 輸入格式: 輸入第一行給出一個正整數N(≤ 20)。隨後N行,每行給出兩個整數,分別是一個人的身高H(120 < H < 200;單位:釐米)和真實體重W(50 < W ≤ 300;單位:市斤),其間以空格分隔。 輸出格式:

為每個人輸出一行結論:如果是完美身材,輸出You are wan mei!;如果太胖了,輸出You are tai pang le!;否則輸出You are tai shou le!。 輸入樣例: 3 169 136 150 81 178 155 輸出樣例: You are wan mei! You are tai shou le! You are tai pang le! 下面即是我的程式碼:(再次強調,不用仔細看)

#include <stdio.h>
int main ()
{
	int n;
	
	scanf ("%d",&n);
	
	int a[n];
	int b[n];
	float c[n];
	
	int i;
	int j;
	int k;
	
	for (i=0;i<n;i++)
	{
		scanf ("%d %d",&a[i],&b[i]);
		c[i]=(a[i]-100)*0.9;//標準體重 
	}
	for (i=0;i<n;i++)
	{
		if (b[i]/2.0>=c[i])
		{
			if ((b[i]/2.0-c[i])>=c[i]*0.1)
			{
				printf ("You are tai pang le!");
			}
			else
			{
				printf ("You are wan mei!");
			}
		}
		else 
		{
			if ((c[i]-b[i]/2.0)>=c[i]*0.1)
			{
				printf ("You are tai shou le!");
			}
			else 
			{
				printf ("You are wan mei!");
			}
		}
		if (i<n-1)
		{
			printf ("\n");
		}
	}
	return 0;
} 

不得不說PTA又給我上了一課,上次是解決執行超時的問題,這裡面又get一個新知識進行計算時,不管是比較,還是進行計算,儘量把所有的值都轉換為相同的型別。比如說我的問題: 本來是寫成

        if ((b[i]/2-c[i])>=c[i]*0.1)
        {
		printf ("You are tai pang le!");
	}

這種形式的,但是總是顯示結果錯誤,這就是比較的時候出現了型別不相同的問題。(具體原因我還不清楚,等待大神的回答!) 後面就改成了這樣的形式

	if ((b[i]/2.0-c[i])>=c[i]*0.1)
	{
		printf ("You are tai pang le!");
	}

這樣,相同型別的數值進行比較的時候,就能把之前的問題解決。

第二題:尋找250 下面是題目要求: 對方不想和你說話,並向你扔了一串數…… 而你必須從這一串數字中找到“250”這個高大上的感人數字

輸入格式: 輸入在一行中給出不知道多少個絕對值不超過1000的整數,其中保證至少存在一個“250”。 輸出格式: 在一行中輸出第一次出現的“250”是對方扔過來的第幾個數字(計數從1開始)。題目保證輸出的數字在整型範圍內。 輸入樣例: 888 666 123 -233 250 13 250 -222 輸出樣例: 5

說實話,我剛看見的時候,感覺:這啥題呀,這麼簡單還是十分的? but,現實狠狠打了我的臉。先開始想用陣列進行解決的,但是,我發現這個題數字的個數沒固定。so 我想了又想 ,again again again…一直也想不出來怎麼定義一個足夠大的陣列,並且把n多個數字輸進去之後,結束,進行下一步的運算。結果,即使我求助於百度,但是,由於他們講的太複雜,所以,失敗告終。放棄了陣列看了一種新的方法。 下面就是我找到的程式碼:

#include <stdio.h>
int main ()
{
	int n;
	int i=0;
	
	while (1)
	{
		i++;
		scanf ("%d",&n);
		if (n==250)
		{
			break;
		}
	}
	printf ("%d",i); 
	return 0;
}

其中有的部分我不能理解,就先挑明白的東西說 1while(1)迴圈,1代表的是一個常量表達式,在while迴圈之內永遠成立,也就是說這個迴圈是一個無限迴圈。這就可以在裡面輸入無限個數字。 2、那麼,我們輸入完所有的數之後,要停止,並且尋找250的位置。這裡用到了break,當找到第一個250時便退出迴圈。

我的問題來了:為什麼這個無限的while迴圈,跳出之後還能繼續往裡面輸入數字,而不是出現第一個250的時候直接顯示250的位置? (希望大佬們幫我解決這個問題)

第三題:裝睡 (這個題不問是真不會呀!!!) 題目要求: 你永遠叫不醒一個裝睡的人 —— 但是通過分析一個人的呼吸頻率和脈搏,你可以發現誰在裝睡!醫生告訴我們,正常人睡眠時的呼吸頻率是每分鐘15-20次,脈搏是每分鐘50-70次。下面給定一系列人的呼吸頻率與脈搏,請你找出他們中間有可能在裝睡的人,即至少一項指標不在正常範圍內的人。 輸入格式: 輸入在第一行給出一個正整數N(≤10)。隨後N行,每行給出一個人的名字(僅由英文字母組成的、長度不超過3個字元的串)、其呼吸頻率和脈搏(均為不超過100的正整數)。 輸出格式: 按照輸入順序檢查每個人,如果其至少一項指標不在正常範圍內,則輸出其名字,每個名字佔一行。 輸入樣例: 4 Amy 15 70 Tom 14 60 Joe 18 50 Zoe 21 71 輸出樣例: Tom Zoe warning:下面的東西可看可不看 還是講先開始的想法。先開始是還是想定義三個陣列,把每一個人名,呼吸速率,脈搏 分別輸入三個陣列,但是想到數組裡面的數字(我記得這個東西好像叫下標)是字串的長度,只能輸入一個在下標內範圍內的字串。 所以,想引用一個函式int (char a,int b,int c) 之後再用個迴圈把n個人名輸入name【4】 後把name【4】,breath【i】,bite【i】輸入函式 當條件符合的時候,在函式裡面輸出人的名字name【4】 後來發現輸出的人名字都是應該是錯誤了。 之後,放棄前面的思想 用外掛的思想 1、把人名字都輸入一個數組char name[4*n];。 2、每一個元素都代表一個字母。

for (i=0;i<n;i++)
	{
		scanf ("%3s %d %d",&name[a],&breath[i],&bite[i]);
		a+=4;
	}

3、把符合條件的人名字所在的元素挑出來列印。

	for (j=i*4;j<i*4+3;j++)
			{
				printf ("%c",name[j]);
			}

這樣,就能輸出人的名字了。 下面,是詳細的程式碼:

#include <stdio.h>
int main ()
{
	int n;
	
	scanf ("%d",&n);
	
	char name[4*n];
	int breath[n];
	int bite[n];
	int i, j;
	int a = 0;
	int count=0;
	int number=0;
	
	for (i=0;i<n;i++)
	{
		scanf ("%3s %d %d",&name[a],&breath[i],&bite[i]);
		a+=4;
	}
	for (i=0;i<n;i++)
	{
		if (breath[i]<15||breath[i]>20||bite[i]<50||bite[i]>70)
		{
			count++;
		}
	}
	for (i=0;i<n;i++)
	{
		if (breath[i]<15||breath[i]>20||bite[i]<50||bite[i]>70)
		{
			for (j=i*4;j<i*4+3;j++)
			{
				printf ("%c",name[j]);
			}
			number++;
			if (number<count)
			{
				printf ("\n");
			}
		}
	}
	return 0;
}

這裡面都是大白話,希望大家不要介意,能夠諒解!