从零开始学习C语言 源代码

1、

#include <stdio.h>
#include <string.h>

int main()
{
    char str[100];
    scanf("%s", str);

    int length = strlen(str);//strlen得到字符串的长度,不算末尾的'\0',字符串一定要考虑结尾的'\0'
    bool isHuiwen = true;
    for(int i = 0;i < length/2;i++)   //想想为什么是i < length/2  而不是i <= length/2,这是折半比较的重要分割
    {                                 //回文会有asddsa 和asdsa 这两种情况
        if(str[i] != str[length-i-1])  //想想为什么是length-i-1  提示:str[length-1]是字符串最后一个元素
        {
            isHuiwen = false;
            break;//一旦有一个不符合回文就可以结束循环了
        }
    }
    if(isHuiwen)
        printf("yes");
    else
        printf("no");

    return 0;
}

2、

#include <stdio.h>
#include <string.h>

int main()
{
    char src[100];
    char dest[100];
    scanf("%s", src);

    int length = strlen(src);//strlen得到字符串的长度,不算末尾的'\0',字符串一定要考虑结尾的'\0'
    int src_i = length-1, dest_i = 0;
    while(src_i >= 0)
    {
        dest[dest_i++] = src[src_i--];//把src的元素,从后到前依次赋值给dest,然后把下标移位
    }
    dest[dest_i] = '\0';//很重要!!!dest的结尾加个0,作为字符串结束的标志  这里的dest_i是几?为什么
    printf("%s", dest);

    return 0;
}

3、

#include <stdio.h>

int main()
{
    int num[3][3] = {1,2,3,
                     4,5,6,
                     7,8,9};
    //方法1
    int newNum[3][3];
    for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 3; j++)
        {
            newNum[i][j] = num[j][i];//这样是赋值到新的数组中,其实可以不赋值到新数组中,直接在原数组里边交换
        }
    }
    for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 3; j++)
        {
            printf("%d ", newNum[i][j]);
        }
        printf("\n");//常用的二维数组输出方式
    }
    //=========================
    printf("\n\n");
    //方法2
    for(int i = 0; i < 3; i++)
    {
        for(int j = i+1; j < 3; j++) //j的起始是i+1,因为只需换矩阵的右上部分,右上和左下对调
        {
            int temp = num[i][j]; //通过临时变量,互换两个位置的值
            num[i][j] = num[j][i];
            num[j][i] = temp;
        }
    }
    for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 3; j++)
        {
            printf("%d ", num[i][j]);
        }
        printf("\n");//常用的二维数组输出方式
    }

    return 0;
}

4、

(1)

#include <stdio.h>
#include <string.h>
void huiwen(char *str)
{
    int length = strlen(str);//strlen得到字符串的长度,不算末尾的'\0',字符串一定要考虑结尾的'\0'
    bool isHuiwen = true;
    for(int i = 0;i < length/2;i++)   //想想为什么是i < length/2  而不是i <= length/2,这是折半比较的重要分割
    {                                 //回文会有asddsa 和asdsa 这两种情况
        if(str[i] != str[length-i-1])  //想想为什么是length-i-1  提示:str[length-1]是字符串最后一个元素
        {
            isHuiwen = false;
            break;//一旦有一个不符合回文就可以结束循环了
        }
    }
    if(isHuiwen)
        printf("yes");
    else
        printf("no");
}

int main()
{
    char string[100];//特意修改了实参的名称,区分void huiwen(char *str)的形参
    scanf("%s", string);
    huiwen(string);

    return 0;
}

(2)

#include <stdio.h>
#include <string.h>
void output(char *src, char *dest)
{
    int length = strlen(src);//strlen得到字符串的长度,不算末尾的'\0',字符串一定要考虑结尾的'\0'
    int src_i = length-1, dest_i = 0;
    while(src_i >= 0)
    {
        dest[dest_i++] = src[src_i--];//把src的元素,从后到前依次赋值给dest,然后把下标移位
    }
    dest[dest_i] = '\0';//很重要!!!dest的结尾加个0,作为字符串结束的标志  这里的dest_i是几?为什么
}

