【MOOC】《C語言程序設計(上)》(北京理工大學)中國大學慕課答案_第1頁
【MOOC】《C語言程序設計(上)》(北京理工大學)中國大學慕課答案_第2頁
【MOOC】《C語言程序設計(上)》(北京理工大學)中國大學慕課答案_第3頁
【MOOC】《C語言程序設計(上)》(北京理工大學)中國大學慕課答案_第4頁
【MOOC】《C語言程序設計(上)》(北京理工大學)中國大學慕課答案_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

【MOOC】《C語言程序設計(上)》(北京理工大學)中國大學慕課答案第二周:數據計算實現與順序結構程序設計(一)第二周作業(yè)1.單選題:下列可以正確表示字符型常數的是____

選項:

A、'\t’

B、"a"

C、"\n"

D、297

答案:【'\t’】2.單選題:已知intx=5,y=5,z=5;執(zhí)行語句x%=y+z;后,x的值是____

選項:

A、5

B、0

C、1

D、6

答案:【5】3.單選題:已知inti=5;執(zhí)行語句i+=++i;i的值是____

選項:

A、12

B、10

C、11

D、其他答案都不對

答案:【12】4.單選題:已知:chara;intb;floatc;doubled;執(zhí)行語句c=a+b+c+d;后,變量c的數據類型是____

選項:

A、float

B、int

C、char

D、double

答案:【float】5.單選題:已知”inta=5,b=5,c;”,則執(zhí)行表達式”c=a=a>b”后變量a的值為____

選項:

A、0

B、1

C、4

D、5

答案:【0】6.單選題:已知:intx,y;doublez;則以下語句中錯誤的函數調用是____

選項:

A、scanf("%x%o%6.2f",&x,&y,&z)

B、scanf("%d,%lx,%le",&x,&y,&z)

C、scanf("%2d%d%lf",&x,&y,&z)

D、scanf("%x%*d%o",&x,&y)

答案:【scanf("%x%o%6.2f",&x,&y,&z)】7.單選題:已知inti=10;表達式“20-0<=i<=9”的值是____

選項:

A、1

B、0

C、19

D、20

答案:【1】8.單選題:溫度華氏和攝氏的關系是:C=5(F-32)/9。已知:floatC,F;由華氏求攝氏的正確的賦值表達式是____

選項:

A、C=5*(F-32)/9

B、C=5/9(F-32)

C、C=5/9*(F-32)

D、三個表達式都正確

答案:【C=5*(F-32)/9】9.單選題:把算術表達式表示為一個C語言表達式,正確的寫法是____

選項:

A、–(31.6*a*8+1.0/7)*12

B、–(31.6a*8+1/7)*12

C、–(31.6a*8.0+1.0/7.0)*12

D、–31.6*a*8+1.0/7*12

答案:【–(31.6*a*8+1.0/7)*12】10.單選題:字符串"\\\065a,\n"的長度是____

選項:

A、5

B、8

C、7

D、6

答案:【5】第三周:數據計算實現與順序結構程序設計(二)第三周編程作業(yè)1.判斷三角形的形狀。題目內容:輸入三角型的三條邊,判斷三角形的形狀。假設輸入的三邊邊長均>0。輸入格式:三角型的3條邊的長度(int型)。輸出格式:等邊三角形:equilateraltriangle等腰三角形:isocelestriangle不構成三角形:non-triangle一般三角形:triangle輸入樣例:222輸出樣例:equilateraltriangle.

答案:【下面是一個C語言程序,用于判斷輸入的三條邊是否能構成三角形,并判斷其形狀:

#include<stdio.h→

intmain(){

inta,b,c;

//輸入三條邊的長度

printf("請輸入三角形的三條邊的長度(整數):");

scanf("%d%d%d",&a,&b,&c);

//判斷是否能構成三角形

if(a+b<=c||a+c<=b||b+c<=a){

printf("non-triangle.\n");

}else{

//判斷三角形的形狀

if(a==b&&b==c){

printf("equilateraltriangle.\n");

}elseif(a==b||b==c||a==c){

printf("isocelestriangle.\n");

}else{

printf("triangle.\n");

}

}

return0;

}】2.一年級的算術題。題目內容:小明上小學一年級了,老師已經教會了他們進行整數的+、-、*、/、%計算,下面老師開始出題,給出一個簡單的算術表達式,請小明給出計算結果。輸入格式:接受兩個整數,每個整數之間使用空格分隔。例如輸入格式為:123444輸出格式:分別輸出按照整型數據進行+、-、*、/、*之后的運行結果。輸入樣例:103輸出樣例:10+3=1310-3=710*3=3010/3=310%3=1

答案:【#include<stdio.h→

intmain(){

inta,b;

//輸入兩個整數

printf("請輸入兩個整數,用空格分隔:");

scanf("%d%d",&a,&b);

//計算并輸出結果

printf("%d+%d=%d\n",a,b,a+b);

printf("%d-%d=%d\n",a,b,a-b);

printf("%d*%d=%d\n",a,b,a*b);

printf("%d/%d=%d\n",a,b,a/b);

printf("%d%%%d=%d\n",a,b,a%b);

return0;

}】3.輸出字符的ASCII碼。題目內容:我們在計算機基礎中已經學過:字母在計算機中采用ASCII碼進行存儲。下面要從鍵盤上輸入任意一個字符,然后輸出該字符對應的ASCII碼。輸入格式:一個字符輸出格式:該字符對應的ASCII碼輸入樣例:A輸出樣例:TheASCIIofcharacter'A'is65.

答案:【#include<stdio.h→

