小墨hacker 发表于 2015-11-10 17:15:52

学习记录,从0开始

  今年9月中旬接触C语言,计算机专业学生。
  说来也是缘分。高考分数很理想,却因为报考的大学太热门没进到学校的王牌专业“建筑规划”。
  九月前几乎没接触过编程(高二的时候玩网游用过按键精灵...)。自认为为0基础的自己会跟不上学校的学习节奏,就百度了入门经验,晚上捧着网友推荐的《C Primer Plus》看(那时学校还没发教材)。看是看书实在太枯燥了进度几乎为0,直到后来机缘巧合之下发现了小甲鱼的C语言教学视屏,又通过视屏了解到论坛。
      看视屏学习进度飞快,现在已经能做出贪吃蛇了,哈哈。到了程序设计课都想翘掉,觉得学校课太慢了。(学校也有视屏,但是学校的MOOC视屏简直就是惨不忍睹...和有声教材读物没啥区别)
      我会把我每天的进度放在这,同时还有问题和笔记等。
      ps.不知道会不会放错板块。板块中没发现长期的记录贴,这不算水贴吧?楼下补上11.10之前的学习记录。

小墨hacker 发表于 2015-11-10 17:28:32

本帖最后由 小墨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;
}

小墨hacker 发表于 2015-11-10 17:44:40

找不到最开始的程序了,这是十月下旬后来学指针的时候回来改的。
零散的学习进度很快,基本一个月就学到函数、指针这部分。但是弊端也是极其严重,楼主当时连什么是形参实参都不知道(还有全局参数等等,之前依葫芦画瓢没问题,自己一改加入指针部分就疯狂报错。自己还作死加了常量,又弄混了常量指针和指针常量...5555)
后来下旬的时候就开始刷视屏了,把漏洞都补上,感觉这样学特别浪费时间。
当时连DEBUG都不知道,为了检查哪出错了在函数里狂加printf检测各个变量...被自己蠢哭。

小墨hacker 发表于 2015-11-10 17:51:32

本帖最后由 小墨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]
查看完整版本: 学习记录,从0开始