int main()
{
    char str1[100];//思考,参数的值传递和地址传递,两个的区别是什么
    char str2[100];
    scanf("%s", str1);

    output(str1, str2);

    printf("%s", str2);

    return 0;
}

(3)

#include <stdio.h>
void array(int **num, int m)
{
    for(int i = 0; i < m; i++)
    {
        for(int j = i+1; j < m; j++) //j的起始是i+1,因为只需换矩阵的右上部分,右上和左下对调
        {
            //这里是变动比较大的地方。由于数组作为参数传进来,变成了指针,在这个函数内部,他是不知道是个m*m的数组
            //由于数组在内存中的存储是连续的num[0][0]可以近似的认为是num[0],而num[1][0]可以近似的认为是num[1*3+0]
            //接下来涉及的就是一些指针的强制转换了。这里比较复杂,可以查阅下相关资料,也可以问我
            int temp = *((int*)num+i*m+j);
            *((int*)num+i*m+j) = *((int*)num+j*m+i);
            *((int*)num+j*m+i) = temp;
        }
    }
}

int main()
{
    int num[3][3] = {1,2,3,
                     4,5,6,
                     7,8,9};
    array((int**)num, 3);//注意num的使用方式  作为void array(int **num, int m,int n)的参数

    for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 3; j++)
        {
            printf("%d ", num[i][j]);
        }
        printf("\n");//常用的二维数组输出方式
    }

    return 0;
}

5、

#include <stdio.h>
void BubbleSort(int *num, int len)
{
    for(int i = 1;i < len;i++)//从第二个元素开始,因为比较的时候是当前元素和前一个元素比较
    {
        for(int j = len-1;j >= i;j--)//内层循环从最后一个元素开始向前,把最小的元素放到这次循环的最前边
        {
            if(num[j-1] > num[j])     //如果前边的比后边的大,交换,使得最小的一直在最前边,可以在纸上比划一下
            {
                int temp = num[j-1];//熟悉的交换
                num[j-1] = num[j];
                num[j] = temp;
            }
        }//完成一趟操作,每一趟,在前端都会出现一个最小的“泡”
    }
}

int main()
{
    int num[5] = {1,4,3,2,5};
    BubbleSort(num,5);

    for(int i = 0;i<5;i++)
    {
        printf("%d ", num[i]);
    }
    return 0;
}

6、

#include <stdio.h>
typedef bool (*COMP)(int,int);//函数指针做参数的方法2的必要定义

bool compara1(int a, int b)
{
    return a < b;//a<b返回true
}
bool compara2(int a, int b)
{
    return a > b;//a>b返回true
}

void fun(int num1, int num2, bool (*comp)(int,int))//函数指针作为参数,方法1
{
    if(comp(num1, num2))  //comp这里是函数指针,函数类型为 bool comp(int a, int b)
    {
        printf("AAAAA\n");
    }
    else
    {
        printf("BBBBB\n");
    }
}

void fun2(int num1, int num2, COMP comp2)//使用typedef定义函数指针类型,函数指针做参数 方法2
{
    if(comp2(num1, num2))
    {
        printf("CCCCC\n");
    }
    else
    {
        printf("DDDDD\n");
    }
}

int main()
{
    fun(4,5,compara1);//函数指针作为参数,没有括号
    fun(4,5,compara2);

    fun2(4,5,compara1);
    fun2(4,5,compara2);
    return 0;
}

7、

#include <stdio.h>
typedef bool (*COMP)(int,int);//函数指针做参数的方法2的必要定义

bool compara1(int a, int b)
{
    return a < b;//a<b返回true
}
bool compara2(int a, int b)
{
    return a > b;//a>b返回true
}

void QuickSort(int *num, int left, int right, bool (*comp)(int,int))
{
    if(left < right)
    {
        int i = left, j = right;
        int key = num[i];

        while(i < j)
        {
            while(i<j && comp(key, num[j]))//比较函数,使用函数指针
                j--;
            if(i<j)
                num[i++] = num[j];
            while(i<j && comp(num[i], key))//比较函数,使用函数指针
                i++;
            if(i<j)
                num[j--] = num[i];
        }
        num[i] = key;
        QuickSort(num, left, i-1, comp);
        QuickSort(num, i+1, right, comp);
    }
}