intmain(){

charch;

//輸入一個字符

printf("請輸入一個字符:");

scanf("%c",&ch);

//輸出該字符對應的ASCII碼

printf("TheASCIIofcharacter'%c'is%d.\n",ch,(int)ch);

return0;

}】4.學學scanf和printf的用法吧。題目內容:該如何處理double型的數據:如何定義變量類型?如何使用scanf函數?如果已知圓柱的底面半徑r,以及高h,則可計算出圓柱的側面積,體積。其中。輸入格式:第一行輸入圓柱的底面半徑r第二行輸入圓柱的高h輸出格式:s=<圓柱的側面積>,v=<圓柱的體積>要求1.所有變量都定義為雙精度類型2.結果精確到小數點后兩位。作為練習題目:我們已經給您編寫好了大部分的代碼,請您自己修改幾個地方,完成程序的剩余部分。**********************************************分隔線************#include#definePAI3.1415926intmain(){intr,h;doubles,v;scanf("%d%d",);s=2*PAI*r*h;v=PAI*r*r*h;printf("s=%.2f,v=\n",s,);return0;}輸入樣例:28輸出樣例:s=100.53,v=100.53

答案:【#include<stdio.h>

#definePI3.1415926

intmain(){

doubler,h;//將r和h定義為double類型

doubles,v;//s和v已經是double類型

//使用scanf讀取兩個double類型的值

scanf("%lf",&r);

scanf("%lf",&h);

//計算圓柱的側面積和體積

s=2*PI*r*h;

v=PI*r*r*h;

//輸出結果,精確到小數點后兩位

printf("s=%.2f,v=%.2f\n",s,v);

return0;

}】5.讓我們學習用C語言向世界問好?!癏elloWorld”示例程序最早出現于1972年,由貝爾實驗室成員BrianKernighan撰寫的內部技術文件《IntroductiontotheLanguageB》之中。不久同作者于1974年所撰寫的《ProgramminginC:ATutorial》,也延用這個示例。一般來說,這是每一種計算機編程語言中最基本、最簡單的程序,亦通常是初學者所編寫的第一個程序。它還可以用來確定該語言的編譯器、程序開發(fā)環(huán)境,以及運行環(huán)境是否已經安裝妥當。將“HelloWorld”作為第一個示范程序,已經成為編程語言學習的傳統(tǒng)。我們在這里繼續(xù)傳統(tǒng),這也是一種向前輩們致敬的方式之一吧!最早的程序基本是這個樣子的:#includeintmain(){printf("Helloworld.\n");return0;}請模仿上面的程序,看看是否可以通過編譯?如果你能通過這個簡單的程序,那就讓我們繼續(xù)完成后面的習題吧。

答案:【#include<stdio.h>

intmaxSubArray(int*nums,intnumsSize){

intmaxEndingHere=nums[0];

intmaxSoFar=nums[0];

for(inti=1;i<numsSize;i++){

maxEndingHere=(maxEndingHere+nums[i]>nums[i])?maxEndingHere+nums[i]:nums[i];

maxSoFar=(maxSoFar>maxEndingHere)?maxSoFar:maxEndingHere;

}

returnmaxSoFar;

}

intmain(){

intT,N;

scanf("%d",&T);

while(T--){

scanf("%d",&N);

intnums[N];

for(inti=0;i<N;i++){

scanf("%d",&nums[i]);

}

intresult=maxSubArray(nums,N);

printf("%d\n",result);

}

return0;

}】第四周:選擇結構的程序設計第四周作業(yè)1.單選題:以下程序的輸出結果是main(){floatx=2,y;if(x<0)y=0;elseif(x<5&&!x)y=1/(x+2);elseif(x<10)y=1/x;elsey=10;printf(”%f\n”,y);}

選項:

A、0.500000

B、0.000000

C、0.250000

D、10.000000

答案:【0.500000】2.單選題:下面程序的輸出是#includemain(){intx=1,y=0,a=0,b=0;switch(x){case1:switch(y){case0:a++;break;case1:b++;break;}case2:a++;b++;break;}printf("a=%d,b=%d\n",a,b);}

選項:

A、a=2,b=1

B、a=1,b=1

C、a=1,b=0

D、a=2,b=2

答案:【a=2,b=1】3.下列程序段當a的值為014和0x14時的執(zhí)行結果分別是if(a=0xA|a>12)if(011&10==a)printf(”%d!\n”,a);elseprintf(”Right!%d\n”,a);elseprintf(”Wrong!%d\n”,a);

答案:【10!Right!11】4.若下列程序執(zhí)行后t的值為4,則執(zhí)行時輸入a,b的值范圍是#include”stdio.h”main(){inta,b,s=1,t=1;scanf(”%d,%d”,&a,&b);if(a>0)s+=1;if(a>b)t+=s;elseif(a==b)t=5;elset=2*s;printf(”s=%d,t=%d\n”,s,t);}

答案:【0】第四周編程作業(yè)1.確定母親節(jié)。題目內容:母親節(jié)是每年的五月第二個星期天,針對輸入的年份,計算該年的哪一天是母親節(jié)。輸入格式:年份輸出格式:日期(5月的哪一天)輸入樣例:2014輸出樣例:11

答案:【#include<stdio.h>

//Zeller公式計算給定日期是星期幾

intdayOfWeek(intyear,intmonth,intday){

if(month<3){

month+=12;

year-=1;

}

intt=year+year/4-year/100+year/400;

intd=(1+(13*(month+1))/5+t+day)%7;

returnd;//返回值為0表示星期六,1表示星期日,依此類推

}

intmain(){

intyear;

printf("請輸入年份:");

scanf("%d",&year);

//五月第一個星期天是哪一天

intfirstSunday=1;

while(dayOfWeek(year,5,firstSunday)!=1){

firstSunday++;

}

//五月第二個星期天是哪一天

intsecondSunday=firstSunday+7;

printf("%d\n",secondSunday);

return0;

}】2.計算時鐘的夾角。題目內容:鐘面上的時針和分針之間的夾角總是在0~180之間(包括0和180)。舉例來說,在十二點的時候兩針之間的夾角為0,而在六點的時候夾角為180,在三點的時候為90。本題要解決的是計算12:00到11:59之間任意一個時間的夾角。輸入格式:每組測試數據包含兩個數字:第一個數字代表小時(大于0小于等于12),第二個數字代表分(在區(qū)間[0,59]上)。輸出格式:對應每組測試數據,用常用格式顯示時間以及這個時候時針和分針間的最小夾角,精確到小數點后一位。輸出格式如下所示。再看一看,想一想:是否可以不用if語句,只使用printf函數來簡化你的程序?輸入樣例:120輸出樣例:At12:00theangleis0.0degrees.

