暑假学习打卡【3】——北理工乐学第三周作业
1、分數的四則運算
在小學時我們就學習了分數的四則運算,即對兩個分數進行加、減、乘、除等運算,現在我們嘗試下用C語言來實現。
輸入:
????分數1 操作符 分數2
輸出:
????計算結果
要求:
計算結果使用分數表示,并且為最簡化。例如結果為2/6,則被簡化為1/3
#include <stdio.h> int main() { int x1, x2, y1, y2, b, c,i; //b為結果的分子,c為結果的分母char a;//a表示加減乘除符號,b表示分子,c表示分母 scanf("%d/%d %c %d/%d", &x1, &x2, &a, &y1, &y2); switch (a) { case '+': b = x1 * y2 + x2 * y1; c = x2 * y2; break; case '-': b = x1 * y2 - x2 * y1; c = x2 * y2; break; case '*': b = x1 * y1; c = x2 * y2; break; case '/': b = x1 * y2; c = x2 * y1; break; } for(i=b;i>=1;i--) //判斷分子分母是否能夠化簡{ if((b%i==0)&&(c%i==0)) { b=b/i; c=c/i; } } if(b==0) { printf("%d/%d %c %d/%d = 0\n", x1, x2, a, y1, y2); } else if(c==1) { printf("%d/%d %c %d/%d = %d\n", x1, x2, a, y1, y2, b); } else { printf("%d/%d %c %d/%d = %d/%d\n", x1, x2, a, y1, y2, b, c); } return 0; }小提醒:在switch里面的每個case結束后最好都帶個break~
------------------------------------------------這里是無情的切割線------------------------------------------------------
2、【中學】計算時鐘的夾角
背景:
鐘面上的時針和分針之間的夾角總是在 0 ~180之間 ( 包括 0?和180?) 。舉例來說,在十二點的時候兩針之間的夾角為 0?,而在六點的時候夾角為180?,在三點的時候為90?。本題要解決的是計算 12:00 到 11:59 之間任意一個時間的夾角。
輸入:
每組測試數據包含兩個數字:第一個數字代表小時 ( 大于 0 小于等于 12) ,第二個數字代表分 ( 在區間 [0, 59] 上 ) 。
輸出:
對應每組測試數據,用常用格式顯示時間以及這個時候時針和分針間的最小夾角,精確到小數點后一位。輸出格式如下所示。
再看一看,想一想:是否可以不用if 語句,只使用 printf 函數來簡化你的程序?
首先是考慮使用if語句的情況:
#include <stdio.h> int main()//計算時針與分針的角度 { int x,y,z; double a,b;//x表示小時數,y表示分鐘數,a表示時針轉過角度,b表示分針轉過角度 scanf("%d %d",&x,&y); if(x<=6) z=x; else z=(12-x); a=y*0.5+z*30.0; b=y*6.0; if(a>b)printf("At %d:%02d the angle is %.1f degrees.\n", x,y,a-b);elseprintf("At %d:%02d the angle is %.1f degrees.\n", x,y,b-a); return 0; }根據課上所學的,若是想要把if語句省略掉,我自己的想法就是用三目式來替代:?
#include <stdio.h> int main()//計算時針與分針的角度 { int x,y,z; double a,b;//x表示小時數,y表示分鐘數,a表示時針轉過角度,b表示分針轉過角度 scanf("%d %d",&x,&y); z=(x<=6)?x:12-x; a=y*0.5+z*30.0; b=y*6.0; printf("At %d:%02d the angle is %.1f degrees.\n", x,y,(a>b)?a-b:b-a); return 0; }------------------------------------------------這里是無情的切割線------------------------------------------------------
3、【中學】求解一元二次方程
初中的小明已經開始學習求解一元二次方程了,下面讓我們來教計算機如何求解。輸入 a,b,c ,求一元二次方程 ax2+bx+c=0 的根。
輸入:
假設 a,b,c均int。
輸出:
要求輸出的根為 double 型,保留 6 位小數。
我先貼一下我第一次做這道題的代碼,純純就是硬干,但是顯然看起來很麻煩:?
#include <stdio.h> #include <math.h> int main() { double a,b,c,delta;//一元二次方程為ax^2+bx+c=0; delta為方程的根 ; scanf("%lf %lf %lf",&a,&b,&c); delta=b*b-4*a*c; if(a==0&&b==0) //當該方程式只有常數項,即形式為c=0時:printf("Input error!\n"); else if(a==0&&b!=0) //當該方程式的二次項為零,即形式為bx+c=0時:{ if(-c/b==0) printf("x=%.6f\n",0); else printf("x=%.6f\n",-c/b); } else if(a!=0&&b==0) //當該方程式的一次項為零,即形式為ax^2+c=0時:{ if(-c/a>0) printf("x1=%.6f\nx2=%.6f\n",sqrt(-c/a),-sqrt(-c/a)); else if(-c/a==0) printf("x1=x2=%.6f\n",0); else if(-c/a<0) { double x=fabs(-c/a);//x表示c/a的絕對值,方便之后的開根號 printf("x1=%.6fi\nx2=%.6fi\n",sqrt(x),-sqrt(x)); } } else if(a!=0&&b!=0) //為標準的一元二次方程時:{ if(delta==0) printf("x1=x2=%.6f\n",(-b)/(2*a)); else if(delta>0) { printf("x1=%.6f\n",(-b+sqrt(delta))/(2*a)); printf("x2=%.6f\n",(-b-sqrt(delta))/(2*a)); } else //當情況屬于復數時:{ double y=fabs(delta); printf("x1=%.6f+%.6fi\n",-b/(2*a), sqrt(y)/(2*a)); printf("x2=%.6f%.6fi\n",-b/(2*a), -sqrt(y)/(2*a)); } } return 0; }再來做這道題,重新捋一下思路,首先是a=0且b=0時單獨討論,然后根據判別式來開干(
#include <stdio.h> #include <math.h> int main() { double a,b,c,delta;//一元二次方程為ax^2+bx+c=0; delta為方程的根 ; scanf("%lf %lf %lf",&a,&b,&c); delta=b*b-4*a*c; if(a==0&&b==0) //當該方程式只有常數項,即形式為c=0時:printf("Input error!\n"); else if(a==0&&b!=0) //當該方程式為一次函數時: { if(-c/b==0) printf("x=%.6f\n",0); else printf("x=%.6f\n",-c/b); } else{if(delta==0) //判別式=0時: {if((-b)/(2*a)==0)printf("x1=x2=%.6f\n",0);elseprintf("x1=x2=%.6f\n",(-b)/(2*a)); }else if(delta>0) //判別式>0時: printf("x1=%.6f\nx2=%.6f\n",(-b+sqrt(delta))/(2*a),(-b-sqrt(delta))/(2*a));else //判別式<0時: {if(-b/(2*a)==0){printf("x1=%.6fi\n", sqrt(fabs(delta))/(2*a)); printf("x2=%.6fi\n",-sqrt(fabs(delta))/(2*a)); }else{printf("x1=%.6f+%.6fi\n",-b/(2*a), sqrt(fabs(delta))/(2*a)); printf("x2=%.6f%.6fi\n",-b/(2*a), -sqrt(fabs(delta))/(2*a));} }}return 0; }?
------------------------------------------------這里是無情的切割線------------------------------------------------------
4、【入門】大小寫字母轉換
我們知道,英文字母是分大小寫的,下面我們需要編寫一個簡單的程序,將輸入的全部小寫字母變換為大寫字母,大寫字母變換為小寫字母,非寫字母保持不變。
輸入:
??? 一個字符
輸出:
??? 變換后的字符
先貼一個最樸實無華的根據ascii碼的方法:
#include <stdio.h> int main() { char x;//x表示一個字母 scanf("%c",&x); if(x>='A'&&x<='Z') { x+=32; printf("%c\n",x); } else if(x>='a'&&x<='z') { x-=32; printf("%c\n",x); } else { printf("%c\n",x); } return 0; }高級一丟丟的可以用:
#include <stdio.h> #include <ctype.h> int main() { char x;//x表示一個字母 scanf("%c",&x); if(isalpha(x)) //判斷是否為大小寫 {if(islower(x))printf("%c\n",toupper(x)); //小寫轉大寫 elseprintf("%c\n",tolower(x)); //大寫轉小寫 }else //原封不動輸出 printf("%c\n",x);return 0; }------------------------------------------------這里是無情的切割線------------------------------------------------------
5、【日期】根據日期求星期
任意給出一個年月日,求出是星期幾。
輸入:
????年 月 日
輸出:
????0~6。
??? 星期日用 0 表示,星期一用 1 表示,星期二用 2 表示......星期六用 6 表示。
假設年份大于1900。先想一想:我們現在只會使用 if 語句,該如何建立數學模型?找到數學模型是解決本題的關鍵。
按照慣例先貼出我第一次做的時候的代碼,只能說那時候滿腦子都是硬干,加上對C的理解還很淺薄,導致整個代碼看起來就很繁瑣……
#include <stdio.h> int caculate1(int i); int main() { int year=0, month=0, day=0;//x代表輸入年份,y表示輸入月份,z表示輸入的日份 scanf("%d %d %d", &year, &month, &day); /*解決年的問題*/ int i = year - 1;//i表示輸入年份的前一年 int x = 0;//x表示輸入年份的前一年距離1900年1月1日的日子數 x=caculate1(i); /*解決月的問題*/ int y = 0;//y表示輸入月份的前一月距離本年1月1日的日子數 int m;//用于解決2月份是否為閏月的方法 if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { m = 29; } else { m = 28; } switch (month) { case 1: y = 0;break; case 2: y = 31;break; case 3: y = 31 + m;break; case 4: y = 62 + m;break; case 5: y = 92 + m;break; case 6: y = 123 + m;break; case 7: y = 153 + m;break; case 8: y = 184 + m;break; case 9: y = 215 + m;break; case 10:y = 245 + m;break; case 11:y = 276 + m;break; case 12:y = 306 + m;break; } /*解決日的問題*/ int z = day;//x表示輸入日份距離本月1日的日子數 int all = x + y + z;//表示總日子數 int answer = all % 7;//表示周幾 printf("%d\n", answer); return 0; } int caculate1(int i) { int x1 = 0;//x1表示閏年個數 int x2 = 0;//x2表示平年個數 int x3 = 0;//x3表示x-1年距離1900年總共的天數 if (i < 1900) { x3 = 0; return x3; } else { do { if (i % 4 == 0 && i % 100 != 0) { x1++; } else if (i % 400 == 0) { x1++; } else { x2++; } i--; } while (i >= 1900); x3 = 366 * x1 + 365 * x2; return x3; } }后面重新做一做這道題,優化一些不必要的步驟:
#include <stdio.h> int caculate1(int year) //計算當前年份的前一年的最后一天距離1900.1.1總計多少天數 {int sum=0,i;for(i=1900;i<=year-1;i++){if((i%4==0&&i%100!=0)||i%400==0)sum+=366;elsesum+=365;}return sum; }int main() {int year,month,day,sum,i,j,x;scanf("%d %d %d",&year,&month,&day);sum=caculate1(year);int everymonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};//平年的各月份的天數 if((year%4==0&&year%100!=0)||year%400==0)//閏年修改2月份的天數everymonth[1]=29;for(i=0;i<month-1;i++) sum+=everymonth[i];sum+=day;printf("%d\n",sum%7); }------------------------------------------------這里是無情的切割線------------------------------------------------------
以上。
總結
以上是生活随笔為你收集整理的暑假学习打卡【3】——北理工乐学第三周作业的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言链表移动北理工,北京理工大学c语言
- 下一篇: c语言铺地板,【北理乐学】铺地板