int main()
{
    int num[5] = {1,4,3,2,5};

    QuickSort(num, 0, 4, compara1);//修改函数指针即可实现升序或者降序排序,可以将compara1改为compara2试试效果

    for(int i = 0;i<5;i++)
    {
        printf("%d ", num[i]);
    }
    return 0;
}

8、

#include <stdio.h>
#include <string.h>
void output(char *src, char *dest)//4.2中写的函数
{
    int length = strlen(src);//strlen得到字符串的长度,不算末尾的'\0',字符串一定要考虑结尾的'\0'
    int src_i = length-1, dest_i = 0;
    while(src_i >= 0)
    {
        dest[dest_i++] = src[src_i--];//把src的元素,从后到前依次赋值给dest,然后把下标移位
    }
    dest[dest_i] = '\0';//很重要!!!dest的结尾加个0,作为字符串结束的标志  这里的dest_i是几?为什么
}

bool output2file(char *filenameIn, char *filenameOut)
{
    //http://www.jb51.net/article/37688.htm  C语言文件相关函数看这里
    FILE *fpIn, *fpOut;//声明两个文件指针

    if ( (fpIn=fopen(filenameIn,"r+")) == NULL )
    {
        printf( "open %s error\n", filenameIn );//如果打开文件失败就退出函数
        return false;
    }
    if ( (fpOut=fopen(filenameOut,"w+")) == NULL )
    {
        printf( "open %s error\n", filenameOut );
        return false;
    }
    char bufSrc[512],bufDest[512];//假设文件中的字符串长度不会超过512个字符

    fscanf(fpIn, "%s", bufSrc);//从文件中读取字符串

    output(bufSrc, bufDest);//执行4.2的功能,将bugSrc字符串倒序,放到bugDest

    fprintf(fpOut, "%s", bufDest);//向文件中写入字符串

    fclose(fpIn);//文件指针打开后,结尾不用时一定一定要关闭,否则可能导致之后本次程序再次使用的时候,无法打开文件
    fclose(fpOut);
    return true;
}

int main()
{
    char *filein = "D:\\filein.txt";
    char *fileout = "D:\\fileout.txt";

    output2file(filein, fileout);

    return 0;
}
第一篇 JavaScript入门篇 第1章 初步了解JavaScript 1.1 JavaScript是什么 1.2 JavaScript能做什么 1.2.1 表单数据合法性验证 1.2.2 页面特效 1.2.3 交互式菜单 1.2.4 动态页面 1.2.5 数值计算 1.3 JavaScript编程起步 1.3.1 “Hello World!”程序 1.3.2 选择JavaScript脚本编辑器 1.4 如何引入JavaScript脚本代码 1.4.1 通过<script>与</script>标记对引入 1.4.2 通过<script>标记的src属性引入 1.4.3 通过JavaScript伪URL引入 1.4.4 通过HTML文档事件处理程序引入 1.5 嵌入JavaScript脚本代码的位置 1.5.1 在<head>与</head>标记对之间放置 1.5.2 在<body>与</body>标记对之间放置 1.5.3 在两个标记对之间混合放置 1.6 选择合适的浏览器 1.7 处理不支持JavaScript脚本的情况 1.7.1 使用<!——和——>标记对直接屏蔽法 1.7.2 使用<noscript>和</noscript>标记对给出提示信息 1.8 本章小结 1.9 本章习题 第2章 JavaScript编程的语言基础 第3章 JavaScript事件处理 第4章 JavaScript基于对象编程 第5章 文档对象模型(DOM) 第6章 String、Math、Array等数据对象 第7章 Window及相关顶级对象 第8章 Document对象 第9章 HTML元素对象 第二篇 JavaScript进阶篇 第10章 正则表达式 第11章 客户端与服务器端通信 第12章 JavaScript与Ajax技术 第13章 JavaScript错误与异常处理 第三篇 JavaScript实例篇 第14章 JavaScript与插件通信 第15章 JavaScript常用特效收集
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值