学习记录,从0开始
今年9月中旬接触C语言,计算机专业学生。说来也是缘分。高考分数很理想,却因为报考的大学太热门没进到学校的王牌专业“建筑规划”。
九月前几乎没接触过编程(高二的时候玩网游用过按键精灵...)。自认为为0基础的自己会跟不上学校的学习节奏,就百度了入门经验,晚上捧着网友推荐的《C Primer Plus》看(那时学校还没发教材)。看是看书实在太枯燥了进度几乎为0,直到后来机缘巧合之下发现了小甲鱼的C语言教学视屏,又通过视屏了解到论坛。
看视屏学习进度飞快,现在已经能做出贪吃蛇了,哈哈。到了程序设计课都想翘掉,觉得学校课太慢了。(学校也有视屏,但是学校的MOOC视屏简直就是惨不忍睹...和有声教材读物没啥区别)
我会把我每天的进度放在这,同时还有问题和笔记等。
ps.不知道会不会放错板块。板块中没发现长期的记录贴,这不算水贴吧?楼下补上11.10之前的学习记录。 本帖最后由 小墨hacker 于 2015-11-10 17:31 编辑
已经记不得什么了,全是翻文件看看,所以这一部分应该会比较模糊。
9月中旬下旬熟悉输入输出等,练习有单位转换,计算面积,字符串输入输出……
9月下旬接触选择结构。
十月上旬接触简单的子函数及调用(...没按顺序学,我比较贪心,总是翻看后面部分的内容看到不懂就度娘。所以学习的内容基本都是零碎的...到了后来总有东西看不懂,没办法又系统得看了一遍小甲鱼的视屏。希望和我一样刚刚开始学的朋友引以为戒。)
十月中旬看到网友发在贴吧的OX棋思路,也开始边学边做。(其中学了数组、循环等)一个程序边学边做整整做了5天...
#include<stdio.h>
const int KONG=0;
const int PLAYER1=1;
const int PLAYER2=2;
const int *game={&KONG,&KONG,&KONG,&KONG,&KONG,&KONG,&KONG,&KONG,&KONG};
int luoZi_hang;
int luoZi_lie;
void QiPan()
{
int hang;
int lie;
for(hang=1;hang<=3;hang++)
{
for(lie=1;lie<=3;lie++)
{
if(*game==KONG)
{
printf("*");
}
else if(*game==PLAYER1)
{
printf("O");
}
else if(*game==PLAYER2)
{
printf("X");
}
if(lie==3)
{
printf("\n");
}
}
}
}
void player(const int &per)
{
int luoJi;
printf("请玩家%d落子,请输入:\n",per);
printf("行:");
luoJi=scanf("%d",&luoZi_hang);
for(;luoJi!=1||luoZi_hang>3;)
{
printf("输入错误,请重新输入:");
scanf("%d",&luoZi_hang);
}
printf("列:");
luoJi=scanf("%d",&luoZi_lie);
for(;luoJi!=1||luoZi_lie>3;)
{
printf("输入错误,请重新输入:");
scanf("%d",&luoZi_lie);
}
for(;*game!=KONG;)
{
printf("该处以落子请重新输入!\n");
printf("行:");
luoJi=scanf("%d",&luoZi_hang);
for(;luoJi!=1||luoZi_hang>3;)
{
printf("输入错误,请重新输入:");
scanf("%d",&luoZi_hang);
}
printf("列:");
luoJi=scanf("%d",&luoZi_lie);
for(;luoJi!=1||luoZi_lie>3;)
{
printf("输入错误,请重新输入:\n");
scanf("%d",&luoZi_lie);
}
}
game=&per;
}
int win(int p)
{
int num;//相连子个数
int a=1;
for(a=1,num=1;luoZi_hang-1+a<=2&&*game==p;a++)//检测纵向胜利条件
{
num++;
}
for(a=-1;luoZi_hang-1+a>=0&&*game==p;a--)
{
num++;
}
if (num==3)
{
printf("\n玩家%d胜利-",p);
return 1;
}
for(num=1,a=1;luoZi_hang-1+a<=2&&*game==p;a++)//检测横向胜利条件
{
num++;
}
for(a=-1;luoZi_hang-1+a>=0&&*game==p;a--)
{
num++;
}
if (num==3)
{
printf("\n玩家%d胜利|",p);
return 1;
}
for(num=1,a=1;luoZi_hang-1+a<=2&&luoZi_lie-1+a<=2&&*game==p;a++)//检测\方向胜利条件
{
num++;
}
for(a=-1;luoZi_hang-1+a>=0&&luoZi_lie-1+a>=0&&*game==p;a--)
{
num++;
}
if (num==3)
{
printf("\n玩家%d胜利\\",p);
return 1;
}
for(num=1,a=1;luoZi_hang-1-a>=0&&luoZi_lie-1+a<=2&&*game==p;a++)//检测/方向胜利条件
{
num++;
}
for(a=-1;luoZi_hang-1-a<=2&&luoZi_lie-1+a>=0&&*game==p;a--)
{
num++;
}
if (num==3)
{
printf("\n玩家%d胜利/",p);
return 1;
}
else//返回无胜负的返回值
{
return 0;
}
}
int main()
{
int lunCi;
int w=0;
QiPan();
for(lunCi=1;lunCi<=9&&w==0;lunCi++)
{
if(lunCi%2==1)
{
player(PLAYER1);
QiPan();
w=win(PLAYER1);
}
if(lunCi%2==0)
{
player(PLAYER2);
QiPan();
w=win(PLAYER2);
}
}
if (w==0)
printf("\n平局");
return 0;
}
找不到最开始的程序了,这是十月下旬后来学指针的时候回来改的。
零散的学习进度很快,基本一个月就学到函数、指针这部分。但是弊端也是极其严重,楼主当时连什么是形参实参都不知道(还有全局参数等等,之前依葫芦画瓢没问题,自己一改加入指针部分就疯狂报错。自己还作死加了常量,又弄混了常量指针和指针常量...5555)
后来下旬的时候就开始刷视屏了,把漏洞都补上,感觉这样学特别浪费时间。
当时连DEBUG都不知道,为了检查哪出错了在函数里狂加printf检测各个变量...被自己蠢哭。 本帖最后由 小墨hacker 于 2015-11-11 10:24 编辑
感觉这一段学习过程中除了学习C语言外主要就是三个部分:
1.看懂编译器报错是哪错了,错了什么。(本人英文不好,都是度娘的。错多了自然就记住了)
2.==和=弄混(没有比这更蛋疼的了)后来有学校的师兄提出建议就是(3==a)把变量放右边,现在基本解决。
3.DEBUG!!!很重要但是不难。
大概就是这些,菜鸟厚颜无耻的分享经验全当抛砖引玉,欢迎大神支出错误的地方(包括之前及之后的内容)。
随后就是一边熟悉之前内容,一边做些小程序。
11月初接触图形库,做了贪吃蛇。(贪心的楼主还是没办法改掉坏习惯,有是边做边学结构体、随机数、图形库画图等。度娘了链表由于完全看不懂动态链表,所以程序还是用了静态。图形库是EGE)
#include <graphics.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NULL 0
#define UP 1
#define DOWN 2
#define LEFT 3
#define RIGHT 4
int dir=RIGHT;
int num;
char direct;
struct link//定义蛇坐标(最大长度为60,不足部分为0,显示部分为1)
{
int x;
int y;
int state;//0隐藏1显示
struct link *next;
}snack;
struct link *head=&snack;
struct link *p;
struct loca
{
int x;
int y;
int state;//没被吃为1,被吃为0
}food;
void initLink()
{
int l;
for(l=0;l<=1;l++)
{
snack.next=&snack;
}
}
void initSnack()
{
int i;
for(i=0;i<=2;i++)
{
snack.x=400-(i-1)*10;
snack.y=300;
snack.state=1;
}
}
void initFood()
{
srand((unsigned int)time(NULL));
food.x=rand()%80*10;
food.y=rand()%60*10;
food.state=1;
}
void drawSnack()
{
p=head;
for(;p!=NULL;)
{
setfillcolor(RED);
bar(p->x-4, p->y-4, p->x+4, p->y+4);
p=p->next;
}
}
void funcFood()
{
if(food.state==0)
{
food.state=1;
food.x=rand()%80*10;
food.y=rand()%60*10;
}
setfillcolor(RED);
bar(food.x-4,food.y-4,food.x+4,food.y+4);
if(head->x==food.x&&head->y==food.y)//吃到食物,尾不变,加头
{
num++;
food.state=0;
snack.next=head;
head=&snack;
}
else//没吃食物尾变头
{
p=head;
int aa;
for(aa=1;aa<=num-2;aa++)//p指向倒数第二个链节
{
p=p->next;
}
p->next->next=head;//尾变头
head=p->next;
p->next=NULL;//完成
}
}
void die()
{
if(head->x<0||head->y<0||head->x>800||head->y>600)
goto stop;
else
{
p=head->next;
for(;p!=NULL;)
{
if(head->x==p->x&&head->y==p->y)
{
goto stop;
}
p=p->next;
}
}
p=head;
if(0)
{
stop: for(;1;)
getch;
}
}
void move()
{
for(num=3;num<=60;)
{
drawSnack();
funcFood();
if(kbhit())
{
direct=getch();
if(direct=='a'&&dir!=RIGHT)
{
dir=LEFT;
}
else if(direct=='d'&&dir!=LEFT)
dir=RIGHT;
else if(direct=='w'&&dir!=DOWN)
dir=UP;
else if(direct=='s'&&dir!=UP)
dir=DOWN;
}
if(dir==RIGHT)
{
head->x=head->next->x+10;
head->y=head->next->y;
}
else if(dir==LEFT)
{
head->x=head->next->x-10;
head->y=head->next->y;
}
else if(dir==UP)
{
head->y=head->next->y-10;
head->x=head->next->x;
}
else if(dir==DOWN)
{
head->y=head->next->y+10;
head->x=head->next->x;
}
Sleep(100);
die();
setfillcolor(BLACK);
bar(0,0,800,600);
}
}
int main()
{
initLink();//蛇链表创立
initgraph(800, 600);
initSnack();//初始化蛇的位置、长度
initFood();//初始化食物
move();//蛇
closegraph();
return 0;
}
页:
[1]