洛谷P1957 做題筆記

tense T·L發表於2020-10-19

洛谷P1957做題筆記

程式碼如下:

#include<stdio.h>
#include<string.h>
#define N 10001 
char s[N],s1[N],s2[N];
char ch,t;
int x,y;
int len,len1,len2;
void sort (char t)
{
	if(t=='a')
	{
		int sum=x+y;
		sprintf(s,"%d+%d=%d",x,y,sum);
		printf("%s",s);
		len=strlen(s);
		printf("\n");
		printf("%d\n",len);
	}
		if(t=='b')
	{
		int sum=x-y;
		sprintf(s,"%d-%d=%d",x,y,sum);
		printf("%s",s);
		len=strlen(s);
		printf("\n");
		printf("%d\n",len);
	}
		if(t=='c')
	{
		int sum=x*y;
		sprintf(s,"%d*%d=%d",x,y,sum);
		printf("%s",s);
		len=strlen(s);
		printf("\n");
		printf("%d\n",len);
	}
	memset(s1,0,strlen(s1));
		memset(s2,0,strlen(s2));
		memset(s,0,strlen(s));
	
}
int main()
{
	int n;
	scanf("%d",&n);
//	printf("%d\n",n);
	for(int i=0;i<n;i++)
	{
	
		scanf(" ");
		scanf("%c",&ch);
		if('a'<=ch&&ch<='c')
		{
			scanf(" ");
			t=ch;
//			printf("t=%c\n",t);
			scanf("%d%d",&x,&y);
		}
		else 
		{
			int v=1,b=0;
			scanf(" ");
			s1[0]=ch;
		//	printf("s1[0]=%c\n",s1[0]);
			while(1)
			{
				scanf("%c",&ch);
				if(ch==' ')
				break; 
				else
				{
				s1[v]=ch;
			    //printf("s[v]=%c v=%d\n",s1[v],v);
				v++;
			    } 
			}
			gets(s2);
			len1=strlen(s1);
			len2=strlen(s2);
			//printf("len1=%d len2=%d\n",len1,len2);
			sscanf(s1,"%d",&x);
			sscanf(s2,"%d",&y);
		}
		sort(t);	
	
	}
	return 0;
} 

關於此題的幾點總結:
1.1 對memset()函式的使用的理解
眾所周知,memset()的主要用法為將陣列清零。但如何清零是作為新手的第一個問題。
關於這個函式我試過三種方式,只有一種達到目的。
1.1.1

memste(s1,'0',sizeof(s1));

這樣做會使s1的所有元素變為’0‘。如果用strlen(s1)去檢視字串長度的話,可以發現長度為100(定義的長度),所以這樣做的目的是將陣列內的所有開闢的記憶體存入’0‘。
1.1.2

memset(s1,'0',strlen(s1));

這樣做也是代換的一種,和上一種方式不同的點是這個只會將輸入的字元替換為’0‘。
1.1.3

memset(s1,0,strlen(s1));

這樣做和前兩種不一樣,這樣寫才能做到真正意思上的“重啟”。
1.2 對sscanf()的初級使用
1.2.1
擷取片段文章:
(1)sscanf("zhoue3456 ", “%4s”, str); //取指定長度的字串
printf(“str=%s\n”, str); //str=“zhou”;
這裡我先學習sscanf()的最初級用法
可以看出,sscanf()函式的主要用法是對字串的擷取和強制轉換。
但要注意

int n;
char s[100];
scanf("%d",&n);
sscanf("n","%s",s);

*這樣做是無效的,輸出的s為n。 *
參考Citronnelle2的文章:

定義函式 int sscanf (const char *str,const char * format,…);
函式說明
sscanf()會將引數str的字串根據引數format字串來轉換並格式化資料。格式轉換形式請參考scanf()。轉換後的結果存於對應的引數內。
返回值 成功則返回引數數目,失敗則返回-1,錯誤原因存於errno中。 返回0表示失敗 否則,表示正確格式化資料的個數

由此定義可知,前面的引數一定要是一個char型別的引數,int型別的不可以作為引數輸入。
所以目前看來sscanf()的用法主要是將char 型別的陣列轉變為int 型別輸入到一個引數中去,這樣做可以在一定程度上化簡步驟。
1.3 對sprintf()函式的使用

格式化數字字串
sprintf 最常見的應用之一莫過於把整數列印到字串中,所以,spritnf 在大多數場合可以替代
itoa。

如: //把整數123 列印成一個字串儲存在s 中。 sprintf(s, “%d”, 123); //產生"123"
可以指定寬度,不足的左邊補空格: sprintf(s, “%8d%8d”, 123, 4567); //產生:" 123 4567"
當然也可以左對齊: sprintf(s, “%-8d%8d”, 123, 4567); //產生:“123 4567”

說簡單點就是將整數型別轉變為char型別儲存到陣列中去,這樣做的主要好處就是便於計算長度,如此題中的計算a+b=c的長度。
但是,要注意一點

sprintf(s,"%d+%d=%d\n",a,b,c);

如果在第二欄裡面輸入了一個’\n‘,那麼你用strlen()計算出來的長度會包括一個’\n‘。所以如果你要實現換行,最好令起一行輸入

printf("\n");

相關文章