第一週的作業,我認為對沒寫過程式的初學者,單單是上完Week 1 的內容, ... #include #include void print(int n); int ...
【交作業】CS50-week1
作業
第一週的作業,我認為對沒寫過程式的初學者,單單是上完Week1的內容,還是有點勉強,但也沒有不好,有難關才有想解決的動力。
(應該吧)
2017年學到Week4,但因為種種因素就放棄了。
過了兩年決定重頭開始,加上之前寫的筆記,算是比當時更清楚了課程內容。
而且看到兩年前交的作業,發現那時連Week1的作業都寫的慘不忍睹(雖然現在也是,但當時更糟),看到這麼久沒寫程式,還能有進步的自己是蠻開心的!
來這裡寫Week1作業:ProblemSet1
Mario(lesscomfort)
目的:使印出任意高度、由#組成的金字塔。
#include
#include
voidprint(intn);
intmain(void)
{
inti;
do
{
i=get_int("height:");
}while(i<1||i>8);
print(i);
}
voidprint(intn)
{
for(inti=0;i=n-i)
{
printf("#");
}else
{
printf("");
}
}
printf("\n");
}
}
Mario加強版(morecomfort)
目的:使印出任意高度、由#組成的雙邊金字塔。
#include
#include
voidprint(intn);
intmain(void)
{
inti;
do
{
i=get_int("height:");
}while(i<1||i>8);
print(i);
}
voidprint(intn)
{
for(inti=0;i=n-i)
{
printf("#");
}
else
{
printf("");
}
//right
if(j==n)
{
printf("");
inth=j;
while(h>0)
{
if(h
#include
#include
intchange(intn);
intmain(void)
{
floatn=get_float("Changeowed:");
intcents=round(n*100);
printf("%i\n",change(cents));
}
intchange(inttotal)
{
intn=0;
while(total>0)
{
if(total>=25)
{
n+=round(total/25);
total=total%25;
}
elseif(total>=10)
{
n+=round(total/10);
total=total%10;
}
elseif(total>=5)
{
n+=round(total/5);
total=total%5;
}
elseif(total>=1)
{
n+=round(total/1);
total=total%1;
}
}
returnn;
}
Credit
目的:用公式驗算信用卡卡號,並查證出是哪種卡別
感想:不算很難,但過程有點麻煩
學到
怎麼取數字的個數
太長的數字要用longorlonglong
如何取前幾位數or後幾位數
/*
AmericanExpress:15digit,startwith34,37
MasterCard:16digit,startwith51,52,53,54,55
Visa:13or16digit,startwith4
1.先算出幾位數
2.等於16,看開頭是不是等於51-55,或者為4
3.等於15,看開頭是不是等於34or37
3.等於13,看開頭是不是等於4
-----
測試:
1.基數位*2(如果超過10,個位數跟十位數相加)
2.相加結果n
3.偶位數相加再加上n
4.n如果為10的倍數,卡片號碼就成立
*/
#include
#include
#include
intcheck(longtotal);
intcount(longn);
stringcard_type(longn,inti);
strings_invalid="INVALID";
intmain(void)
{
longn=get_long("card:");
inti=count(n);
if(check(n)%10==0)
{
printf("%s\n",card_type(n,i));
}
else
{
printf("%s\n",s_invalid);
}
}
//驗證卡號
intcheck(longtotal)
{
intamount=0;
while(total>=1)
{
//步驟3.偶位數相加
inteven=total%10;
amount+=even;
total=round(total/10);
//步驟1,2.基數位相加
intodd=(total%10)*2;
if(odd>=10)
{
odd=(odd%10)+round(odd/10);
}
amount+=odd;
total=round(total/10);
}
//printf("total:%i\n",amount);
returnamount;
}
//先算有幾位數
intcount(longn)
{
inti=0;
while(n>=1)
{
n=n/10;
i++;
}
returni;
}
//判斷為哪種卡
stringcard_type(longn,inti)
{
//先算出前兩個數字
while(n>=100)
{
n=round(n/10);
}
//判斷
switch(i)
{
case16:
if(round(n/10)==4)
{
return"VISA";
}
elseif((n>=51)&&(n<=55))
{
return"MASTERCARD";
}
returns_invalid;
case15:
if(n==34||n==37)
{
return"AMEX";
}
returns_invalid;
case13:
if(round(n/10)==4)
{
return"VISA";
}
returns_invalid;
default:
returns_invalid;
}
}
Writtenon
April
3rd
,
2019
byYakimshu
Feelfreetoshare!
Youmayalsoenjoy:
【交作業】CS50-week2
【筆記】CS50-week2助教課總整理
【心得】CS50-week4
【筆記】CS50-week2編譯、陣列、加密、排序法(2019年更新)
【筆記】CS50-week1(2019年更新)
【筆記】CS50-week0(2019年更新)
【心得】CS50-課程介紹