答案:【#include<stdio.h>

intmain(){

inthour,minute;

printf("請輸入時間(小時分鐘):");

scanf("%d%d",&hour,&minute);

//計算時針和分針的角度

doublehour_angle=(hour%12)*30.0+minute*0.5;

doubleminute_angle=minute*6.0;

//計算兩針之間的夾角

doubleangle=fabs(hour_angle-minute_angle);

//取最小夾角

if(angle>180.0){

angle=360.0-angle;

}

//輸出結果

printf("At%d:%02dtheangleis%.1fdegrees.\n",hour,minute,angle);

return0;

}】3.求最后3位數值。題目內容:小明在中學會求一個數的n次方了,但計算機還不會,請你來編寫一個程序吧。由于計算機比較“笨”,所以我們編寫程序的功能不用太強,只要能算出a的n次方的最后3位數就可以了。輸入格式:a和n的值。假設a<=150。輸出格式:求a的n次方的最后3位數。提示:再想一想,你的方法對嗎?你用的是什么數據類型?輸入樣例:100輸出樣例:Thelast3numbersis1.

答案:【#include<stdio.h>

intpowerMod(inta,intn,intmod){

intresult=1;

while(n>0){

if(n%2==1){

result=(result*a)%mod;

}

a=(a*a)%mod;

n=n/2;

}

returnresult;

}

intmain(){

inta,n;

printf("請輸入a和n的值:");

scanf("%d%d",&a,&n);

//計算a的n次方的最后三位數

intlastThreeDigits=powerMod(a,n,1000);

//輸出結果

printf("Thelast3numbersis%d.\n",lastThreeDigits);

return0;

}】4.計算星期。題目內容:給出任意一個年月日(年>1900),現在我們不能只是直接計算,要先判斷給出的日期是否合法,對于非法的日期要給出錯誤提示信息,合法的日期要再計算是星期幾。輸入格式:年月日輸出格式:0~6。星期日用0表示,星期一用1表示,星期二用2表示......星期六用6表示。假設年份大于1900。先想一想:我們現在只會使用if語句,該如何建立數學模型?輸入樣例:2013311輸出樣例:1輸入樣例:20131315輸出樣例:monthiserror.輸入樣例:2013332輸出樣例:dayiserror.

答案:【#include<stdio.h>

//判斷是否是閏年

intisLeapYear(intyear){

return(year%4==0&&year%100!=0)||(year%400==0);

}

//判斷日期是否合法

intisValidDate(intyear,intmonth,intday){

if(month<1||month>12){

return0;

}

if(day<1){

return0;

}

intdaysInMonth[]={31,28,31,30,31,30,31,31,30,31,30,31};

if(isLeapYear(year)){

daysInMonth[1]=29;

}

if(day>daysInMonth[month-1]){

return0;

}

return1;

}

//Zeller公式計算星期幾

intdayOfWeek(intyear,intmonth,intday){

if(month<3){

month+=12;

year-=1;

}

intt=year+year/4-year/100+year/400;

intd=(1+(13*(month+1))/5+t+day)%7;

returnd;

}

intmain(){

intyear,month,day;

printf("請輸入年月日(年月日):");

scanf("%d%d%d",&year,&month,&day);

if(!isValidDate(year,month,day)){

if(month<1||month>12){

printf("monthiserror.\n");

}else{

printf("dayiserror.\n");

}

return0;

}

intweek=dayOfWeek(year,month,day);

printf("%d\n",week);

return0;

}】第五周:循環(huán)結構的程序設計(一)第五周編程作業(yè)1.求最小m值。題目內容:求滿足下列不等式的最小m。1+2+3+4+......+m≥n例如:n=100,當m=14時,滿足:1+2+3+4+...+13=91<100,而1+2+3+4+......+14=105>100。輸入格式:n輸出格式:m輸入樣例:100輸出樣例:14

答案:【#include<stdio.h>

intmain(){

intn,m;

intsum=0;

//從用戶那里獲取輸入值n

printf("請輸入n的值:");

scanf("%d",&n);

//從1開始累加,直到累加和大于等于n

for(m=1;sum>n;m++){

sum+=m;

}

//輸出滿足條件的最小m值

printf("滿足條件的最小m值為:%d\n",m-1);

return0;

}】2.尋找特殊偶數。題目內容:有一種特殊偶數,它每一位上的數字都兩兩不相同。我們現在需要找出四位數中某一區(qū)間內的這類偶數。輸入格式:所要尋找的四位偶數的范圍。每組輸入有兩個數字:第一個數字是最小范圍;第二個數字是最大范圍。如果輸入遇到0,輸入結束。輸出格式:列出此范圍內的所有特殊偶數,并且列出此范圍內特殊偶數的個數。輸入樣例:300030206040609000輸出樣例:3012301430163018counter=46042604860526054605860726074607860826084counter=10輸入樣例:910187-100輸出樣例:ErrorError

答案:【#include<stdio.h>

#include

//函數用于檢查一個數是否是特殊偶數

boolisSpecialEven(intnum){

intdigits[4];

inttemp=num;

intcount=0;

//提取每一位數字

while(temp>0){

digits[count++]=temp%10;

temp/=10;

}

//檢查是否為偶數

if(digits[3]%2!=0){

returnfalse;

}

//檢查每一位數字是否兩兩不相同

for(inti=0;i<4;i++){

for(intj=i+1;j<4;j++){

if(digits[i]==digits[j]){

returnfalse;

}

}

}

returntrue;

}

intmain(){

intmin,max;

intcount=0;

while(scanf("%d%d",&min,&max)==2){

if(min==0&&max==0){

break;

}

if(min<1000||max>9999||min>max){

printf("Error\n");

continue;

}

count=0;

for(inti=min;i<=max;i++){

if(isSpecialEven(i)){

printf("%d",i);

count++;

}

}

printf("counter=%d\n",count);

}

return0;

}】3.鍛煉身體吧。題目內容:沫沫,灰灰和渣渣去鍛煉身體,如果對他們跑步的距離分別只計整數a、b、c,由于他們身高的差距,造成了a<=b<=c,并且渣渣跑了N米之后就再也跑不動了。但是,按照他們事先的約定:只有當c*c==a*a+b*b時,他們的鍛煉才有效果。現在他們三個人想知道,如果渣渣的極限N已知,那么有多少種有鍛煉效果的跑步方案(即a,b,c有多少種可能的取值)。輸入格式:一個整數N,表示渣渣的體力極限,N<=5000。輸出格式:一個整數,代表他們跑步方案的個數。Hint:對于輸入N=5,有方案a=3,b=4,c=5,共一種。輸入樣例:5輸出樣例:1

