本文目錄一覽:
- 1、C語言書上例題看不懂,能幫忙看一下嗎?
- 2、C語言書上的一個例題看不懂
- 3、c語言書上例題error C2660: ‘strl’ : function does not take 1 parameters
C語言書上例題看不懂,能幫忙看一下嗎?
我用文字解釋一下吧,看看能不能清楚,提問的式子我都進行了加粗,希望能看得出來(圖的話我覺得給出的圖已經可以參考講述的,可以結合我的文字看看)
這個傳遞數組名稱的函數,輸入有兩個,一個是數組,一個是數組長度
那麼我們知道:如果傳遞的n是10,數組長度是10的話,它的元素的索引應該是0-9,也就是最大索引是9,n-1所表示的就是索引最大值。
目標是返順序存放,那麼也就意味著應該將第一個元素(索引是0)與最後一個元素(索引是9)進行互換,將第二個元素(索引是1)和倒數第二個元素(索引是8)進行互換……以此類推,直到中間位置也就是索引是4和5進行交換的時候。這個時候的話,4這個截止條件與n的關係是什麼呢?4=(n-1)/2,這裡不是數學,因為n是整型變數,所以等號右邊出來的只會是整數部分。這就是m=(n-1)/2的來源了,也就是設定交換的最後一個元素的索引號。這裡你可以拿奇數個元素去試試,也是同樣成立的。
根據交換過程,那麼也就相應的有了:
i=0時,j=9=10-1-0
i=1時,j=8=10-1-1
…
也就是j=n-1-i這個式子的由來。
知道了左邊,其實右邊和左邊是對應的,只不過左邊用的數組的方式,右邊使用的指針的方式。
注意右邊的i,j聲明的是整型的指針,也就是他只能指向一個整型的變數。題目中輸入*x就是相當於給定數組頭部的位置索引,所以i=x就是相當於讓i這個指針指向數組第一個元素。數組就是一系列整型數字連續順序存儲的結果,所以i+1表示的就是i這個元素的下一個元素,也就是數組的第二個元素,因此j=x+n-1表示i這個指針指向到數組第n個元素,也就是數組的末尾了,此時i,j和前面不一樣的,是都不再表示數組的索引號,而是都是指向某個數組元素的指針了。
這裡還聲明了一個p指針,移動了m位,m和上一個定義沒有區別,就是找到中間位置和開頭位置相差多少個元素,於是p=x+m也就是讓p這個指針指向數組中間的元素。
C語言書上的一個例題看不懂
#includeiostream
#includemath.h
int main(){
int i,j,n,a[101];
for(i=1;i=100;i++)
a[i]=i;
a[1]=0;//1不是素數
for(i=2;isqrt(100.0);i++)//此處為求素數演算法,後面講
for(j=i+1;j=100;j++)
{
if(a[i]!=0a[j]!=0)
if(a[j]%a[i]==0)//能被整除,則不是素數,設置為0
a[j]=0;
}
printf(“\n”);
for(i=2,n=0;i=100;i++)
{
if(a[i]!=0)//這裡是a[i],是因為已經是新的循環了,跟j無關
{
printf(“%5d”,a[i]);
n++;
}
if(n==10)//n為控制換行的計數器,每十個換行。
{
printf(“\n”);
n=0;
}
}
printf(“\n”);
system(“pause”);
return 0;
}
講一下求素數的演算法,以n為例,最簡單的是從2-n/2枚舉,如果n能被整除其中一個整除,就不是素數。這個方法簡單卻沒有效率。
1-100的數中,任意取一個數,如果是非素數,都可以認為是(2-10)取一個數乘以一個小於50的數字,因為=10 後,與另一個數字相乘要=100 就必須另一個數字=10,所以只要測試這個數字能否被2-10整除就可以了這樣就比上面一種方法測試次數少。
當然這也不是最簡單的演算法,這裡介紹另一種。
for(i=3;i=100;i++)
if(i%2==0)//沒必要判斷2以外的偶數
a[i]=0;
else
a[i]=i;
a[1]=0;
a[2]=2;
for(i=3;i=100;i+=2)//從3開始,判斷奇數即可
for(j=3;j=sqrt(i);j+=2)
//因為不用檢測偶數,所以沒必要讓j從2開始,也沒必要為偶數,因此j+=2
if(i%j==0)
a[i]=0;
這演算法和上面方法相同,但反了一反,效果卻差很多,不必從2-10都測試一遍,任意一個數都只要判斷自己的平方根次就可以了,(因為一個數若能拆成2個整數相乘,其中一個必定=自身平方根,另一個=平方根),不必去測試額外的次數,對於大數據量十分有效。
編程的時候把縮進調整好,容易查看,你的縮進不好,程序結構層次不清,就容易造成誤會,把後面的a[i]認為仍然是 for(j=i+1;j=100;j++)這個循環中了
c語言書上例題error C2660: ‘strl’ : function does not take 1 parameters
更改如下:
#includestdio.h
void main()
{
char str[20],*ch=str;
int strl(char); //函數聲明有誤,應含有1個參數,此處已修改
printf(“input string: “);
scanf(“%s”,str);
printf(“string leng=%d\n”,strl(ch));
}
int strl(char *s)
{
char *p=s;
while(*p)
p++;
return(p-s);
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/231687.html