前言
Everybody!歡迎來到一飛的博客!沒錯,歷經將近三個禮拜的間隔,我又回來啦!前端時間由于在學校里學習和生活上的各種事情,停更了不短的時間,現在,我回來啦!
不在的時間里,我也關注著我的CSDN,沒想到反倒是不更的這段時間,關注數漲了一倍!令我意外!
廢話不多說,依然是像往常一樣!用最樸實的語言為大家分享我在編程路上學習的一點一滴和心得感受!
年前的學習安排
轉眼已經臘月中旬啦!我為自己安排了大概一個多禮拜的學習時間,這段時間里我會開始集中地較為深入地學習C語言的每一個知識點,并加以大量的練習題!俗話說,光說不練假把式,練習題必不可少!
當然,像以前一樣,為了讓我寫的東西更加接地氣,我盡量不會放出大段大段知識點的代碼段,這些東西不是我在博客里想表達的,我仍會加入自己的思考程序,向大家展示出我學習中最真實的一面!
另外,由于在學習C語言的同時我還要提前預習高數和計算機等課程,所以這段時間里博客更新地肯定不會很頻繁了,我估計大概2~3天會出一篇!當然,量不是最重要的!最重要的是堅守我寫博客的初心,也就是用心記錄我的成長!
舊知識的回顧
之前學習C語言的兩個星期里,對一些細節的感受和印象頗深,再次敲起代碼,仍會對這些感到親切,
一串快遺忘的代碼
我記得我之前在博客里寫過不少次關于VS里scanf的使用,就是說由于VS對C語言一些語法的支持性問題,若想要正常使用它,需要在源檔案開頭加上以下代碼:
#define _CRT_SECURE_NO_WARNINGS 1
僅僅兩個多禮拜不上手,我就沒辦法敲全這串代碼了,畢竟初學,雖然印象深,但是沒有記死,我還記得我為了練熟練度,沒有按網上教程設定初始源檔案格式,也許哪一天我真的煩了,會去做這件事吧哈哈哈,
過了一次的老知識
雖說我之前瀏覽過一次C語言的大概內容,但是由于太淺,很多已經遺忘了,不過好在大部分最基礎的我都記住了,這基本上就夠了吧,
現在再讓我說說看過什么,我只能更加淺薄模糊地談一談,腦子里飄過的關鍵詞甚至也不太多了,例如靜態變數、區域變數、全域變數、指標、整型、浮點數、函式、宏定義、for回圈、while回圈、陣列......總之,記得的東西不能說很多了,不過保留的習慣還是蠻多,例如main函式的使用習慣,return 0 的輸入等等,
回圈的學習
準確來說分支和回圈陳述句,但主要是回圈,其實昨天就開始學了,但是昨天做完題玩了一晚上,沒精力寫了......
這個回圈,我真的是一言難盡,沒學的時候,我覺得這個東西神秘莫測,難的不行;學完知識點,我覺得回圈好簡單哇!然而,一做題我人快傻了,找了些回圈的題,結果這才意識到這是多么恐怖的東西,
回圈學習的難度不在于回圈本身,而是如何將它運用到你實際的操作中,也就是說,沒有哪道題是很簡簡單單讓你僅僅用for重復列印個東西!而是你需要看出問題背后的演算法,這其中需要用到的回圈的框架,而且,對于我這個初學者來說,框架里的演算法和我沒見過的新東西才是對于挑戰最大的地方!接下來分享一下我做的一些題吧,有的還行,有的簡直喪心病狂,
1.給輸入的三個數排列大小
這個問題其實我以前在學python的時候就已經見識過了,當時老師給我們留上機作業,在十個問題里挑出2三個做,這個大小排列當時以為很簡單,就試了試,結果想不出什么好的演算法,只會用列舉......
當然,這個問題我當時沒有深入研究,所以昨天我做的時候,依然是沒有什么頭緒,自己琢磨了半個多小時!依然是想不出什么好的演算法!我最后“認輸”看了答案,答案的解法我確實根本想不到,它的思路是利用兩兩比較和交換賦值,將a、b、c依次從大到小賦值,也就是說最后處理完的a、b、c就是從大到小排列,只需按順序列印輸出即可,稍微貼一下:
#include <stdio.h>
int main()
{
int a = 2;
int b = 3;
int c = 1;
scanf("%d%d%d",&a, &b,&c);
if(a<b)
{
int tmp = a;
a = b;
b = tmp;
}
if(a<c)
{
int tmp = a;
a = c;
c = tmp;
}
if(b<c)
{
int tmp = b;
b = c;
c = tmp;
}
printf("a=%d b=%d c=%d\n", a, b, c);
return 0;
}
這與我的思路差遠了!我也進一步從這里明白了機器演算法和人腦演算法的區別之大!我的第一想法是先利用我以前寫過的求最大值的題目里的演算法,求出三個值里的最大值,然后再求剩余兩個值里的較大值,最后這三個數的大小關系就明了了!然后當我開始寫我就傻了:求出最大值之后,我怎么樣才能之后剩下的是哪兩個數呢?我思考了良久,最后肯定,我沒辦法啊啊啊啊~~~我中間還嘗試過用if進行分類,不過實在是太麻煩了,甚至要分出三大類六小類!不大的問題,用這么多代碼顯然是冗余用費事!
我反復剖析答案,終于體會到了它的精妙之處,它與我的思考是一致的,但是實施辦法是反的:既然我求最大值完了不好確定是哪個變數,那么干脆變數不動,直接通過兩兩比較交換的辦法把最大值給a,次大值給b,最小值給c!然后順次列印即可!這思路確實很妙,還用到了中間變數,非常值得我思考!
2.求兩個數的最大公約數
這題演算法很有意思,昨天我看到題的時候,想了幾分鐘,沒有很明確的思路,但是不一會兒后,我腦子里突然蹦出來一個想法,就是盯住了“最大”兩個字,既然是最大的公約數,那我可以嘗試著用較大的去模較小的數,直到結果為零時,說明我找到了最大公約數!想到這,我欣喜若狂,趕緊動手去操辦!結果如下:
#include <stdio.h>
int main()
{
int a, b, x, i;
scanf("%d %d", &a, &b);
if (a <= b)
{
x = b;
b = a;
a = x;
}
for (i = b; i > 0; i--)
{
if (a % i == 0 && b % i == 0)
{
printf("%d", i);
break;
}
}
return 0;
}
沒錯,就是這串代碼,我運行了一次,毫無問題,高興極了!但是我又看了看答案,甚是懵逼:
#include <stdio.h>
int main()
{
int a = 18;
int b = 24;
int c = 0;
while(c=a%b)
{
a = b;
b = c;
}
printf("%d\n", b);
return 0;
}
一上眼我根本看不懂啊?!但是我又靜下來分析:先不管abc的值,先看while括號里的條件:注意,c后面不是雙等號,也就是說這不是一個判斷,而是賦值!也就是說,當c等于a%b等于0時,才會跳出回圈,并且輸出b,第一次回圈過后,我發現a和b交換了值!也是就是說a%b變成了大模小!這和我演算法里第一步用if陳述句里的中間變數調大小位置是一致的!只是他這個我怎么也是想不到的......后面我不想分析了,原理我暫時搞不清,等我搞清再來弄它!
3.猜亂數游戲
最后來個大的,實際上這和上面那兩道題都不是同一個級別的,這個涉及到整個程式的設計,而上面是僅演算法,我在這里不談具體的演算法問題,只說一下我在學著寫這個程式時所遇到的一些印象深刻的問題,
首先是生成亂數,這是這個游戲最為核心的東西,要不怎么叫猜亂數呢?我之前在python里做過類似的程式,很簡單,直接呼叫一個函式即可;但是C語言里用亂數的復雜程度要遠遠大于python;不但要好幾個函式套著用,而且規則還很多,引入一堆概念,對于我這個新生很不友好,但是我還是硬著頭皮看了兩遍,終于完全看懂了每一個函式的用法,
我想,總得有一個接受的程序吧?并不是說隨著我編程時間的變長,我會的就會越來越多,而是我學的越來越多,我會的才會越來越多!
別的東西的話,就是一個界面設計和游戲回圈機制了,不是特別復雜,中間還涉及到了switch的使用,我就不展開講了,東西太多,放段代碼,有興趣的看一下吧,我還弄了個英文版哈哈哈~
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
void menu()
{
printf("*******************\n");
printf("*******1.Play******\n");
printf("*******0.Exit******\n");
printf("*******************\n");
}
void game()
{
int ret = rand();
printf("Welcome to guessing game!Enter your answer!\n");
int ans;
while (1)
{
scanf("%d", &ans);
if (ans > ret)
{
printf("More smaller!\n");
}
else if (ans < ret)
{
printf("More bigger!\n");
}
else
{
printf("Congratulations!");
break;
}
}
}
int main()
{
int choice;
srand((unsigned int)time(NULL));
do
{
menu();
printf("Please choose your decision:");
scanf("%d", &choice);
switch (choice)
{
case 1:
game();
break;
case 0:
printf("Exit!");
break;
default:
printf("Please choose again!\n");
break;
}
} while (choice);
return 0;
}
寫在最后
今天就寫到這里吧,總的來說,回歸學習以后,由于放假的緣故嘛,所以我投入的格外多,兩天以內就迅速恢復到了以前的狀態,甚至還超越了之前,這是我沒有預料到的,我以為我得調整幾天,實際上并沒有哈哈哈~
隨著學習的深入展開,我做的題目也比之前深不少了,我知道,難度肯定有,畢竟我還是要進步的嘛,一點點來,我相信我一定能成為一名大佬的!
就這樣吧,感謝您能看到這里!歡迎繼續見證我的C語言學習之路!歡迎回顧之前的內容!
在學習中思考——C語言學習總結小記2021.12.19
C語言學習心得感悟2021.12.14
周末C語言基礎學習小結
第一篇博客——夢開始的地方
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/413249.html
標籤:AI