答案:【#include<stdio.h>

intmain(){

intN;

intcount=0;

//從用戶那里獲取輸入值N

printf("請輸入N的值:");

scanf("%d",&N);

//遍歷所有可能的c值

for(intc=1;c<=N;c++){

//遍歷所有可能的b值

for(intb=1;b<=c;b++){

//計算a的值

inta_squared=c*c-b*b;

inta=(int)sqrt(a_squared);

//檢查a是否為整數且a<=b

if(a*a==a_squared&&a<=b){

count++;

}

}

}

//輸出滿足條件的跑步方案個數

printf("滿足條件的跑步方案個數為:%d\n",count);

return0;

}】第六周:循環(huán)結構的程序設計(二)第六周作業(yè)1.單選題:假定從鍵盤上輸入“3.6,2.4<回車>”,下面程序的輸出是____#includemain(){floatx,y,z;scanf(”%f,%f”,&x,&y);z=x/y;while(1){if(fabs(z)>1.0){x=y;y=z;z=x/y;}elsebreak;}printf(”%f\n”,y);}注:fabs()是浮點數絕對值函數。

選項:

A、1.600000

B、1.500000

C、2.000000

D、2.400000

答案:【1.600000】2.單選題:下面程序的輸出結果是____main(){inti,j,x=0;for(i=0;i<2;i++){x++;for(j=0;j<-3;j++){if(j%2)continue;x++;}x++;}printf(”x=%d\n”,x);}

選項:

A、x=4

B、x=8

C、x=6

D、x=12

答案:【x=4】3.單選題:已知inti=1;執(zhí)行語句while(i++<4);后,變量i的值為

選項:

A、5

B、3

C、4

D、6

答案:【5】4.單選題:下面的for語句for(x=0,y=10;(y>0)&&(x<4);x++,y--)

選項:

A、循環(huán)執(zhí)行4次

B、是無限循環(huán)

C、循環(huán)次數不定

D、循環(huán)執(zhí)行3次

答案:【循環(huán)執(zhí)行4次】5.單選題:求取滿足式的n,正確的語句是____

選項:

A、for(i=1,s=0;(s=s+i*i)<=1000;n=i++)

B、for(i=1,s=0;(s=s+i*i)<=1000;n=++i)

C、for(i=1,s=0;(s=s+i*++i)<=1000;n=i)

D、for(i=1,s=0;(s=s+i*i++)<=1000;n=i)

答案:【for(i=1,s=0;(s=s+i*i)<=1000;n=i++)】第六周編程作業(yè)1.火鍋火鍋和火鍋。題目內容:眾所周知,沫沫以火鍋為生。在E8的聚餐活動中,他經常賣萌賣無辜領著大家吃火鍋。。有一天,沫沫聽說學校附近的哺呷哺呷在某現充的贊助下有一個優(yōu)惠活動,只需30軟妹幣,對每個客人,它會上N道菜,但是客人只能挑選其中連續(xù)上的一些菜。于是他非常興奮的拉著灰灰和渣渣去吃火鍋去啦。沫沫是一個十分挑食的人,所以他對每一道菜都有一個愉快度(當然因為他的挑食,某些事物的愉快度會是負數)。為了讓沫沫能非常愉快的享受這次聚餐,善解人意的灰灰和渣渣決定幫他計算,他們應該怎么選擇菜才能使沫沫最開心地吃完這次聚餐。輸入格式:第一行是一個整數T,(T<=10)表示測試案例的個數對于每個測試案例,第一行是一個整數N,(1<=N<=10000)表示菜的個數接下來的N個數字,第i個數字si表示沫沫對第i道菜的愉快度。(-1000<=si<=1000)PS:由于CF又被血虐掉rating,所以沫沫的起始愉快度是0PPS:沫沫完全可能得到一個為負值的愉快值,poor沫沫。。輸出格式:對于每個樣例,輸出一個數字,表示沫沫吃完之后愉快度的最大值。HINT:對于56-154-7我們選擇6,-1,5,4這四道菜(注意必須是連續(xù)的,所以不能跳過-1)做完后請思考,如果N的范圍是1<=N<=100000呢?輸入樣例:256-154-7706-11-67-5輸出樣例:147

答案:【#include<stdio.h>

//Kadane算法計算最大子數組和

intmaxSubArray(int*nums,intnumsSize){

intmaxEndingHere=nums[0];

intmaxSoFar=nums[0];

for(inti=1;i<numsSize;i++){

maxEndingHere=(maxEndingHere+nums[i]>nums[i])?maxEndingHere+nums[i]:nums[i];

maxSoFar=(maxSoFar>maxEndingHere)?maxSoFar:maxEndingHere;

}

returnmaxSoFar;

}

intmain(){

intT,N;

scanf("%d",&T);

while(T--){

scanf("%d",&N);

intnums[N];

for(inti=0;i<N;i++){

scanf("%d",&nums[i]);

}

intresult=maxSubArray(nums,N);

printf("%d\n",result);

}

return0;

}】2.郵票組合。題目內容:我們寄信都要貼郵票,在郵局有一些小面值的郵票,通過這些小面值郵票中的一張或幾張的組合,可以滿足不同郵件的不同的郵資。現在,郵局有4種不同面值的郵票。在每個信封上最多能貼5張郵票,面值可相同,可不同。輸入格式:四種郵票的面值。輸出格式:用這四種面值組成的郵資最大的從1開始的一個連續(xù)的區(qū)間。說明:如結果為10,則表明使用4張郵票可組合出1、2、3、4、5、6、7、8、9、10這些郵資。名詞解釋:郵資:就是你寄東西需要花多少錢。郵票面額:是由國家發(fā)行的具有固定價格的花紙片,被稱為郵票。如果你寄東西,郵局稱了重量,告訴你要240分。這樣你就要貼郵票了。如果現在郵局的郵票有面值為80分、50分、20分和10分的四種,你就可以采用不同的組合得到240的郵資,例如:采用3張80分的可以湊出240分;或者24張10分的湊起來240分也可以。顯然不同郵票的組合都可以得到同樣一種郵資。輸入樣例:141221輸出樣例:Themaxis71.

