Ⅰ 篩法求素數,求詳解!謝謝。用c語言實現。。
1、演算法一:令A為素數,則A*N(N>1;N為自然數)都不是素數。 #definerange2000boolIsPrime[range+1];//set函數確定i是否為素數,結果儲存在IsPrime[i]中,此函數在DEVC++中測試通過voidset(boolIsPrime[]){inti,j;for(i=0;i<=range;++i)IsPrime[i]=true;IsPrime[0]=IsPrime[1]=false;for(i=2;i<=range;++i){if(IsPrime[i]){for(j=2*i;j<=range;j+=i)IsPrime[j]=false;}}}2、
說明:解決這個問題的訣竅是如何安排刪除的次序,使得每一個非質數都只被刪除一次。 中學時學過一個因式分解定理,他說任何一個非質(合)數都可以分解成質數的連乘積。例如,16=2^4,18=2 * 3^2,691488=2^5 * 3^2 * 7^4等。如果把因式分解中最小質數寫在最左邊,有16=4^2,18=2*9,691488=2^5 * 21609,;換句話說,把合數N寫成N=p^k * q,此時q當然是大於p的,因為p是因式分解中最小的質數。由於因式分解的唯一性,任何一個合數N,寫成N=p^k * q;的方式也是唯一的。 由於q>=p的關系,因此在刪除非質數時,如果已知p是質數,可以先刪除p^2,p^3,p^4,... ,再刪除pq,p^2*q,p^3*q,...,(q是比p大而沒有被刪除的數),一直到pq>N為止。
因為每個非質數都只被刪除一次,可想而知,這個程序的速度一定相當快。依據Gries與Misra的文章,線性的時間,也就是與N成正比的時間就足夠了(此時要找出2N的質數)。 (摘自《C語言名題精選百則(技巧篇)》,冼鏡光 編著,機械工業出版社,2005年7月第一版第一次印刷)。代碼如下: #include<iostream>#include<cmath>usingnamespacestd;intmain(){intN;cin>>N;int*Location=newint[N+1];for(inti=0;i!=N+1;++i)Location[i]=i;Location[1]=0;//篩除部分intp,q,end;end=sqrt((double)N)+1;for(p=2;p!=end;++p){if(Location[p]){for(q=p;p*q<=N;++q){if(Location[q]){for(intk=p*q;k<=N;k*=p)Location[k]=0;}}}}intm=0;for(inti=1;i!=N+1;++i){if(Location[i]!=0){cout<<Location[i]<<;++m;}if(m%10==0)cout<<endl;}cout<<endl<<m<<endl;return0;}該代碼在Visual Studio 2010 環境下測試通過。
以上兩種演算法在小數據下速度幾乎相同。
Ⅱ 求C語言經典編程282例,求這本書的PDF或是其他文檔的文件,我郵箱[email protected]
【程序1】
題目:有1、2、3、4個數字,能組成多少個互不相同且無重復數字的三位數?都是多少?
1.程序分析:可填在百位、十位、個位的數字都是1、2、3、4。組成所有的排列後再去
掉不滿足條件的排列。
2.程序源代碼:
main()
{
int i,j,k;
printf("\n");
for(i=1;i<5;i++)
for(j=1;j<5;j++)
for (k=1;k<5;k++)
{
if (i!=k&&i!=j&&j!=k)
printf("%d,%d,%d\n",i,j,k);
}
}
【程序2】
題目:企業發放的獎金根據利潤提成。利潤(I)低於或等於10萬元時,獎金可提10%;利潤高
於10萬元,低於20萬元時,低於10萬元的部分按10%提成,高於10萬元的部分,可可提
成7.5%;20萬到40萬之間時,高於20萬元的部分,可提成5%;40萬到60萬之間時高於
40萬元的部分,可提成3%;60萬到100萬之間時,高於60萬元的部分,可提成1.5%,高於
100萬元時,超過100萬元的部分按1%提成,從鍵盤輸入當月利潤I,求應發放獎金總數?
1.程序分析:請利用數軸來分界,定位。注意定義時需把獎金定義成長整型。
2.程序源代碼:
main()
{
long int i;
int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
scanf("%ld",&i);
bonus1=100000*0.1;bonus2=bonus1+100000*0.75;
bonus4=bonus2+200000*0.5;
bonus6=bonus4+200000*0.3;
bonus10=bonus6+400000*0.15;
if(i<=100000)
bonus=i*0.1;
else if(i<=200000)
bonus=bonus1+(i-100000)*0.075;
else if(i<=400000)
bonus=bonus2+(i-200000)*0.05;
else if(i<=600000)
bonus=bonus4+(i-400000)*0.03;
else if(i<=1000000)
bonus=bonus6+(i-600000)*0.015;
else
bonus=bonus10+(i-1000000)*0.01;
printf("bonus=%d",bonus);
}
【程序3】
題目:一個整數,它加上100後是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?
1.程序分析:在10萬以內判斷,先將該數加上100後再開方,再將該數加上268後再開方,如果開方後
的結果滿足如下條件,即是結果。請看具體分析:
2.程序源代碼:
#i nclude "math.h"
main()
{
long int i,x,y,z;
for (i=1;i<100000;i++)
{ x=sqrt(i+100); /*x為加上100後開方後的結果*/
y=sqrt(i+268); /*y為再加上168後開方後的結果*/
if(x*x==i+100&&y*y==i+268)/*如果一個數的平方根的平方等於該數,這說明此數是完全平方數*/
printf("\n%ld\n",i);
}
}
【程序4】
題目:輸入某年某月某日,判斷這一天是這一年的第幾天?
1.程序分析:以3月5日為例,應該先把前兩個月的加起來,然後再加上5天即本年的第幾天,特殊
情況,閏年且輸入月份大於3時需考慮多加一天。
2.程序源代碼:
main()
{
int day,month,year,sum,leap;
printf("\nplease input year,month,day\n");
scanf("%d,%d,%d",&year,&month,&day);
switch(month)/*先計算某月以前月份的總天數*/
{
case 1:sum=0;break;
case 2:sum=31;break;
case 3:sum=59;break;
case 4:sum=90;break;
case 5:sum=120;break;
case 6:sum=151;break;
case 7:sum=181;break;
case 8:sum=212;break;
case 9:sum=243;break;
case 10:sum=273;break;
case 11:sum=304;break;
case 12:sum=334;break;
default: printf("data error");break;
}
sum=sum+day; /*再加上某天的天數*/
if(year%400==0||(year%4==0&&year%100!=0))/*判斷是不是閏年*/
leap=1;
else
leap=0;
if(leap==1&&month>2)/*如果是閏年且月份大於2,總天數應該加一天*/
sum++;
printf("It is the %dth day.",sum);}
【程序5】
題目:輸入三個整數x,y,z,請把這三個數由小到大輸出。
1.程序分析:我們想辦法把最小的數放到x上,先將x與y進行比較,如果x>y則將x與y的值進行交換,
然後再用x與z進行比較,如果x>z則將x與z的值進行交換,這樣能使x最小。
2.程序源代碼:
main()
{
int x,y,z,t;
scanf("%d%d%d",&x,&y,&z);
if (x>y)
{t=x;x=y;y=t;} /*交換x,y的值*/
if(x>z)
{t=z;z=x;x=t;}/*交換x,z的值*/
if(y>z)
{t=y;y=z;z=t;}/*交換z,y的值*/
printf("small to big: %d %d %d\n",x,y,z);
}
【程序6】
題目:用*號輸出字母C的圖案。
1.程序分析:可先用'*'號在紙上寫出字母C,再分行輸出。
2.程序源代碼:
#i nclude "stdio.h"
main()
{
printf("Hello C-world!\n");
printf(" ****\n");
printf(" *\n");
printf(" * \n");
printf(" ****\n");
}
【程序7】
題目:輸出特殊圖案,請在c環境中運行,看一看,Very Beautiful!
1.程序分析:字元共有256個。不同字元,圖形不一樣。
2.程序源代碼:
#i nclude "stdio.h"
main()
{
char a=176,b=219;
printf("%c%c%c%c%c\n",b,a,a,a,b);
printf("%c%c%c%c%c\n",a,b,a,b,a);
printf("%c%c%c%c%c\n",a,a,b,a,a);
printf("%c%c%c%c%c\n",a,b,a,b,a);
printf("%c%c%c%c%c\n",b,a,a,a,b);}
【程序8】
題目:輸出9*9口訣。
1.程序分析:分行與列考慮,共9行9列,i控制行,j控制列。
2.程序源代碼:
#i nclude "stdio.h"
main()
{
int i,j,result;
printf("\n");
for (i=1;i<10;i++)
{ for(j=1;j<10;j++)
{
result=i*j;
printf("%d*%d=%-3d",i,j,result);/*-3d表示左對齊,佔3位*/
}
printf("\n");/*每一行後換行*/
}
}
【程序9】
題目:要求輸出國際象棋棋盤。
1.程序分析:用i控制行,j來控制列,根據i+j的和的變化來控制輸出黑方格,還是白方格。
2.程序源代碼:
#i nclude "stdio.h"
main()
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
if((i+j)%2==0)
printf("%c%c",219,219);
else
printf(" ");
printf("\n");
}
}
【程序10】
題目:列印樓梯,同時在樓梯上方列印兩個笑臉。
1.程序分析:用i控制行,j來控制列,j根據i的變化來控制輸出黑方格的個數。
2.程序源代碼:
#i nclude "stdio.h"
main()
{
int i,j;
printf("\1\1\n");/*輸出兩個笑臉*/
for(i=1;i<11;i++)
{
for(j=1;j<=i;j++)
printf("%c%c",219,219);
printf("\n");
}
}
【程序11】
題目:古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月
後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?
1.程序分析:兔子的規律為數列1,1,2,3,5,8,13,21....
2.程序源代碼:
main()
{
long f1,f2;
int i;
f1=f2=1;
for(i=1;i<=20;i++)
{ printf("%12ld %12ld",f1,f2);
if(i%2==0) printf("\n");/*控制輸出,每行四個*/
f1=f1+f2; /*前兩個月加起來賦值給第三個月*/
f2=f1+f2; /*前兩個月加起來賦值給第三個月*/
}
}
【程序12】
題目:判斷101-200之間有多少個素數,並輸出所有素數。
1.程序分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除,
則表明此數不是素數,反之是素數。
2.程序源代碼:
#i nclude "math.h"
main()
{
int m,i,k,h=0,leap=1;
printf("\n");
for(m=101;m<=200;m++)
{ k=sqrt(m+1);
for(i=2;i<=k;i++)
if(m%i==0)
{leap=0;break;}
if(leap) {printf("%-4d",m);h++;
if(h%10==0)
printf("\n");
}
leap=1;
}
printf("\nThe total is %d",h);
}
【程序13】
題目:列印出所有的「水仙花數」,所謂「水仙花數」是指一個三位數,其各位數字立方和等於該數
本身。例如:153是一個「水仙花數」,因為153=1的三次方+5的三次方+3的三次方。
1.程序分析:利用for循環控制100-999個數,每個數分解出個位,十位,百位。
2.程序源代碼:
main()
{
int i,j,k,n;
printf("'water flower'number is:");
for(n=100;n<1000;n++)
{
i=n/100;/*分解出百位*/
j=n/10%10;/*分解出十位*/
k=n%10;/*分解出個位*/
if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)
{
printf("%-5d",n);
}
}
printf("\n");
}
【程序14】
題目:將一個正整數分解質因數。例如:輸入90,列印出90=2*3*3*5。
程序分析:對n進行分解質因數,應先找到一個最小的質數k,然後按下述步驟完成:
(1)如果這個質數恰等於n,則說明分解質因數的過程已經結束,列印出即可。
(2)如果n<>k,但n能被k整除,則應列印出k的值,並用n除以k的商,作為新的正整數你n,
重復執行第一步。
(3)如果n不能被k整除,則用k+1作為k的值,重復執行第一步。
2.程序源代碼:
/* zheng int is divided yinshu*/
main()
{
int n,i;
printf("\nplease input a number:\n");
scanf("%d",&n);
printf("%d=",n);
for(i=2;i<=n;i++)
{
while(n!=i)
{
if(n%i==0)
{ printf("%d*",i);
n=n/i;
}
else
break;
}
}
printf("%d",n);}
【程序15】
題目:利用條件運算符的嵌套來完成此題:學習成績>=90分的同學用A表示,60-89分之間的用B表示,
60分以下的用C表示。
1.程序分析:(a>b)?a:b這是條件運算符的基本例子。
2.程序源代碼:
main()
{
int score;
char grade;
printf("please input a score\n");
scanf("%d",&score);
grade=score>=90? 'A': (score>=60? 'B':'C');
printf("%d belongs to %c",score,grade);
}
【程序16】
題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。
1.程序分析:利用輾除法。
2.程序源代碼:
main()
{
int a,b,num1,num2,temp;
printf("please input two numbers:\n");
scanf("%d,%d",&num1,&num2);
if(num1 { temp=num1;
num1=num2;
num2=temp;
}
a=num1;b=num2;
while(b!=0)/*利用輾除法,直到b為0為止*/
{
temp=a%b;
a=b;
b=temp;
}
printf("gongyueshu:%d\n",a);
printf("gongbeishu:%d\n",num1*num2/a);
}
【程序17】
題目:輸入一行字元,分別統計出其中英文字母、空格、數字和其它字元的個數。
1.程序分析:利用while語句,條件為輸入的字元不為'\n'.
2.程序源代碼:
#i nclude "stdio.h"
main()
{char c;
int letters=0,space=0,digit=0,others=0;
printf("please input some characters\n");
while((c=getchar())!='\n')
{
if(c>='a'&&c<='z'||c>='A'&&c<='Z')
letters++;
else if(c==' ')
space++;
else if(c>='0'&&c<='9')
digit++;
else
others++;
}
printf("all in all:char=%d space=%d digit=%d
others=%d\n",letters,
space,digit,others);
}
【程序18】
題目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數字。例如2+22+222+2222+22222(此時
共有5個數相加),幾個數相加有鍵盤控制。
1.程序分析:關鍵是計算出每一項的值。
2.程序源代碼:
main()
{
int a,n,count=1;
long int sn=0,tn=0;
printf("please input a and n\n");
scanf("%d,%d",&a,&n);
printf("a=%d,n=%d\n",a,n);
while(count<=n)
{
tn=tn+a;
sn=sn+tn;
a=a*10;
++count;
}
printf("a+aa+...=%ld\n",sn);
}
【程序19】
題目:一個數如果恰好等於它的因子之和,這個數就稱為「完數」。例如6=1+2+3.編程
找出1000以內的所有完數。
1. 程序分析:請參照程序<--程序14.
2.程序源代碼:
main()
{
static int k[10];
int i,j,n,s;
for(j=2;j<1000;j++)
{
n=-1;
s=j;
for(i=1;i {
if((j%i)==0)
{n++;
s=s-i;
k[n]=i;
}
}
if(s==0)
{
printf("%d is a wanshu",j);
for(i=0;i printf("%d,",k);
printf("%d\n",k[n]);
}
}
}
【程序20】
題目:一球從100米高度自由落下,每次落地後反跳回原高度的一半;再落下,求它在
第10次落地時,共經過多少米?第10次反彈多高?
1.程序分析:見下面注釋
2.程序源代碼:
main()
{
float sn=100.0,hn=sn/2;
int n;
for(n=2;n<=10;n++)
{
sn=sn+2*hn;/*第n次落地時共經過的米數*/
hn=hn/2; /*第n次反跳高度*/
}
printf("the total of road is %f\n",sn);
printf("the tenth is %f meter\n",hn);
}
其他的等整理出來再發! :) :)
【程序21】
題目:猴子吃桃問題:猴子第一天摘下若干個桃子,當即吃了一半,還不癮,又多吃了一個
第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以後每天早上都吃了前一天剩下
的一半零一個。到第10天早上想再吃時,見只剩下一個桃子了。求第一天共摘了多少。
1.程序分析:採取逆向思維的方法,從後往前推斷。
2.程序源代碼:
main()
{
int day,x1,x2;
day=9;
x2=1;
while(day>0)
{x1=(x2+1)*2;/*第一天的桃子數是第2天桃子數加1後的2倍*/
x2=x1;
day--;
}
printf("the total is %d\n",x1);
}
==============================================================
【程序22】
題目:兩個乒乓球隊進行比賽,各出三人。甲隊為a,b,c三人,乙隊為x,y,z三人。已抽簽決定
比賽名單。有人向隊員打聽比賽的名單。a說他不和x比,c說他不和x,z比,請編程序找出
三隊賽手的名單。
1.程序分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除,
則表明此數不是素數,反之是素數。
2.程序源代碼:
main()
{
char i,j,k;/*i是a的對手,j是b的對手,k是c的對手*/
for(i='x';i<='z';i++)
for(j='x';j<='z';j++)
{
if(i!=j)
for(k='x';k<='z';k++)
{ if(i!=k&&j!=k)
{ if(i!='x'&&k!='x'&&k!='z')
printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);
}
}
}
}
==============================================================
【程序23】
題目:列印出如下圖案(菱形)
*
***
******
********
******
***
*
1.程序分析:先把圖形分成兩部分來看待,前四行一個規律,後三行一個規律,利用雙重
for循環,第一層控制行,第二層控制列。
2.程序源代碼:
main()
{
int i,j,k;
for(i=0;i<=3;i++)
{
for(j=0;j<=2-i;j++)
printf(" ");
for(k=0;k<=2*i;k++)
printf("*");
printf("\n");
}
for(i=0;i<=2;i++)
{
for(j=0;j<=i;j++)
printf(" ");
for(k=0;k<=4-2*i;k++)
printf("*");
printf("\n");
}
}
==============================================================
【程序24】
題目:有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13...求出這個數列的前20項之和。
1.程序分析:請抓住分子與分母的變化規律。
2.程序源代碼:
main()
{
int n,t,number=20;
float a=2,b=1,s=0;
for(n=1;n<=number;n++)
{
s=s+a/b;
t=a;a=a+b;b=t;/*這部分是程序的關鍵,請讀者猜猜t的作用*/
}
printf("sum is %9.6f\n",s);
}
==============================================================
【程序25】
題目:求1+2!+3!+...+20!的和
1.程序分析:此程序只是把累加變成了累乘。
2.程序源代碼:
main()
{
float n,s=0,t=1;
for(n=1;n<=20;n++)
{
t*=n;
s+=t;
}
printf("1+2!+3!...+20!=%e\n",s);
}
==============================================================
【程序26】
題目:利用遞歸方法求5!。
1.程序分析:遞歸公式:fn=fn_1*4!
2.程序源代碼:
#i nclude "stdio.h"
main()
{
int i;
int fact();
for(i=0;i<5;i++)
printf("\40:%d!=%d\n",i,fact(i));
}
int fact(j)
int j;
{
int sum;
if(j==0)
sum=1;
else
sum=j*fact(j-1);
return sum;
}
==============================================================
【程序27】
題目:利用遞歸函數調用方式,將所輸入的5個字元,以相反順序列印出來。
1.程序分析:
2.程序源代碼:
#i nclude "stdio.h"
main()
{
int i=5;
void palin(int n);
printf("\40:");
palin(i);
printf("\n");
}
void palin(n)
int n;
{
char next;
if(n<=1)
{
next=getchar();
printf("\n\0:");
putchar(next);
}
else
{
next=getchar();
palin(n-1);
putchar(next);
}
}
==============================================================
【程序28】
題目:有5個人坐在一起,問第五個人多少歲?他說比第4個人大2歲。問第4個人歲數,他說比第
3個人大2歲。問第三個人,又說比第2人大兩歲。問第2個人,說比第一個人大兩歲。最後
問第一個人,他說是10歲。請問第五個人多大?
1.程序分析:利用遞歸的方法,遞歸分為回推和遞推兩個階段。要想知道第五個人歲數,需知道
第四人的歲數,依次類推,推到第一人(10歲),再往回推。
2.程序源代碼:
age(n)
int n;
{
int c;
if(n==1) c=10;
else c=age(n-1)+2;
return(c);
}
main()
{ printf("%d",age(5));
}
==============================================================
【程序29】
題目:給一個不多於5位的正整數,要求:一、求它是幾位數,二、逆序列印出各位數字。
1. 程序分析:學會分解出每一位數,如下解釋:(這里是一種簡單的演算法,師專數002班趙鑫提供)
2.程序源代碼:
main( )
{
long a,b,c,d,e,x;
scanf("%ld",&x);
a=x/10000;/*分解出萬位*/
b=x%10000/1000;/*分解出千位*/
c=x%1000/100;/*分解出百位*/
d=x%100/10;/*分解出十位*/
e=x%10;/*分解出個位*/
if (a!=0) printf("there are 5, %ld %ld %ld %ld
%ld\n",e,d,c,b,a);
else if (b!=0) printf("there are 4, %ld %ld %ld
%ld\n",e,d,c,b);
else if (c!=0) printf(" there are 3,%ld %ld
%ld\n",e,d,c);
else if (d!=0) printf("there are 2, %ld
%ld\n",e,d);
else if (e!=0) printf(" there are
1,%ld\n",e);
}
==============================================================
【程序30】
題目:一個5位數,判斷它是不是迴文數。即12321是迴文數,個位與萬位相同,十位與千位相同。
1.程序分析:同29例
2.程序源代碼:
main( )
{
long ge,shi,qian,wan,x;
scanf("%ld",&x);
wan=x/10000;
qian=x%10000/1000;
shi=x%100/10;
ge=x%10;
if (ge==wan&&shi==qian)/*個位等於萬位並且十位等於千位*/
printf("this number is a huiwen\n");
else
printf("this number is not a huiwen\n");
}
【程序31】
題目:請輸入星期幾的第一個字母來判斷一下是星期幾,如果第一個字母一樣,則繼續
判斷第二個字母。
1.程序分析:用情況語句比較好,如果第一個字母一樣,則判斷用情況語句或if語句判斷第二個字母。
2.程序源代碼:
#i nclude <stdio.h>
void main()
{
char letter;
printf("please input the first letter of
someday\n");
while ((letter=getch())!='Y')/*當所按字母為Y時才結束*/
{ switch (letter)
{case 'S':printf("please input second letter\n");
if((letter=getch())=='a')
printf("saturday\n");
else if ((letter=getch())=='u')
printf("sunday\n");
else printf("data error\n");
break;
case 'F':printf("friday\n");break;
case 'M':printf("monday\n");break;
case 'T':printf("please input second letter\n");
if((letter=getch())=='u')
printf("tuesday\n");
else if ((letter=getch())=='h')
printf("thursday\n");
else printf("data error\n");
break;
case 'W':printf("wednesday\n");break;
default: printf("data error\n");
}
}
}
==============================================================
【程序32】
題目:Press any key to change color, do you want to
try it. Please hurry up!
1.程序分析:
2.程序源代碼:
#i nclude <conio.h>
void main(void)
{
int color;
for (color = 0; color < 8; color++)
{
textbackground(color);/*設置文本的背景顏色*/
cprintf("This is color %d\r\n", color);
cprintf("Press any key to continue\r\n");
getch();/*輸入字元看不見*/
}
}
==============================================================
【程序33】
題目:學習gotoxy()與clrscr()函數
1.程序分析:
2.程序源代碼:
#i nclude <conio.h>
void main(void)
{
clrscr();/*清屏函數*/
textbackground(2);
gotoxy(1, 5);/*定位函數*/
cprintf("Output at row 5 column 1\n");
textbackground(3);
gotoxy(20, 10);
cprintf("Output at row 10 column 20\n");
}
==============================================================
【程序34】
題目:練習函數調用
1. 程序分析:
2.程序源代碼:
#i nclude <stdio.h>
void hello_world(void)
{
printf("Hello, world!\n");
}
void three_hellos(void)
{
int counter;
for (counter = 1; counter <= 3; counter++)
hello_world();/*調用此函數*/
}
void main(void)
{
three_hellos();/*調用此函數*/
}
Ⅲ c語言題目
(1)遞歸演算法
#define QUEENS 8
int iCount = 0;
int Site[QUEENS];
void Queen(int n);
void Output();
int IsValid(int n);
/*----------------------------Main:主函數。--------------------*/
void main()
{
Queen(0);
getch();
}
/*-----------Queen:遞歸放置第n個皇後,程序的核心!-------------*/
void Queen(int n)
{
int i;
if(n == QUEENS)
{
Output();
return;
}
for(i = 1 ; i <= QUEENS ; i++)
{
Site[n] = i;
if(IsValid(n))
Queen(n+1);
}
}
/*--IsValid:判斷第n個皇後放上去之後,是否合法,即是否無沖突。---*/
int IsValid(int n)
{
int i;
for(i = 0 ; i < n ; i++)
{
if(Site[i] == Site[n])
return 0;
if(abs(Site[i] - Site[n]) == (n - i))
return 0;
}
return 1;
}
/*------Output:輸出一個解,即一種沒有沖突的放置方案。---------*/
void Output()
{
int i;
printf( "No.%-5d " , iCount);
for(i = 0 ; i < QUEENS ; i++ )
printf( "%d " , Site[i]);
printf( "\n ");
}
/*---------非遞歸演算法----------------*/
#include <stdio.h>
#define NCOUNT 8
int nArray[NCOUNT][NCOUNT];
// 判斷一個點是否是安全點
bool IsSafe(int i,int j)
{
int x=i,y=j;
while(1)
{
x -= 1;
if( x<0 )break;
y -= 1;
if( y<0)break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x += 1;
if( x>NCOUNT-1 )break;
y += 1;
if( y >NCOUNT-1 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x -=1;
if( x<0 )break;
y +=1;
if( y>NCOUNT-1 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x +=1;
if( x>NCOUNT-1 )break;
y-=1;
if( y<0 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x -=1;
if( x<0 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x +=1;
if( x>NCOUNT-1 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
y -=1;
if( y<0 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
y +=1;
if( y>NCOUNT-1 )break;
if( nArray[x][y] == 1)return false;
}
return true;
}
void main()
{
int nVe=-1,nHo=0;
bool bRetry = false;
int nSol = 0;
// 清除棋盤
for(int i=0;i<NCOUNT;i++)
{
for( int j=0;j<NCOUNT;j++)
nArray[i][j] = 0;
}
while(1)
{
nVe += 1;
if( nVe>NCOUNT-1)
{// 棋盤放滿,列印當前棋盤上棋子位置
nSol++;
printf("Sol %d: ",nSol);
for(int i=0;i<NCOUNT;i++)
{
for( int j=0;j<NCOUNT;j++)
if( nArray[i][j]==1)
printf("(%d,%d) ",i,j);
}
printf("\r\n");
// 回溯查找下一個可行方案
nVe -= 2;
bRetry = true;
continue;
}
int nFill = 0;
if( bRetry )
{ // 回溯計算
bRetry = false;
for( i=0;i<NCOUNT;i++)
{// 得到棋子的位置
if( nArray[nVe][i] == 1)
{
nArray[nVe][i] = 0;
nFill = i;
break;
}
}
if( nFill == NCOUNT-1)
{// 棋子在當前行已經是最後的位置
// 如果是第一行,演算法結束
if( nVe == 0)
{
getchar();
return;
}
// 否則回溯
nVe -= 2;
bRetry = true;
continue;
}
// 從當前位置之後查找一個安全點
nFill += 1;
}
bool bFilled = false;
for( i=nFill;i<NCOUNT;i++)
{// 當前行查找一個安全點
if( IsSafe(nVe,i))
{
bFilled = true;
nArray[nVe][i] = 1;
break;
}
}
// 找不到安全點,回溯
if( !bFilled )
{
nVe -= 2;
bRetry = true;
}
}
}
(2)
#include <stdio.h>
main()
{
int h,z,s,o;
FILE *fp;
char ch,filename[20];
printf("輸入要統計的文章名稱:\n");
scanf("%s",filename);
if((fp=open(filename,"r"))==NULL)
{
printf("cannot open the file\n");
exit(0);
}
ch=fgetc(fp);
h=0;z=0;s=0;o=0;
while(ch!=EOF)
{
if(ch>'0x7f')
h++;
else if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='z'))
z++;
else if(ch>='0'&&ch<='9')
s++;
else
o++;
ch=fgetc(fp);
}
fclose(fp);
h=h/2;
printf("這篇文章里有 %d 個漢字,%d 個英文字母,%d 個數字和%d 個其他字元\n",h,z,s,o);
}
Ⅳ 麻煩給我傳下最新的計算機三級網路技術和二級C語言的南開一百題和上機模擬軟體。我是今年9月考,謝謝了!2
筆試在70左右,3次上機均為滿分,
看著大批的同學在為三級發愁不知道如何准備和應考。我想我應該把經驗和學習的方法寫下
來,這些方法保證你能過三級。但是不保證你能獲得高分並學到知識,所以請各位計算機系
與愛好電腦的高手或自認為是高手的同志們就此打住。OK!
以網路技術為例(其他三門的方法相似),我把方法總結為:細看書,做筆記,多復習。
第一階段:看網路技術教材,詳細地做筆記(20天).
第一邊看書你要看得特別仔細,把所有你認為重要的地方全抄到筆記本上,包括重要的
表格和插圖。第一次看不懂的地方可以跳過去等過兩天再回頭看一遍。每天看新的知識之前
都將前兩天看的再復習一遍,強化記憶。
我把全書的重要程度劃分了一下:第一,七,八章 了解(看看做做筆記就行了);
第二,四章 理解(看懂主要的知識點);第三,五,六章 掌握(看懂所有的知識點);
其中又以以下章節為重點:2.2 進程 2.3 存儲管理 2.4 文件管理 2.5 設備管理
(我當時這一節的題都掛了) 3.5 雙絞線 VS 同軸電纜 3.6 OSI VS TCP/IP 4.3 乙太網
4.5 組網技術 4.8 網路互連 5.3 IP協議 6.4 加密技術 其中有些內容必須理解並掌握,
要是不理解,背也要背下來。如:OSI協議和TCP/IP協議的各層的名字,各種傳輸介質和各種
乙太網的參數等。
另外所有教材上沒有的內容不用看,因為考試出的題沒有一道是書本之外的。
===> 要點一:堅持就是勝利,每天堅持看2個小時,至少能看15頁。
===> 要點二:該抄就抄,好記性不如壞筆頭。
===> 要點三:注意課後作業題,那可能就是原題。
這一階段完成後,應該能夠理解大部分的知識點。還要能夠很快的在書中找到某個知識
點的位置。
第二階段:復習重點章節(5天)
這一次復習的重點在那些需要理解和掌握的內容上,如果你看懂了,合上書想一遍,看
不懂就多看兩遍,有些重點一定要記住。而且要把筆記本大聲地讀上兩遍,達到更加熟練。
===> 要點一:看懂不一定會記住,一定要在腦海中形成印象,合上書能寫下來。
===> 要點二:名詞術語要注意。
===> 要點三:縮略語。凡是在書上出現過兩遍的,一定要記下中英文解釋。
例如:CDMA/CD,MFLOPS等。
第三階段:復習不重要的章節和作題(5天)
有人也許要問,既然不重要還復習它干什麼。錯!出題人不能用重點湊成一百分要適當的
加點其他內容。於是只有在這些不重要的章節裡面出了,這些題大概佔20分左右。得分的方法
是將所有不太重要的章節再看一遍,越是你認為不可能出的,越要把它抄下來,記一記。而且
要特別注意數字,如ATM的傳輸速率,單模光纖所使用的光的波長等。(上次最嘔吐的的一道
題是,信號從發送站經過衛星到接收站的傳輸延遲的典型值是多少?我按照同步地球衛星到地
球的距離,光的傳輸速度,算到百毫秒的量級,但是算不出具體的值,於是猜了一個250ms。
答案居然是540ms。暈倒~!)
還有就是模擬題的問題,我認為現在市面上的模擬題都太差了,考的全沒有,不考的全有
了,說實話還不如我出的呢。所以題不用多做,只要把書看好就行,最後幾天可以做幾套,熟
悉一下題型,掌握一下時間就夠了,多做全是浪費。
以上方法我一個同學上次照著我說的做了,結果筆試考分比我還高。所以不管你聰明不聰
明,只要你照我說的做了,一定能通過。
一句話:要是不過你拿我是問。
上機部分現在只有一到c語言編程題,非常簡單。但我認為最重要的是能夠編譯程序和調試
程序,也就是說,一道題你能在紙上寫下來還不夠,一定要能夠在機器上運行出結果才行,因為
編譯系統及機器的不同,有的對的程序也可能產生大量的錯誤。只要你能把錯誤找出來就差不多
能過了。
因此我把方法總結為:多思考,多上機,捉蟲子。(以譚浩強的《c語言設計》第二版為例)
第一階段:看書,做筆記。(15天)
有人說那本書那麼厚,15天能看完嗎?錯!誰說讓你們看完了,你要是只是想過三級。只用
看前140頁就足夠了。也就是,第一章,了解,第二,三章理解,第五,六,七章掌握,第八,
第十章隨便看一下就行了。因為c上機只要求你填一個函數,所以函數那一章不用看太仔細,只
要知道函數是干什麼用的,它們之間是如何調用的就行了。至於指針,所有的考題全都能用數組
做出來,用指針只不過是簡單一點,容易出錯一點而已,我是強烈建議不用指針。第九章和第十
一章以後一概不用看。
===> 要點一:勤記,把所有重要的東西都記在筆記本上。如轉義字元的定義等。
===> 要點二:每天上機調試兩個程序(可以是例題或作業題)
===> 要點三:堅持,再堅持。
第二階段:做課後作業題並上機調試。(10天)
現在書你已看完,練習題也可能做出了一些。現在就是要把前幾章特別是五六七三章的課後
題一定要自己思考一下,做出來後再上機調試,是在做不出來,就看看答案,看懂後,再在機器
上調試一下也行。
重要例題:例 4.10 4.12 5.4 5.5 5.6 5.7 5.8 6.6 6.8 6.10 7.2 7.2 7.8 7.9
重要習題:4.5 4.9 5.5 5.7 5.8 6.1~6.10 7.1~7.14
===> 要點一:做題時使用N-S流程圖。
===> 要點二:每道題不管多麼簡單,一定要調試直到正確為止。如習題2.4(2)我有幾個同
學都是能編出來,但是怎麼都運行不正確。
===> 要點三:每天上機作五道題以上,最好在TC2.0環境下。
第三階段:繼續調試重要程序,看一本書(5天)
繼續調試程序直到熟練,然後看一本書,書名我先不說,可能許多同學都知道。但我不贊成
看這本書,而且我勸你到最後幾天再看,挑出一部分典型的題看一下,自己做做,看是否正確,
熟悉一下題型,不要完全依賴那本書。那樣可能因為一點小錯誤你找不出來就掛了。我們班的女
生們第一次因為這個原因掛的可不是少數。
還是那句話:要是你上機不過找我是問。
········回顧過去的大學生活,計算機等級考試最令人難忘。筆者斗膽在這里賣弄一下過去兩年(准確的說是一年半)里通過全國計算機等級考試二到四級的經歷,以自己的感受泡製一份全國計算機等級考試全攻略,希望對後來的朋友們尤其是剛剛邁入大學校門的師弟師妹們有所幫助。
考證路上,有兩點需要特別注意。一是一次只能報考一個等級(包括筆試和上機)的考試。一個級別中有不同類別,考生只能選擇其中一類。另外,考試單科合格者,成績只保留到下一個考試周期。所以不想找麻煩的話就要認真准備,爭取一次OK,否則會對信心造成打擊。
一級考試
對於一級考試,其實沒什麼好說的,大部分人不必報考這一級別,既浪費金錢又浪費生命。因而筆者強烈建議不要考這一級別。如果你不得不參加這一級別考試的話,筆者在表示同情之餘建議你在熟悉常用軟體之餘研究一下WPS,在以後的全國計算機等級考試(一級)中 ,WPS將成為一門單獨的考試科目。
二級考試
二級考試是大部分人都必須參加的。二級考試的內容包括基礎知識和程序設計兩大部分。 基礎知識主要包括電腦基本知識,DOS基本知識和基本操作,WINDOWS的基本概念與操作。關於這部分知識有點水準的輔導書就會有詳細的介紹,只要把書好好看看就沒什麼問題。DOS中的文件、目錄、路徑的概念及使用是必考部分,要留意。(相關閱讀:如何應付新大綱二級考試的公共基礎知識)
二級考試的重中之重是程序部分。要對語言的基礎知識熟練掌握,尤其要留意基礎概念和基本方法(選擇法、冒泡法等),要能看懂書上給的程序。一般來說,如果能獨立做出大部分課後題就一切OK了。對語言的工夫應該下在平時,多想,多練,多上機。自己考慮作一些小程序會有很大幫助的(別人崇敬的目光就會讓你覺得很有價值)。二級DOS類考試的上機考試包括三個部分的內容,即DOS操作題,程序修改題和程序編制題。如果你的C語言有一定水準的話,較難的部分就是程序修改題了,畢竟了解陌生人的思路是一件比較難的事。因此平時要多讀一些程序,自己編程時注意要盡量符合規范,否則很容易吃虧。當然多上機練習是取得好成績的不二法門。關於輔導書大連理工出版社和南開出版社的都相當不錯。
三級考試
三級是一個比較麻煩的等級。它共有四個類別,可以大致分兩種。 三級PC上機是考匯編程序,其他三個類別考C程序。如果不是對自己特別有信心的話一般不要報考PC技術。畢竟學習匯編語言也是不小的負擔 ,而且對報考四級沒什麼幫助(四級不考匯編!)。對於其他三種主要看自己的興趣了。相對來說資料庫要難一點(對數學系的除外)。三級的四個類別各有側重,比較麻煩的是對於四級來說都太片面了,所以幫助不大。因此基礎比較好的,直考四級也是可以考慮的。(相關閱讀:通過計算機等級考試三級網路的經驗)
筆試部分是三級的難點,所要記憶的內容比二級增加很多。要注意對基本理論和基礎概念的掌握,有利於知識網路的形成,減少記憶負擔。
由於三級剛剛改革不久,各個出版社出版的輔導書都很難貼近考試。這種情況下多看書就成了最好的選擇。從近兩次考試的情況看,出題也很接近課本(尤其是網路技術,有部分教材原話)。三級上機考試難度比二級提高並不大,較復雜的部分如文件讀寫,函數調用等通常題目已給出,因而所考的依然是比較基本和典型的演算法。
四級考試
四級是最後一級,也是知識最復雜的一級。報考四級是需要一點信心和勇氣的,你報考四級後身邊幾乎不可避免的出現一片質疑聲(當我報四級時老師竟然告訴我本校從來沒人通過),這時候一定要相信自己。(相關閱讀:幫你全面了解全國計算級等級考試-四級)
四級通過的人數的確是非常少(相對三級),但要看到四級報考人數也是最少的。四級知識量是巨大的(看看那厚厚的教材就知道了),難點主要是離散數學和計算機英語。對於離散數學,如果有機會旁聽一下計算機專業的核心課程《離散數學》會很有幫助的。要記住一定要作一定數量的習題!僅僅通過識記是無法提高水平的。
計算機英語沒有想像中的困難,常用的單詞只有幾百個,只要把近5、6年的試題中英語題過一遍就差不多了。手頭最好有一本專業詞典,大部分單詞在文曲星上查不到 。相對來說英語題比較簡單,只要單詞認識就OK了。
筆試中比較新鮮的是論述題。建議買一本歷年試題及參考答案(每年國家考試中心都出版),仔細研究一下,掌握答題方法。比較幸運的是論述題通常有四道,可以選擇自己最有把握的。由於四級考試已經舉行多年,各出版社出的輔導書都比較扣題。筆者強烈推薦大連理工出版社出版的《全國計算機等級考試題典(四級)》。這本書貼近考試,解答詳盡,對順利過級會有很大幫助!一定要做歷年試題(5年以內),確實是有一定復現率的!
四級上機考試和三級差不多,只有一道編程題,注意別緊張,一定要存檔,否則會變為0分。當時跟我一個考場的同學就有人因為慌亂忘記存檔,造成下午的考試沒有通過。(相關閱讀:全國計算機四級考試經驗談)
結束語:最後,不管面對任何考試都需要對自己要信心,相信即使只有一個人通過,那個人也一定是自己!這時你就成功一半了。預祝每一位考生能夠在9月的考試中取得理想的成績!
計算機考試備忘錄
首先是報考時間問題。雖說大學有四年,但是如果你要考研究生的話(大部分人都會考的),從大三下學期就該開始准備了,所以留給等級考試的時間其實只有兩年半而已(四次機會)。因此,如果你是大一的新生,應該考慮報考明年四月的考試。因為全國計算機等級考試是面對非專業人士的,所以難度並不太高(當然也不很容易,否則聽我嘮叨什麼)。如果你的學校沒有一級必考之類的變態規定話,就應該堅決跳過一級從二級開考(時間寶貴,不應該為沒意義的事浪費半年時光)。平心而論,二級知識非常基礎,只要認真准備(你有整整一個寒假的時間准備)過關是很容易的(即使你的計算機基礎很差)。
雖然三級證書一樣可以拿到學位證,並且越級考試也是被許可的,但筆者不提倡直接報考三級(即使你的計算機基礎很好)。直接過三級雖然是一件很酷的事,但這要擔相當的風險,一旦失誤(這是很可能的事,畢竟三級是有一定難度的),你就不得不與剛通過二級的同學一起考試。除非你的神經有下水管道那麼粗,不然會有很大壓力,而且對信心的打擊不容忽視。如果你對自己的計算機水平很有自信的話,二級證書到手後跳過三級直考四級倒是可以考慮的,那樣風險和效率比較均衡。
另一個比較重要的問題是計算機語言的選擇問題。筆者強烈推薦學習C語言。C語言不但本身邏輯清楚,實用性強而且擴展性很強,方便以後學習C++,C#等語言。如果你有獅子一樣的雄心,更應該選擇C語言,要注意到四級和高級程序員考試都要求C語言!
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@計算機三級考試馬上就要到了,然而很多朋友對計算機上機考試卻仍舊十分茫然,
參加這次考試的人有很大一部分是上次機試沒有通過的朋友,甚至還有一些考了兩次機試都沒有通過的……
這其中不乏一些C語言學的很不錯的高手,大部分人到現在都不明白為什麼自己親手編的程序卻是0分……
究竟是什麼原因呢?不就是那100道題目嗎?翻來覆去的看也沒有發現自己的程序有什麼錯誤啊,看資料,用模擬盤模擬也是滿分啊,可為什麼正式考試就是0分呢?
於是很多人甚至把通過上機考試當成一件*運氣的事了,甚至有的朋友對上機考試感到十分恐懼
然而這其中真正的原因……
大家不妨和我一起看一下考試中心命題組的正確答案~
順便提醒一下大家在考試的時候要注意的問題,希望對大家有所幫助。
第一條:審題要仔細!正式考試的時候會遇到很多面熟的題目,這些題目有的似乎和
平常資料中看到的一樣,然而,千萬不要見到面熟的題目而沾沾自喜,因為有很多的
「陷阱」會使你審題的時候就出錯~!
我們看一道所有人都做過的的 「數字題目」 。
考試中心命題組第23題:
已知在文件in.dat中存有N個實數,(N<200),函數readdat()是讀取這N個實數並存入數組xx中。
請編制函數CalValue(),其功能要求:
1、求出這N個實數的整數部分平均值aver;
2、分別求出這N個實數中其整數部分值小於平均值ever的數的整數部分值之和sumint與小數部分之和sumdec
最後調用函數WriteDat()把所求的結果輸出到文件OUT8.dat中。
這一題看起來很眼熟,然而你仔細看~!
1、aver是整數部分的平均值~!不是普通的哦!
2、整數部分值小於平均值ever的數的整數部分值之和sumint與小數部分之和sumdec!!
呼~,原來這么復雜~!稍不留心就錯了~,結果就想當然的……0分
考試中心命題組第4題
函數ReadDat()實現從文件ENG.IN中讀取一篇英文文章存入到字元
串數組xx中;請編制函數ComWord()分別計算出10個不區分大小寫
的英文單詞的首字母(b,c,f,s,n,r,u,e,o,p)的頻數並依次存入
整型數組yy[0]至yy[9]中,最後調用函數WriteDat( )把結果yy
輸出到文件PS1.OUT中。
這題也很眼熟,然而你仔細看~!
英文單詞的首字母,呵呵,不是平常的字母的個數,是作為單詞的首字母的個數啊,暈~
上面兩道題目並沒有在其他資料上見過,考試的時候也不一定會出,
這里僅僅是給大家提個醒兒,正式考試一定要仔細審題,嚴格按照題目的要求去做,
不要受以前做過的題目的影響。
第二條:一定要考慮除零、溢出、類型轉換、精度等細節問題~!!
雖然我們在平時學C語言的時候老師都提醒過,可是真正到了編程序的時候,
卻沒有幾個人會考慮。這些細節問題似乎並不直接影響題目的輸出結果,
然而,因為溢出和類型轉換錯誤而造成考試得不到滿分的可是大有人在啊!
我們看下面一道最害人的題目~!!,很多朋友考了這道題目都沒有過。
下面來看看你為什麼是0分~!
考試中心命題組64題:
請編制函數encryptChar(),按給定的替代關系對數組xx中的所有字元進行替代,
仍存入數組xx的對應的位置上,最後調用函數WriteDat()把結果xx輸出到文件PS8.DAT中。
替代關系:f(p)=p*11 mod 256 (p是數組中某一個字元的ASCII值,f(p)是計算後新字元的ASCII值),
如果原字元小於等於32或大於130,則該字元不變,否則將f(p)所對應的字元進行替代。
這道題目所有的人都做過,但幾乎就沒有人做對,包括南開無憂在內~!
原因就在於這一句!
無憂:int f; f=(xx[i][k]*11)%256;
南開:char *pf; *pf=*pf*11%256;
表面看來,好象兩個都對,
請你在TC下運行一下下面的代碼,看一下結果你就知道了是怎麼回事了……:
main()
{
char nk='E',*nkp,wuyou='E';
int wy;
nkp=&nk;
*nkp=*nkp*11%256;
wy=wuyou*11%256;
printf("%c %c %c %c\n",nk,*nkp,wuyou,wy);
printf("%d %d %d %d\n",nk,*nkp,wuyou,wy);
}
看到結果了么?是不是很吃驚啊?
≈ ≈ E ≈
-9 -9 69 247
大家看到了,南開的結果是負數,連原來的變數nk都變成了負數,這顯然錯了。
無憂的聰明一點,知道int比char大,定義了個int,對了。
南開錯誤原因就是在TC2.0中char型變數只有一個位元組,根本容納不下'E'*11,
所以產生了溢出,上次考這道題目沒過的同學是不是有所啟發呢?
這里給出考試中心命題組的答案:
void encryptChar(){
int i,k,ch;
for(i=0;i<maxline;i++)
for(k=0;k<strlen(xx[i]);k++){
ch=xx[i][k];
ch=(ch*11)%256;
if(!(ch<=32||ch>=130))xx[i][k]=ch;
}
}
似乎一個例子不能說明什麼,那就把上面的數字題目的答案給大家看看:
考試中心命題組23題答案:
int i;
long val;
float dec;
for(i=0;i<N;i++){
val=(long)xx[i];
aver+=xx[i]-val;
}
aver/=(double)N;
for(i=0;i<N;i++){
val=(long)xx[i];
dec=xx[i]-val;
if(dec>aver){
sumint+=val;
sumdec+=(xx[i]-val);
}
}
看到了吧,首先,val的定義,不是我們習慣的int,而是能容納更大數的 long ,
這樣在求和的時候就不會溢出,無憂和南開的答案沒有吧~
再看,算aver平均值的細節,不是我們平常習慣的aver/=N,更不是無憂的1.0* sum/N,
而是aver/=(double)N,所以大家在考試的時候要時刻注意你的變數類型,特別是在一些求平均值的題目中,千萬要注意,用sum/n的時候,sum的類型一定不要用整形。
第三條:不要使用快捷鍵!!很多人在使用TC的時候習慣於用F9,CTRL+F9或者其他的熱鍵,
首先F9隻是編譯了,並沒有運行程序,考試一定要運行一下你的程序才會有輸出文件,
否則一定是0分。
熱鍵在考試的時候是很危險的,因為UCDOS的熱鍵和TC的沖突,CTRL+F9變成了全形半形轉換,
如果不小心按了,會導致你的程序有中文字元,編譯的時候出錯,而且很難查找排除錯誤~!
所以建議大家在考試的時候使用ALT+紅色字母 來調出菜單進行編譯調試等步驟,建議步驟為:
寫完代碼後用ALT+F,S存檔,然後ALT+C,M編譯,然後ALT+R,R運行,這樣就萬無一失了。
第四條:不要載入任何輸入法
上機考試用的DOS環境內存十分有限,如果你載入了任何一個輸入法,都有可能造成編譯程序的時候出現out of memory 內存不足的情況,到那時就麻煩了。
程序只要寫的對就可以,不要畫蛇添足的加註釋,沒有人看的~!
第五條:不要提前交卷!考場一般使用NOVELL網路,有的時候存在網路狀況不好而連接失敗等問題,
這時,如果你已經提前交卷的話就不太好了。另外也可以防止別人有意無意的改動你的程序。
第六條:考試時候的一些技巧。
1、進入TC以後如果想查看題干要求,不用退出TC,直接用F12就可以顯示出來。
2、用F12顯示題目之後可以通過CTRL+BACKSPACE把題目定在屏幕上。
3、編譯運行之後,可以通過type out.dat或edit out.dat或tc out.dat查看輸出文件。
(千萬不要改動!不然影響考試結果。如果不小心改動,再重新編譯運行一次你的程序就可以了)
4、如果考試的時候不小心改動了代碼的主函數或其他部分,可以進入考生目錄下的warn隱藏目錄,
把里邊的備份文件復制到考生目錄。步驟:
在考生目錄下輸入cd warn
輸入 *.c ..輸入cd ..
就可以了
5、如果調試的時候不小心死循環了,可以通過CTRL+C或CTRL+BREAK來終止,如果連按多次都沒反應,
不要慌,立即找監考老師說明情況,可以重新啟動機器繼續答原題,你的程序還在,時間也是繼續剛才的。
所以這也提醒大家,運行程序之前一定要先存檔。
Ⅳ 請問,哪裡有《C語言名題精選百則(技巧篇)》冼鏡光編著,機械工業出版社
網上書店,當地書店都有得賣,網上也有電子版的書,網上搜索一下有好多的
參考下:http://www.china-pub.com/26253
Ⅵ 有關計算機的好書介紹一下
《編程珠璣》(推薦,思維方法很好)
《c專家編程》(強烈推薦,雖然絕版,而且上面有些不符合現在標準的內容,不過看完後,C的功力還是會大增)
《c++ primer plus》(強烈推薦,C++入門級書本,內容相當詳細)
《effective c++》(強烈推薦,看完C++功力絕對大漲)
《more effective c++》(同上,一個作者寫的)
《c++標准程序庫》(推薦STL入門讀物,可當工具書)
《STL源碼剖析》(推薦,可以先通過該書了解STL的實作,結合現在的代碼,足以讓人領略STL的偉大之處……)
《深入淺出MFC》(說實話,沒看完,不過用來了解MFC的體系還是很不錯的,不推薦初學者看)
《linux c編程》(前半部分講make file很詳細,後半部分就一般般了……)
《UINX環境高級編程(second edition)》(強烈推薦,大師之作,怎能不看?這本英文容易看懂,看英文就可以了)
《linux內核完全剖析》(看得不多,感覺暫時還不大懂-,-)
《windows系統編程》(Johnson M.Hart)(學習windows api的入門書,不是GUI的API)
《Windows程序設計》(Charles Petzold)(強烈推薦,這本用來學習windows GUI就相當合適了)
《java how to program》(推薦,java入門書,內容很不錯)
《java編程思想》(沒讀過英文的,不過中文的讀著很累,對java剖析地很深)
《IBM-PC 匯編語言程序設計》(推薦,學匯編的好書……)
《數據結構與演算法分析——c語言描述》(Mark Allen Weiss)(推薦,內容豐富,不過基本上是偽代碼描述)
《數據結構與程序設計——c語言(第二版)》(Robert L.Kruse)(個人學這本入門,覺得很不錯=。=)
《計算機演算法(c++版)》(後半部分過難還沒看,前半部分還是很不錯的)
《演算法藝術與信息學競賽》(題目無數,提及了相當多的演算法,適合做OI/ICPC導向性讀物。)
《演算法導論(second edition)》(強烈推薦,沒聽過的話太讓人失望了……)
《C語言名題精選百則技巧篇》(推薦,都是一些很經典的東西,代碼風格不錯)
《operating system concepts》(強烈推薦,名著啊)
《modern operating systems》(推薦,英文沒上面那本好懂,不過作者有相同的人)
《artificial intelligence --- a modern approach》(看了一點,學習人工智慧絕對的好書)
《compilers: principles, techniques, and tools》(強烈推薦,學習編譯原理必備)
我很認真的上網搜的,希望可以幫到你,呵呵
Ⅶ 幫忙做幾道C語言的題,謝謝各位大俠
題目太多了!又容易又多!
1、
#include <stdio.h>
main()
{
int a[]={8,6,5,4,1};
int num,i,t;
num=sizeof(a)/sizeof(int);
printf("原始數組:");
for(i=0;i<num;i++)
{
printf("%d ",a[i]);
}
printf("\n");
for(i=0;i<num/2;i++)
{
t=a[i];
a[i]=a[num-i-1];
a[num-i-1]=t;
}
printf("交換後的數組:");
for(i=0;i<num;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
2、
#include <stdio.h>
main()
{
int all,normal,digit,para;
char ch;
all=normal=0;
digit=para=0;
while((ch=getchar())!='#')
{
switch(ch)
{
case '\n'://回車符
para++;
case ' '://空格
case '\t'://Tab
all++;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
digit++;
normal++;
all++;
break;
default:
normal++;
all++;
break;
}
}
printf("含空格、Tab、回車符時的字元個數:%d\n",all);
printf("不含這些字元時的字元個數:%d\n",normal);
printf("數字個數:%d, 文章的段落數:%d\n",digit,para);
}
6、
#include<stdio.h>
#define N 3//手機號碼的數目
main()
{
char a[N][100]={0};
char b[]="1234";
int i,j;
printf("輸入%d個學生的手機號:",N);
for(i=0;i<N;i++)
{
scanf("%s",a[i]);
}
printf("後4位1234的所有手機號碼:\n");
for(i=0;i<N;i++)
{
for(j=0;a[i][j]!='\0';j++)
;
if(a[i][j-4]==b[0]
&&a[i][j-3]==b[1]
&&a[i][j-2]==b[2]
&&a[i][j-1]==b[3])
{
puts(a[i]);
}
}
}
8、
#include<stdio.h>
#define N 2//周數
#define M 5//星期數
main()
{
int a[N][M]={0};
char b[]="1234";
int i,j;
printf("輸入兩周內某學生星期一到星期五的消費額:",N);
for(i=0;i<N;i++)
for(j=0;j<M;j++)
{
scanf("%d",&a[i][j]);
}
printf("第2周星期三所用金額數:%d\n",a[1][2]);
}
九、
#include <stdio.h>
#define M 32
main()
{
int m,n,k=0,bin[M]={0};
printf("請輸入十進制正整數: ");
scanf("%d",&m);
printf("十進制正整數%d轉換成二進制數為: ",m);
while(m!=0)
{
bin[k]=m%2;
m=m/2;
k++;
}
for(n=M-1;n>=0;n--)
{
printf("%d",bin[n]);
if(n%8==0)
{
printf(" ");
}
}
printf("\n");
}
Ⅷ 求c語言典型題目 可追加分!!!
C語言趣味程序百例精解 網路一下前面的內容,是PDF的自己看看吧,超有用的。我只能說,原作者很好很強大!
Ⅸ 推薦幾本c++ c語言 編程實例的書
如果只是想在學校里運用的話就看譚浩強的《C語言編程》《C++語言編程》,即可
如果想以後找工作用得到的話就看《深入淺出MFC》
Ⅹ 演算法分析與設計
計算機編程藝術 --國防科大出的。