精华内容
下载资源
问答
  • 按照课堂上教科书的顺序,我们应该学习好数学,特别是离散数学,才能学好C语言,学习好C语言需要学习数据结构,甚至中间还有很多基础,比如计算机的基本原理,模拟电路,数字电路。然后我们才能去学习java,甚至...

    我个人一直持有一种观点:能够快速看到结果取得成绩的付出,更容易坚持,也才能走的更远。我反对那种教科书式的学习:你需要先打好基础,然后按部就班的去学习。

    按照课堂上教科书的顺序,我们应该先学习好数学,特别是离散数学,才能学好C语言,学习好C语言还需要学习数据结构,甚至中间还有很多基础,比如计算机的基本原理,模拟电路,数字电路。然后我们才能去学习java,甚至java要学习好,还需要学习面向对象和软件工程。但是实际上按照这种方式去学习,能学死人。在你努力学习初中数学或者高中数学的时候,你并不能直接地看到学习数学对学习计算机的帮助,这个时候,你就很难坚持下去,尤其是自学。就好像原本你很喜欢篮球,有个家伙告诉你要打好篮球得先联系跑步,每天跑15公里,坚持三年再去打篮球,这样你会内功很足。这个理论没有错,但是很多人都放弃在了坚持长跑的路上,对篮球的兴趣被一点点的磨灭了。做计算机开发更是如此。

    所以我的观点非常简单:你如果想做java,或者喜欢java,那么去学习java就好了。真到用的时候,需要你去研究下数据结构和算法了,不妨找本书看看。如果用到数学了,那么在目的明确,而且兴趣盎然的情况下,学习什么都不难。一定要挑一个最简单的,经过1-2周的熬夜辛苦,能看到自己做出来了一个小东西,那么是一个helloworld 或者一个个人主页,足以让你兴奋到再坚持两周。

    挑自己最喜欢的,直接开始!!!!

    在路上你会慢慢找到所有你需要的,千万别在上路前准备太多,太多的准备消磨你的意志,打击你的信心,毁掉你的兴趣,最后让你心生哀怨一事无成!

    我写过一篇给初学者的文章,希望对你有用:张世玉:非专业人士应该如何上手学习编程​zhuanlan.zhihu.comd5d81a1205ddaa445372c93847b520f1.png

    展开全文
  • 对于计算机专业的大学生来说,我觉的先学C语言好。 目前国内高校计算机相关专业应该大部份都是以C语言作为入门语言来学习的,这套学习的路线已经维持了很多年了,当然也是有他的道理的。 而且对于大学生来说,并没有...
  • 流光是国内目前来说相当不错的黑客软件|||建议你还是先学BASIC语言吧.像VB 学习一下面向对象的理论 然后升级为c++ 你就需要一下学习一些数学知识 即使有现成的别人写的要也自己再照着输入一次.再往后你就可以自己看...
    流光是国内目前来说相当不错的黑客软件
    
    
    |||
    建议你还是先学BASIC语言吧.像VB 学习一下面向对象的理论 然后升级为c++ 你就需要一下学习一些数学知识 即使有现成的别人写的要也自己再照着输入一次.再往后你就可以自己看一下数据结构了 指针. 最主要是自己动手敲代码 链表 记下来.往下看就是了.等基础掌握差不多了再去看后面的结构体 多看.看不懂不要紧 然后多读 下别人的c语言经典代码100例 从零开始学. 基本语法.掌握了基本语法就就 就是小学文凭也一样...建议你看看c语言基础教程吧 
    你有心学  就是初中毕业 我看好你
    
    
     QBASIC都可以的.是编程中最简单的.学完对编程有初步了解后再学习C或Java这些比较难的语言.如果一步到位学习比较难的编程语言 但这就是后话了.
    
    
    |||
    C语言是比较基础的语言可以直接慢慢学
    
    
    |||
    编写流光软件的小榕 哥们 没问题的 只要你能耐住性子 对初学者特别是自学者难度很大的. 
    
    
    |||
    孙鑫的vc++视频
    
    
    |||
    学习一门语言与学历是没有任何关系的 
    展开全文
  • 大话数据结构

    2018-12-14 16:02:18
    C语言版大话数据结构与算法,很有趣,值得一读 大话数据结构 目 录 第1章数据结构绪论 1 1.1开场白 2 如果你交给某人一个程序,你将折磨他一整天;如果你教某人如何编写程序,你将折磨他一辈子。 1.2你数据结构...
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    初学者到底是应该先学C还是汇编? 答:对于单片机的初学者来说,应该从汇编学起。因为汇编语言是最接近机器码的一种语言,可以加深初学者对单片机各个功能模块的了解,从而打好扎实的基础。 7. 我是一名武汉...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    难道在C语言结构不能包含指向自己的指针吗? 1.15 如何定义一对相互引用的结构? 1.16 Struct{ }x1;和typedefstruct{ }x2;这两个声明有什么区别? 1.17 “typedefint(*funcptr)();”是什么意思? const...
  • 难道在C语言中一个结构不能包含指向自己的指针吗? o 2.7 怎样建立和理解非常复杂的声明?例如定义一个包含 N 个指向返回指向字符的指针的函数的指针的数组? o 2.8 函数只定义了一次, 调用了一次, 但编译器提示...
  • 难道在C语言结构不能包含指向自己的指针吗? 1.15 如何定义一对相互引用的结构? 1.16 Struct{ } x1;和typedef struct{ } x2; 这两个声明有什么区别? 1.17 “typedef int(*funcptr)();”是什么意思? const 限定...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    《你必须知道的495个C语言问题》结构清晰,讲解透彻,是各高校相关专业C语言课程很好的教学参考书,也是各层次C程序员的优秀实践指南。 -----------------------------------------------------------------------...
  • 难道在C语言结构不能包含指向自己的指针吗? 7  1.15 如何定义一对相互引用的结构? 9 1.16 Struct{ } x1;和typedef struct{ } x2; 这两个声明有什么区别? 10 1.17 “typedef int(*funcptr)();”是什么...
  • 难道在C语言结构不能包含指向自己的指针吗?  1.15 如何定义一对相互引用的结构?  1.16 Struct{ }x1;和typedefstruct{ }x2;这两个声明有什么区别?  1.17 “typedefint(*funcptr)();”是什么意思? const...
  • 难道在C语言结构不能包含指向自己的指针吗? 1.15 如何定义一对相互引用的结构? 1.16 Struct{ }x1;和typedefstruct{ }x2;这两个声明有什么区别? 1.17 “typedefint(*funcptr)();”是什么意思? const...
  • 本书结构清晰,讲解透彻,是各高校相关专业C语言课程很好的教学参考书,也是各层次C程序员的优秀实践指南。 内容预览: 第1章 声明和初始化  基本类型  1.1 我该如何决定使用哪种整数类型?  1.2 为什么不精确...
  • 难道在C语言结构不能包含指向自己的指针吗? 1.15 如何定义一对相互引用的结构? 1.16 Struct{ } x1;和typedef struct{ } x2; 这两个声明有什么区别? 1.17 “typedef int(*funcptr)();”是什么意思? const 限定...
  • 本书结构清晰,讲解透彻,是各高校相关专业C语言课程很好的教学参考书,也是各层次C程序员的优秀实践指南。 第1章 声明和初始化 30 基本类型 30 1.1 我该如何决定使用哪种整数类型? 30 1.2 为什么不精确定义...
  •  本书结构清晰,讲解透彻,是各高校相关专业C语言课程很好的教学参考书,也是各层次C程序员的优秀实践指南。 第1章 声明和初始化 30 基本类型 30 1.1 我该如何决定使用哪种整数类型? 30 1.2 为什么不精确定义...
  • 你必须知道的495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    难道在C语言中一个结构不能包含指向自己的指针吗? . . . . 3 1.7 怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返 回指向字符的指针的函数的指针的数组? . . . . . . . . . . . . . . 3 1.8 函数只定义...
  • 21天通C++ (中文第五版)

    热门讨论 2010-06-23 16:57:03
    1.3 应该学习C语言吗 1.4 C++、Java和C# 1.5 微软的C++可控扩展 1.6 ANSI标准 1.7 编程准备 1.8 开发环境 1.9 创建程序的步骤 1.9.1 用编译器生成对象文件 1.9.2 用链接器生成可执行文件 1.10 程序开发...
  • 狂人C程序员入门必备

    2014-01-17 13:32:44
    1.2.1 学习C语言编程都需要什么 1.2.2 最简单的C语言程序的基本结构 1.2.3 Dev C++ 1.3 printf()函数初步 1.3.1 简单的一般用法 1.3.2 特殊的字符 1.4 C语言的“字母”和“单词” 1.4.1 C语言的字母 1.4 12C语言的...
  • 用到的数据结构:链表实现的栈 参考:C语言—堆栈(链表实现) - changfan - 博客园 舍友看到我这一大堆栈的实现惊了,说你机试的时候真的有这么多时间写C吗?于是去看了看C++的写法——短时间里不能很熟练运用java...

    20.有效的括号

    用到的数据结构:链表实现的栈
    参考:C语言—堆栈(链表实现) - changfan - 博客园
    舍友看到我这一大堆栈的实现惊了,说你机试的时候真的有这么多时间写C吗?于是去看了看C++的写法——短时间里不能很熟练运用java,就先上C++吧。下面是几个需要学习的Part:

    关于map的使用
    在C里面,我是对着ascii码表看的,或者直接比较,而在C里面可以用Map做一个一对一的hash映射。参考:
    C++中map的使用_u011555996的博客-CSDN博客_c++ map
    map与unordered_map的区别
    .empty()
    判断容器是否为空。
    需要注意的是,在stack.top()顶端元素时,stack不可以为空。
    .size()
    在获取字符串长度时,size()函数与length()函数作用相同。 除此之外,size()函数还可以获取vector类型的长度。

    21. 合并两个有序链表

    我自己写的方法:

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     struct ListNode *next;
     * };
     */
    
    
    struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
        struct ListNode *p1 = l1;
        struct ListNode *q1 = l2;
        struct ListNode *cur = (struct ListNode*)malloc(sizeof(struct ListNode));
        struct ListNode *result = cur;
        int val1 = 0;
        int val2 = 0;
    
        while((p1 != NULL)||(q1 != NULL))
        {
            val1 = (p1 != NULL)?p1->val:32767;
            val2 = (q1 != NULL)?q1->val:32767;
            cur -> next = (struct ListNode*)malloc(sizeof(struct ListNode));
            cur = cur->next;
            if(val1 <= val2)
            {
                cur->val = val1;
                p1 = p1->next;
            }
            else
            {
                cur->val = val2;
                q1 = q1->next;
            }
        }
        while(p1 != NULL)
        {
            cur -> next = (struct ListNode*)malloc(sizeof(struct ListNode));
            cur = cur->next;
            cur->val = p1->val;
            p1 = p1->next;
        }
        while(q1 != NULL)
        {
            cur -> next = (struct ListNode*)malloc(sizeof(struct ListNode));
            cur = cur->next;
            cur->val = q1->val;
            q1 = q1->next;
        }
        cur->next = NULL;
        return result->next;
    }
    

    看到一种递归的写法:

    struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
        if (!l1)        //如果l1为空
    		return l2;
    	if (!l2)        //如果l2为空
    		return l1;
    	if (l1->val < l2->val){
    		l1->next = mergeTwoLists(l1->next, l2);
    		return l1;
    	}
    	else{
    		l2->next = mergeTwoLists(l1, l2->next);
    		return l2;
    	}
    }
    

    两种方法的运行时间和内存消耗差不多,递归的不好想但是写起来更简洁。

    35. 搜索插入位置

    在这里学习一下C++的数组。
    C++ vector& nums 用法一_年年のBlog-CSDN博客_vector& nums
    线性搜索:

    class Solution {
    public:
        int searchInsert(vector<int>& nums, int target) {
            int i;
            for(i=0 ; i<nums.size() ; i++)
            {
                if(nums[i] >= target)
                    return i;
            }
            return i;
        }
    

    38. 外观数列

    不知道为啥没看到我这种写法
    双100%
    在这里插入图片描述
    递归快乐!

    char * countAndSay(int n){
        if(n == 1)
            return "1";
        char *str = countAndSay(n-1);
        char *nstr = malloc(5000);		//n<30 最大需要5000长度的字符串
        int i = 0,len = strlen(str);
        int count = 1,j = 0;
        char key,num;
        while(i < len)
        {
            key = str[i];		//下面统计key出现的次数
            i++;
            while(str[i] == key && i<len)
            {
                i++;
                count++;
            }
            num = count+48;		//共出现了count次,转换为字符,'0'的ascii码是48
            nstr[2*j] = num; 
            nstr[2*j+1] = key;
            count = 1;
            j++;
        }
        nstr[2*j] = '\0';		//没有初始化过,堵上,不然会乱码
        return nstr;
    }
    

    用C++写的话,是一样的逻辑,但是就慢了很多……没有学过C++的程序优化,所以不太清楚是哪里慢了。不过拼接字符串是很爽的事情。

    class Solution {
    public:
        string countAndSay(int n) {
            if(n == 1)
                return "1";
            string str = countAndSay(n-1);
    
            char key;
            int count = 1;
            int i = 0,len = str.length();
            string nstr = "";
            while(i<len)
            {
                key = str[i];
                i++;
                while(i<len && str[i] == key)
                {
                    count++;
                    i++;
                }        
                nstr += to_string(count) + key;
                count = 1;
            }
            return nstr;
        }
    };
    

    53. 最大子序和

    这一题有大神写了很棒的题解:题解
    法1:动态规划
    用dp[i]表示以nums[i]结尾的最大子序和。
    dp[0] = nums[0];
    dp[i] = max{ dp[i-1]+nums[i] , nums[i] };
    当然也可以只记录最大dp值,这样就可以不用存整个dp数组,空间上更小。
    这里又用到了一个很好用的库.max()

    class Solution {
    public:
        int maxSubArray(vector<int>& nums) {
            int numsize = nums.size();
            int dp = nums[0];
            int result = dp;
            int i;
            for(i=1 ; i<numsize ; i++)
            {
                dp = max(dp+nums[i],nums[i]);
                result = max(dp,result);
            }
            return result;
        }
    };
    

    法2:贪心法
    贪心算法不一定能找到最优解。

    class Solution {
    public:
        int maxSubArray(vector<int>& nums) {
            int numsize = nums.size();
            int sum = 0;
            int result = INT_MIN;
            int i;
            for(i=0 ; i<numsize ; i++)
            {
                sum += nums[i];
                result = max(result,sum);
                if(sum < 0)
                    sum = 0;
            }
            return result;
        }
    };
    

    别的方法就有些复杂,对这道题不是很适用了。

    66. 加一

    一开始是这样写的:

    class Solution {
    public:
        vector<int> plusOne(vector<int>& digits) {
            int len = digits.size();
            int i,carry = 0;
            vector<int> res;
            
            for(i=len-1 ; i>=0 ; i--)
            {
                if(i == len-1)
                    digits[i]++;
                digits[i] += carry;
                carry = (digits[i])/10;
                res.insert(res.begin(),digits[i]%10);
            }
            if(carry)
                res.insert(res.begin(),1);
            return res;
        }
    };
    

    然后我被自己的内存消耗暴击了……后面没有单独声明数组res,差别不大。
    这里注意一个写法:在数组头部插入res.insert(res.begin(),num);
    然后发现大家在进位这件事上做文章。从后向前遍历,置所有的9为0,将第一个不为9的数+1.
    特殊情况下,9999……99999,则需要在最前面补1.

    class Solution {
    public:
        vector<int> plusOne(vector<int>& digits) {
            int len = digits.size();
            int i;
            
            for(i=len-1 ; i>=0 ; i--)
            {
                if(digits[i] == 9)
                    digits[i] = 0;
                else
                {
                    digits[i]++;
                    return digits;
                }
            }
            if(i < 0)
                digits.insert(digits.begin(),1);
            return digits;
        }
    };
    

    然后我仍旧被内存消耗暴击,甚至比之前还多……不知道为什么别人这样写就是双百。

    69. x 的平方根

    二分法啦

    class Solution {
    public:
        int mySqrt(int x) {
            if(x == 1 || x == 0)
                return x;
            int min = 0, max = x;
            int res,last = 0;
            while(true)
            {
                res = (min+max)/2;
                if(last == res)
                    return res-1;
                if(x/res < res)
                    max = res;
                else
                    min = res+1;
                last = res;
            }
        }
    };
    

    需要注意的是,为了避免乘法溢出,我们使用除法来判断大小。
    k = (min+max)/2;
    如果k大了,到(min,k)里去找
    如果k小了,到(k+1,max)里去找
    结果偏大,-1.

    70. 爬楼梯

    这真的不是在考我小学奥数?
    首先要理解这个题目,得到一个动态规划的式子:
    f(x) = f(x-1)+f(x-2);
    即,爬x阶楼梯的方法数 = 爬x-1阶的方法数+爬x-2阶的方法数
    因为倒着想,爬到x阶前,你可以爬1阶,也可以爬2阶。如果是爬1阶,那么你已经爬了x-1阶;如果是爬2阶,那么你已经爬了x-2阶。
    写到这里我已经不认识爬字了。
    好了,理解了这个之后,我们就可以得到一个斐波那契数列:1,2,3,5,8,13……
    所以,这就是求斐波那契数列的一个题,understand?
    而在理解之前,我一直尝试用排列组合求解(跪)

    解斐波那契数列有两种比较容易想到的方法:1.递归;2.滑动窗口
    在上C语言课的时候,我们都在这里学习了递归的思想,然而实际上用递归的话,函数套函数,卷卷卷卷卷,到n = 44就会超时。所以标答给的是滑动窗口的解法。下面是我自己根据滑动窗口写的答案,双百,时间复杂度是O(n).

    class Solution {
    public:
        int climbStairs(int n) {
            if(n == 1)
                return 1;
            else if(n == 2)
                return 2;
            int a = 1, b = 2, c;
            int i;
            for(i=3;i<n+1;i++)
            {
                switch(i%3){
                    case 0:
                        c = a+b;
                        break;
                    case 1:
                        a = c+b;
                        break;
                    case 2:
                        b = a+c;
                        break;
                }
            }
            i = max(a,b);
            return max(i,c);
        }
    };
    

    当然斐波那契数列由来已久,大家闲得发慌,给出了几种时间复杂度O(logn)的解法。至此,这道题已经从小学奥数题变成了考研数学题,需要用到一系列线代知识和高数知识。本来我买考研数学辅导书回来只是想回忆一下这些知识,还被一众小伙伴嘲笑浪费钱,但是事实证明,大学里学的数学真的很重要!!!
    官方解答

    展开全文
  • 51单片机自学笔记

    2016-07-27 22:24:19
    10.1.1 Keil 软件的安装189, 10.1.2 Keil软件的使用191, 10.2 C语言的基本结构196, 10.3 标识符和关键字198, 10.4 从储物盒想到数据类型200, 10.4.1 C语言中的数据类型201, 10.4.2 常量与变量201, 10.4.3 整型数据...
  • windows 程序设计

    2011-07-24 21:16:30
    但大多数情况下,您应非常熟悉该语言,特别是C语言结构和指针。了解标准C语言执行期链接库的一些相关知识是有帮助的,但不是必要的。 第三,您应该在机器上安装一个适于进行Windows程序设计的32位C语言编译器和...

空空如也

空空如也

1 2
收藏数 38
精华内容 15
关键字:

学数据结构需要先学c语言吗

c语言 订阅
数据结构 订阅