答案:【#include<stdio.h>

#include

#defineMAX_STAMPS5

#defineMAX_VALUE1000

intmain(){

intvalues[4];

printf("請輸入四種郵票的面值:");

for(inti=0;i<4;i++){

scanf("%d",&values[i]);

}

//動態(tài)規(guī)劃數組,dp[i]表示能否用最多MAX_STAMPS張郵票組合出i的郵資

intdp[MAX_VALUE+1]={0};

dp[0]=1;//0郵資總是可以組合出的

//遍歷每種郵票面值

for(inti=0;i<4;i++){

//遍歷郵資從values[i]到MAX_VALUE

for(intj=values[i];j<=MAX_VALUE;j++){

//如果j-values[i]可以組合出,且使用的郵票數小于MAX_STAMPS

if(dp[j-values[i]]&&dp[j-values[i]]<MAX_STAMPS){

dp[j]=dp[j-values[i]]+1;

}

}

}

//找到最大連續(xù)區(qū)間

intmaxContinuous=0;

for(inti=1;i<=MAX_VALUE;i++){

if(dp[i]&&dp[i]<=MAX_STAMPS){

maxContinuous=i;

}else{

break;

}

}

printf("Themaxis%d.\n",maxContinuous);

return0;

}】3.空心字符菱形。題目內容:根據菱型起始字母和菱形的高度,打印空心的由字符組成的菱形。輸入格式:菱型起始字母和菱形的高度。輸出格式:參照樣例,打印空心的由字符組成的菱形。輸入樣例:C4輸出樣例:C[回車]DD[回車]EE[回車]FF[回車]EE[回車]DD[回車]C

答案:【#include<stdio.h>

intmain(){

charstartChar;

intheight;

printf("請輸入菱型起始字母和菱形的高度:");

scanf("%c%d",&startChar,&height);

//計算字母的ASCII值

intstart=startChar;

//打印上半部分

for(inti=0;i<height;i++){

//打印空格

for(intj=0;j<height-i-1;j++){

printf("");

}

//打印字符

printf("%c",start+i);

if(i!=0){

for(intj=0;j<2*i-1;j++){

printf("");

}

printf("%c",start+i);

}

printf("\n");

}

//打印下半部分

for(inti=height-2;i>=0;i--){

//打印空格

for(intj=0;j<height-i-1;j++){

printf("");

}

//打印字符

printf("%c",start+i);

if(i!=0){

for(intj=0;j<2*i-1;j++){

printf("");

}

printf("%c",start+i);

}

printf("\n");

}

return0;

}】4.數字正方型。題目內容:這是雙重循環(huán)的入門題目,大家來看看,你會做嗎?輸入n的值,輸出如下例(n=4)所示的由數字組成的正方型。(字母中間是兩個空格)12345678910111213141516輸入格式:n輸出格式:數字組成的正方型輸入樣例:1輸出樣例:1

答案:【#include<stdio.h>

intmain(){

intn;

printf("請輸入n的值:");

scanf("%d",&n);

intcount=1;//用于記錄當前數字

//外層循環(huán)控制行數

for(inti=0;i<n;i++){

//內層循環(huán)控制每行中的數字

for(intj=0;j<n;j++){

printf("%d",count);//打印數字,后面跟兩個空格

count++;

}

printf("\n");//每行結束后換行

}

return0;

}】第七周:數組(一)第七周作業(yè)1.虛擬實驗:冒泡排序算法程序設計實驗-按考生成績排序(重要提示:虛擬實驗網址開頭是http,如果打開后網址默認是https,請去掉s再重新刷新打開。)做“冒泡排序算法程序設計”實驗,完成以下實驗報告表并提交。可將以下實驗報告表內容復制到word中,填寫完成后,轉成pdf后即可提交。實驗報告表:冒泡排序實驗過程數據與結果實驗內容操作名稱實驗數據備注排序程序的幾個重要概念內循環(huán)控制變量名稱外循環(huán)控制變量名稱內循環(huán)開始條件外循環(huán)結束條件填空數據實現冒泡排序的語句i的終值是j的終值是RAM中數據變化外重循環(huán)是0,內重循環(huán)是9時a[0]的值外重循環(huán)是2,內重循環(huán)是7時a[6]的值實驗結束時,i、j、a[0]、a[9]中的值最終結果外循環(huán)進行了多少次內循環(huán)進行了多少次

答案:【#include<stdio.h>

intmain(){

inta[10]={53,100,34,23,56,89,76,45,67,23};//假設的初始數組

inttemp;

inti,j;

//外循環(huán)控制變量名稱

intouterLoopVar=0;

//打印外重循環(huán)是0,內重循環(huán)是9時a[0]的值

printf("外重循環(huán)是0,內重循環(huán)是9時a[0]的值:%d\n",a[0]);

//冒泡排序

for(i=0;i<9;i++){//外循環(huán),i從0到8,共9次

for(j=0;j<9-i;j++){//內循環(huán),j從0到8-i

if(a[j]>a[j+1]){//實現冒泡排序的語句

temp=a[j];

a[j]=a[j+1];

a[j+1]=temp;

}

}

}

//打印外重循環(huán)是2,內重循環(huán)是7時a[6]的值

printf("外重循環(huán)是2,內重循環(huán)是7時a[6]的值:%d\n",a[6]);

//打印實驗結束時,i、j、a[0]、a[9]中的值

printf("實驗結束時,i、j、a[0]、a[9]中的值:%d、%d、%d、%d\n",i,j,a[0],a[9]);

//打印最終結果

printf("外循環(huán)進行了多少次:%d\n",i+1);//i從0到8,共9次

printf("內循環(huán)進行了多少次:%d\n",(1+2+3+4+5+6+7+8)*2);//內循環(huán)次數計算

return0;

}】第七周編程作業(yè)1.子數整除。題目內容:對于一個五位數a1a2a3a4a5,可將其拆分為三個子數:sub1=a1a2a3sub2=a2a3a4sub3=a3a4a5例如,五位數20207可以拆分成:sub1=202sub2=020(=20)sub3=207現在給定一個正整數K,要求你編程求出10000到30000之間所有滿足下述條件的五位數,條件是這些五位數的三個子數sub1、sub2、sub3都可被K整除。輸出時請按照由小到大的順序排列(每行輸出一個數)。輸入格式:一個正整數K輸出格式:請按照由小到大的順序排列(每行輸出一個數)輸入樣例:15輸出樣例:22555[回車]25555[回車]28555[回車]30000[回車]

