c語言裝載問題
㈠ c語言基本問題
一、C語言規定總是從main()開始執行的(這個函數也叫「主函數」)。因此,你發來的題目中的(1、6、8)敘述都是錯誤的,都應該選擇F。
二、第2題中,C語言對其數據在內存中所佔用的實際位元組數,隨著程序中聲明的數據類型以及數據的多少而變化,C語言本身並沒有明確規定。這題應該選F。
三、第3題,C語言中強制類型轉換,僅對轉換的語句有效,而不會改變所轉換變數的原有數據類型,這是正確的,應該選T。
四、第4題,i=8,j=10;printf("%d,%d,%d,%d\n",i,j,++i,j++);實際上是一個程序執行類題目,執行這一句時,先取得ij變數的值,其中有一個++i(先自增),一個j++(後自增),先自增的i先加上1,也就是i=8+1=9,而後自增的j在列印之後再加1,所以列印時仍是j=10。所以列印出來是:9 10 9 10。這是正確的。
五、第5題「C語言中放在「」之間的內容都被視為字元串的一個構成部分,都可以在屏幕上原樣顯示」的說法是錯誤的。舉一個例子就可以了:print("%d",8);是列印不出來%d的,它只能列印出來8。所以它是錯的。
六、第7題,設x、t均為int型變數,則執行語句"x = 10;t = x && x >10;"後,t的值為,這個題目好似沒有寫完,成了填空題了,現在來看計算過程,t = x && x >10,根據計算的優先順序,>號是6級,&&是11級,先計算x >10,因為x=10,故x>10是不成立的,所以它的值是0,第二步再計算x && 0=10 && 0=0。t的值最後應該是0。
希望對你有所幫助。
㈡ 子集樹問題(用C語言或C++完成)
//說明:我是用c++編的。解法是用棧來進行遞歸模擬,解法編譯過是正確的。我有注釋說明。不過要改成遞歸比較麻煩。而且,解題一般是不會限制解法的,你看看這個非遞歸的解法吧。
#include <iostream>
#include <string>
using namespace std;
void main(){
int i,j,n,c,temp,L[100],S[100],p,sum,Get,max;
cin>>n>>c;
for (i=0;i<n;i++){
cin>>L[i];
}
max=0;
sum=0;
p=-1;//棧初始化
for (i=0;i<n;i++){
if (sum+L[i]<=c) {
sum=sum+L[i];
p++;
S[p]=i;//i入棧
break;//尋找第一個
}
}
while ((p!=-1)||(i<=n-1)){//當棧不空或未檢索到末尾時運行
if (i<=n-1){//如果是未檢索到末尾時
Get=S[p];//取棧頂元素
for (i=Get+1;i<n;i++){
if (sum+L[i]<=c) {
sum=sum+L[i];
p++;
S[p]=i;//i入棧
}
}
}
if(i==n){//如果檢索到末尾但棧不為空時
if (sum>max) max=sum;
Get=S[p];//取棧頂元素
/*for (j=0;j<=p;j++){
temp=S[j];
cout<<L[temp]<<" ";
}
cout<<endl;*///說明此處用來檢驗棧模擬的過程,及其正確性,可輸出解的子集,你可以看看
p--;//模擬出棧
//cout<<max<<" ";
sum=sum-L[Get];//還原
for (i=Get+1;i<n;i++){//
if (sum+L[i]<=c) {
sum=sum+L[i];
p++;
S[p]=i;//i入棧
break;//尋找下一個
}
}
}
}
cout<<max<<endl;
}
㈢ C語言關於裝載問題(背包問題)的一個程序 我寫的程序輸出不滿足題意 但我檢查不出來錯誤 希望大神解決
想法:是先讓c1船盡量裝貨物是可以的,但是演算法應該不對,可以用下面的演算法
// 前k個數中去任意個數,且這些數之和為s的取法是否存在
int main()
{
int n, i, k1, k2, s, u;
cin >> n;
for (i=1; i<=2*n; i++)
cin >> A[i];
int sum = 0;
for (i=1; i<=2*n; i++)
sum += A[i];
memset(dp,0,sizeof(dp));
dp[0][0]=true;
// 外階段k1表示第k1個數,內階段k2表示選取數的個數
for (k1=1; k1<=2*n; k1++) // 外階段k1
{
for (k2=k1; k2>=1; k2--) // 內階段k2
for (s=1; s<=sum/2; s++) // 狀態s
{
//dp[k1][s] = dp[k1-1][s];
// 有兩個決策包含或不包含元素k1
if (s>=A[k1] && dp[k2-1][s-A[k1]])
dp[k2][s] = true;
}
}
// 之前的dp[k][s]表示從前k個數中取任意k個數,經過下面的步驟後
// 即表示從前k個數中取任意個數
for (k1=2; k1<=2*n; k1++)
for (s=1; s<=sum/2; s++)
if (dp[k1-1][s]) dp[k1][s]=true;
// 確定最接近的給定值sum/2的和
for (s=sum/2; s>=1 && !dp[2*n][s]; s--);
}
㈣ c語言的程序運行錯誤怎麼解
有錯誤,就首先要要找出錯誤的原因,這個過程稱為debug。
之後再編譯運行。
如果很難定位錯誤的位置,建議在程序里增加debug語句,簡單列印出程序中的位置行號,等等。
如果發現了錯誤的大概位置,但是很難找到錯誤的原因,就要使用debug工具,設置斷點,單步跟蹤執行,精確找到錯誤位置。
程序中錯誤大都不止一個,如果編譯運行後,依然有錯誤,重復上述過程。