答案:【#include<stdio.h>

intmain(){

intK;

printf("請輸入一個正整數K:");

scanf("%d",&K);

//遍歷所有10000到30000之間的五位數

for(intnum=10000;num<=30000;num++){

intsub1=num/1000;//獲取前三位子數

intsub2=(num/100)%10;//獲取第二三位子數

intsub3=num%100;//獲取后三位子數

//檢查三個子數是否都能被K整除

if(sub1%K==0&&sub2%K==0&&sub3%K==0){

printf("%d\n",num);

}

}

return0;

}】2.洗牌。題目內容:假設我們有2n張牌,它們以1,2,...,n,n+1,...,2n編號并在開始時保持著這種順序。一次洗牌就是將牌原來的次序變?yōu)閚+1,1,n+2,2,...,2n,n,也就是將原來的前n張牌放到位置2,4,...,2n,并且將余下的n張牌按照他們原來的次序放到奇數位置1,3,...,2n-1。已經證明對于任何一個自然數n,這2n張牌經過一定次數的洗牌就回到原來的次序。但我們不知道對于一個特定的n,需要幾次洗牌才能將牌洗回原來的次序。輸入格式:牌張數的一半n,即初始情況下一共有2n張牌,n為int型整數輸出格式:將牌洗回原來的次序所需要的洗牌次數輸入樣例:10輸出樣例:6[回車]

答案:【#include<stdio.h>

voidshuffle(int*deck,intn){

for(inti=0;i<n;i++){

deck[2*i]=n+1+deck[i];

deck[2*i+1]=deck[i];

}

}

intmain(){

intn;

printf("請輸入牌張數的一半n:");

scanf("%d",&n);

intdeck[2*n];//創(chuàng)建一個數組來存儲2n張牌

for(inti=0;i<2*n;i++){

deck[i]=i+1;//初始化牌的編號

}

intcount=0;//洗牌次數計數器

while(deck[0]!=1||deck[1]!=2){//檢查是否回到原始順序

shuffle(deck,n);

count++;

}

printf("%d\n",count);//輸出洗牌次數

return0;

}】3.回文數。題目內容:輸出所有不超過n(取n<256)的、其平方具有對稱性質的正整數(也稱為回文數)。如:1*1=1;2*2=4;3*3=9;11*11=121;1,2,3,11是回文數。輸入格式:輸入n(n<256)輸出格式:輸出所有不超過n的回文數輸入樣例:3輸出樣例:1[回車]2[回車]

答案:【#include<stdio.h>

#include

//函數用于檢查一個數是否是回文數

boolisPalindrome(intnum){

intoriginal=num;

intreversed=0;

while(num>0){

intdigit=num%10;

reversed=reversed*10+digit;

num/=10;

}

returnoriginal==reversed;

}

intmain(){

intn;

printf("請輸入n(n<256):");

scanf("%d",&n);

for(inti=1;i<=n;i++){

intsquare=i*i;

if(isPalindrome(square)){

printf("%d\n",i);

}

}

return0;

}】4.組成最大數。題目內容:任意輸入一個自然數,輸出該自然數的各位數字組成的最大數。輸入格式:自然數n輸出格式:各位數字組成的最大數輸入樣例:1593輸出樣例:9531[回車]

答案:【#include<stdio.h>

#include

//比較函數,用于qsort

intcompare(constvoid*a,constvoid*b){

return(*(int*)b-*(int*)a);

}

intmain(){

intn;

printf("請輸入自然數n:");

scanf("%d",&n);

//將數字轉換為字符串,以便提取每一位數字

charstr[50];

sprintf(str,"%d",n);

//獲取字符串長度

intlen=strlen(str);

//將字符串中的字符轉換為整數數組

intdigits[len];

for(inti=0;i<len;i++){

digits[i]=str[i]-'0';

}

//使用qsort進行排序

qsort(digits,len,sizeof(int),compare);

//將排序后的數字重新組合成一個新的整數

intmaxNumber=0;

for(inti=0;i<len;i++){

maxNumber=maxNumber*10+digits[i];

}

printf("%d\n",maxNumber);

return0;

}】第八周:數組(二)第八周編程作業(yè)1.安全的密碼。題目內容:隨著電子設備的廣泛運用,密碼也漸漸融入每個人的生活。保護好密碼,不僅關系到個人隱私,更關系到個人的財產和安全。一個安全的密碼,最好由大小寫字母、數字或符號組成。包含越多種類的字符,其安全性就越高。同時密碼還需要有一定的長度,通常至少要由六個以上的字符組成。并不是每個人都喜歡這樣復雜的密碼,很多人在設置密碼的時候,喜歡使用自己的名字或者生日,但這是很大的安全隱患。任務林曉煒正在設計一個網絡交易系統(tǒng),為了保證用戶的密碼安全,他需要一個程序,判斷用戶自己設置的密碼是否安全,如果不安全,則給出提示。現在他向你求助,請你幫忙設計一個程序來解決這個問題。應當按照以下的規(guī)則來判斷密碼是否安全:如果密碼長度小于6位,則不安全如果組成密碼的字符只有一類,則不安全如果組成密碼的字符有兩類,則為中度安全如果組成密碼的字符有三類或以上,則為安全通常,可以認為數字、大寫字母、小寫字母和其它符號為四類不同的字符。輸入格式:輸入的第一行是一個整數N,表明后面有多少組密碼。隨后的N行輸入包括N個密碼,每個密碼的長度均小于20個字符。輸出格式:針對每一個密碼判斷并輸出它是否安全。對于不安全的密碼輸出"NotSafe",對于中度安全的密碼輸出"MediumSafe",對于安全的密碼輸出"Safe"輸入樣例:41234abcdefABC1231#c3Gh[回車]輸出樣例:NotSafeNotSafeMediumSafeSafe[回車]

答案:【#include<stdio.h>

#include

//函數用于檢查密碼的安全性

constchar*checkPasswordSecurity(constchar*password){

inthasUpper=0,hasLower=0,hasDigit=0,hasSymbol=0;

intlength=0;

while(*password){

length++;

if(isupper(*password))hasUpper=1;

if(islower(*password))hasLower=1;

if(isdigit(*password))hasDigit=1;

if(!isalnum(*password))hasSymbol=1;

password++;

}

if(length<6){

return"NotSafe";

}elseif(hasUpper+hasLower+hasDigit+hasSymbol==1){

return"NotSafe";

}elseif(hasUpper+hasLower+hasDigit+hasSymbol==2){

return"MediumSafe";

}else{

return"Safe";

}

}

intmain(){

intN;

printf("請輸入密碼數量N:");

scanf("%d",&N);

for(inti=0;i<N;i++){

charpassword[21];//假設密碼長度不超過20

printf("請輸入密碼#%d:",i+1);

scanf("%20s",password);//讀取密碼,最多20個字符

constchar*security=checkPasswordSecurity(password);

printf("%s\n",security);

}

return0;

}】2.身份證的奧秘。題目內容:18位身份證標準在國家質量技術監(jiān)督局于1999年7月1日實施的GB11643-1999《公民身份號碼》中做了明確的規(guī)定。GB11643-1999《公民身份號碼》為GB11643-1989《社會保障號碼》的修訂版,其中指出將原標準名稱"社會保障號碼"更名為"公民身份號碼",另外GB11643-1999《公民身份號碼》從實施之日起代替GB11643-1989。GB11643-1999《公民身份號碼》主要內容如下:一、范圍該標準規(guī)定了公民身份號碼的編碼對象、號碼的結構和表現形式,使每個編碼對象獲得一個唯一的、不變的法定號碼。二、編碼對象公民身份號碼的編碼對象是具有中華人民共和國國籍的公民。三、號碼的結構和表示形式1、號碼的結構公民身份號碼是特征組合碼,由十七位數字本體碼和一位校驗碼組成。排列順序從左至右依次為:六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。2、地址碼表示編碼對象常住戶口所在縣(市、旗、區(qū))的行政區(qū)劃代碼,按GB/T2260的規(guī)定執(zhí)行。3、出生日期碼表示編碼對象出生的年、月、日,按GB/T7408的規(guī)定執(zhí)行,年、月、日代碼之間不用分隔符。4、順序碼表示在同一地址碼所標識的區(qū)域范圍內,對同年、同月、同日出生的人編定的順序號,順序碼的奇數分配給男性,偶數分配給女性。5、校驗碼(1)十七位數字本體碼加權求和公式S=Sum(Ai*Wi),i=0,...,16,先對前17位數字的權求和Ai:表示第i位置上的身份證號碼數字值Wi:表示第i位置上的加權因子Wi:7910584216379105842(2)計算模Y=mod(S,11)(3)通過模得到對應的校驗碼Y:012345678910校驗碼:10X98765432四、舉例如下:北京市朝陽區(qū)東省汕頭市:44052418800101001415位的身份證號升級辦法:15位的身份證號:ddddddyymmddxxp18位的身份證號:ddddddyyyymmddxxpy其中dddddd為地址碼(省地縣三級)yyyymmddyymmdd為出生年月日xx順號類編碼p性別15位的yy年升為18位后,變成19yy年,但對于百歲以上老人,則為18yy年,此時,他們的最后三位順序碼為996,997,998或999來標記。輸入格式:輸入n組身份證號碼,第一行為個數,以后每行為身份證號碼。輸出格式:如果輸入的身份證號碼為15位,則將其升級為18位后顯示輸出;否則判斷其是否為合法身份證號,并逐行輸出。輸入樣例:435062219790413033111010519491231002X110105491231002110105491231996[回車]輸出樣例:Invalid[回車]Valid[回車回車回車]

答案:【#include<stdio.h>

#include

#include

//函數用于將15位身份證升級到18位

voidupgradeID(char*id){

if(strlen(id)==15){

intyear=(id[0]-'0')*1000+(id[1]-'0')*100+(id[2]-'0')*10+(id[3]-'0');

if(year<1950){

year+=2000;

}else{

year+=1800;

}

charnewId[19];

sprintf(newId,"%s%02d%s",id,year%100,id+6);

strcpy(id,newId);

}

}

//函數用于計算校驗碼

charcalculateCheckDigit(char*id){

intweights[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};

charcheckDigits[]="10X98765432";

intsum=0;

for(inti=0;i<17;i++){

sum+=(id[i]-'0')*weights[i];

}

returncheckDigits[sum%11];

}

//函數用于驗證18位身份證的有效性

intvalidateID(char*id){

upgradeID(id);//確保是18位身份證

if(strlen(id)!=18)return0;//長度檢查

//出生日期檢查

intyear=(id[6]-'0')*1000+(id[7]-'0')*100+(id[8]-'0')*10+(id[9]-'0');

intmonth=(id[10]-'0')*10+(id[11]-'0');

intday=(id[12]-'0')*10+(id[13]-'0');

//簡單的日期有效性檢查

if(year<1800||year>2100||month<1||month>12||day<1||day>31)return0;

//校驗碼檢查

charcheckDigit=calculateCheckDigit(id);

returnid[17]==checkDigit;

}

intmain(){

intn;

scanf("%d",&n);

while(n--){

charid[19];

scanf("%s",id);

if(validateID(id)){

printf("Valid\n");

}else{

printf("Invalid\n");

}

}

return0;

}】3.尋找矩陣的鞍點。題目內容:二維數組中的鞍點,即該位置上的元素是所在行上的最大值,是所在列上的最小值。二維數組也可能沒有鞍點。輸入一個二維數組的行數n,列數m,二維數組的諸元素值;輸出數組的鞍點,以及鞍點所在的行列號。輸入格式:第一行為矩陣的行數和列數,從第二行開始,為矩陣本身(假設輸入的矩陣只有0和1個鞍點)輸出格式:數組的鞍點,以及鞍點所在的行列號(下標從0開始)輸入樣例1:34135323413267[回車]輸出樣例1:Point:a[1][2]==4[回車]輸入樣例2:34123484369451[回車]輸出樣例2:NoPoint[回車]

答案:【#include<stdio.h>

intmain(){

intn,m;

scanf("%d%d",&n,&m);//讀取矩陣的行數和列數

intmatrix[n][m];

for(inti=0;i<n;i++){

for(intj=0;j<m;j++){

scanf("%d",&matrix[i][j]);//讀取矩陣元素

}

}

inthasSaddlePoint=0;//標記是否找到鞍點

for(inti=0;i<n;i++){

intmaxRow=matrix[i][0];

intcolOfMax=0;

for(intj=1;j<m;j++){

if(matrix[i][j]>maxRow){

maxRow=matrix[i][j];

colOfMax=j;

}

}

intminCol=matrix[0][colOfMax];

for(intk=1;k<n;k++){

if(matrix[k][colOfMax]<minCol){

minCol=matrix[k][colOfMax];

}

}

if(maxRow==minCol){

printf("Point:a[%d][%d]==%d\n",i,colOfMax,maxRow);

hasSaddlePoint=1;

}

}

if(!hasSaddlePoint){

printf("NoPoint\n");

}

return0;

}】4.單詞排序。題目內容:輸入5個單詞,將它們按從大到小的順序排列后輸出。輸入格式:5個單詞輸出格式:排序后的順序輸入樣例:BASIC[回車]C++[回車]Pascal[回車]C[回車]Fortran[回車]輸出樣例:Pascal[回車]Fortran[回車]C++[回車]C[回車]BASIC[回車]

答案:【#include<stdio.h>

#include

#defineMAX_WORDS5

#defineMAX_LENGTH100

intmain(){

charwords[MAX_WORDS][MAX_LENGTH];

chartemp[MAX_LENGTH];

//讀取5個單詞

for(inti=0;i<MAX_WORDS;i++){

scanf("%s",words[i]);

}

//使用冒泡排序對單詞進行降序排序

for(inti=0;i<MAX_WORDS-1;i++){

for(intj=0;j<MAX_WORDS-1-i;j++){

if(strcmp(words[j],words[j+1])<0){

//交換words[j]和words[j+1]

strcpy(temp,words[j]);

strcpy(words[j],words[j+1]);

strcpy(words[j+1],temp);

}

}

}

//輸出排序后的單詞

for(inti=0;i<MAX_WORDS;i++){

printf("%s\n",words[i]);

}

return0;

}】C語言程序設計(上)期末單選題1.單選題:對二維數組的正確說明是

選項:

A、inta[][]={1,2,3,4,5,6};

B、inta[2][]={1,2,3,4,5,6};

C、inta[][3]={1,2,3,4,5,6};

D、inta[2,3]={1,2,3,4,5,6};

答案:【inta[][3]={1,2,3,4,5,6};】2.單選題:若有以下語句,則正確的描述是:staticcharx[]="12345";staticchary[]={’1’,’2’,’3’,’4’,’5’};

選項:

A、x數組和y數組的長度相同

B、x數組長度大于y數組長度

C、x數組長度小于y數組長度

D、x數組等價于y數組

答案:【x數組長度大于y數組長度】3.單選題:運算符有優(yōu)先級,在C語言中關于運算符優(yōu)先級的敘述中正確的是:

選項:

A、邏輯運算符高于算術運算符,算術運算符高于關系運算符

B、算術運算符高于關系運算符,關系運算符高于邏輯運算符

C、算術運算符高于邏輯運算符,邏輯運算符高于關系運算符

D、關系運算符高于邏輯運算符,邏輯運算符高于算術運算符

答案:【算術運算符高于關系運算符,關系運算符高于邏輯運算符】4.單選題:錯誤的轉義字符是:

選項:

A、’\\’

B、’\’’

C、’\81’

D、’\0’

答案:【’\81’】5.單選題:對字符數組s賦初值。不合法的一個是

選項:

A、chars[20];s="Beijing";

B、chars[]="Beijing";

C、chars[20]={"Beijing"};

D、chars[20]={'B','e','i','j','i','n','g'};

答案:【chars[20];s="Beijing";】6.單選題:從鍵盤上輸入“446755”時,下面程序的輸出是____。#includemain(){intc;while((c=getchar())!=’\n’)switch(c-’2’){case0:case1:putchar(c+4);case2:putchar(c+4);break;case3:putchar(c+3);default:putchar(c+2);break;}printf(”\n”);}

選項:

A、888988

B、668966

C、88898787

D、66898787

答案:【88898787】[vk-content]7.單選題:變量a整型,f實型,i雙精度型,則表達式10+'a'+i*f值的數據類型為

選項:

A、double

B、int

C、float

D、不確定

答案:【int】8.單選題:對于數據類型的自動轉換,正確的說法是

選項:

A、字符型與單精度實型進行運算時都轉換為雙精度實型

B、字符型與字符型進行運算時不進行數據類型的轉換

C、整型與字符型進行運算時根據字符的ASCII碼值來決定是否進行類型轉換

D、單精度實型之間進行運算時不進行類型轉換

答案:【字符型與單精度實型進行運算時都轉換為雙精度實型】9.單選題:下面有關for循環(huán)的正確描述是

選項:

A、for循環(huán)必須用于循環(huán)次數已經確定的情況

B、for循環(huán)是先執(zhí)行循環(huán)體語句,后判斷表達式

C、for循環(huán)中

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論