如何提高编程能力?(上)_i++

0.说在前面1.i++与++i总结1.1 i++与++i1.2 区别总结:2.大小写转化3.交换字符串3.1 使用传字符串地址3.2 使用strcpy函数3.3 自写字符串交换函数3.4 同3.3自写函数4.字符串中单词4.1 统计字符串中单词个数4.2 最长单词及位置5.字符串与整数5.1 把字符串分别转换成面值相同的整数5.2 产生[m,n]范围内的随机数num6.复制字符串6.1 主函数6.2 五种方法复制字符串6.3 最简单方法7.删除*号7.1 删除除了尾部之外的其余*号7.2 只删除前面*号8.约瑟夫环9.文件16.1 求文件字节数16.2 读取文件中的数据10.汉诺塔问题11.三天打鱼两天晒网12.猴子分桃问题12.1 递归实现12.2 正向求解12.3 逆向求解13.斐波那契数列13.1 递归实现13.2 非递归实现14.特殊数14.1 用穷举法求某数段的素数14.2 水仙花数14.3 完全平方数14.4 完数14.5 同构数15.最小公倍数与最大公约数16.验证哥德巴赫猜想17.求近似数17.1 牛顿迭代法17.2 精简版17.3 二分法17.4 弦截法18.矩阵运算及二维数组18.1 求两个矩阵之和、之积18.2 二维数组19.位运算及应用19.1 位运算19.2 一个字节中被置为1的位的个数20.排序算法20.1 快速排序20.2 冒泡排序20.3 选择排序20.4 直接插入排序21.链表21.1 单链表之增删改查21.2 头插法21.3 链表逆置22.栈及栈应用22.1 入栈出栈及判空实现22.2 栈实现括号匹配23. 二叉树23.1 二叉树所有操作24.必会小点24.1 四舍五入24.2 逗号表达式24.3 void 类型指针24.4 内存分配24.5 质数分解24.6 大小写转化24.7 字符数字转化为整型数字25.常考小点25.1 完数25.2 闰年25.3 统计输入的数是几位数25.4 注意事项25.5 字符串比较25.6 转二进制25.7 文件指针25.8 sizeof与strlen25.9 转义符25.10 数字正反序25.11 求最后三位25.12 一维与二维数组对比25.13 优先级

0.说在前面

这是一篇8542字的长长长长…文,我知道你不会看完,没关系,先收藏,在转发,哈哈,觉得不错,可以帮我转发。

由于篇幅太长,所以只能分三篇发~~

1.i++与++i总结

1.1 i++与++i

下面注释的都可以使用,开启依次尝试!

#include<stdio.h>
int main()
{
    int i = 0;
    int a;

//    i++;
//    printf("%d\n",i);  //i=1---i=i;i=i+1;

//    ++i;
//    printf("%d\n", i);  //i=1---i=i+1;i=i;

//    a = i++;
//    printf("%d\n", a);   //a=0 ---a=i;i=i+1;

//    a = ++i;
//    printf("%d\n", a);  //a=1 ---i=i+1;a=i;

//    a=i+i++;
//    printf("%d\n", a);  //a=0 ---a=i+i;i=i+1;

//    a = i + ++i;
//    printf("%d\n", a);  //i=i+i->i=1->a=i+i;->a=2

//    a = i + ++i + ++i;
//    printf("%d\n", a);//i=i+1->i=1->i=i+1->i=2->a=i+i+i;a->6

//    a = i + ++i + i++;
//    printf("%d\n", a);//i++->最后进行加1,++i,此时加1,i=1->a=i+i+i;a=3;->i++中i操作,i=i+1

//    i = i + ++i + i++;
//    printf("%d\n",i);//i=4

//    a = i + (i++) + (i++);
//    printf("%d\n", a); //a=i+i+i;->i=i+1->i=1;->i=i+i->i=2;

//    i = i + (i++) + (i++);
//    printf("%d\n", i); //i=2

    return 0;

}

1.2 区别总结:

i++ 返回原来的值,++i 返回加1后的值。

左值与右值的根本区别在于是否允许取地址&运算符获得对应的内存地址。

左值是对应内存中有确定存储地址的对象的表达式的值,而右值是所有不是左值的表达式的值。

int i=0;
int *p1=&(++i); //True
int *p2 = &(i++); //False

++i=1;  //True
i++=5;  //False

2.大小写转化

#include<ctype.h>
toupper()/tolower()
例:str[i]=toupper(str[i]);
str[i]=tolower(str[i]);

3.交换字符串

3.1 使用传字符串地址

strSwap(&str1,&str2);

void strSwap(char **pa,char **pb)
{
    char *temp;
    temp = *pa;
    *pa = *pb;
    *pb = temp;
}

3.2 使用strcpy函数

strswap(str1,str2);

void strswap(char *pa, char *pb)
{
    char temp[100];
    strcpy(temp, pa);
    strcpy(pa, pb);
    strcpy(pb, temp);

}

3.3 自写字符串交换函数

strswap(str1,str2);

void strswap(char *pa,char *pb)
{
    char temp[100];
    int i;
    for(i=0;pa[i]!='\0';i++)
        temp[i]=pa[i];
    temp[i]='\0';
    for(i=0;pb[i]!='\0';i++)
        pa[i]=pb[i];
    pa[i]='\0';
    for(i=0;temp[i]!='\0';i++)
        pb[i]=temp[i];
    pb[i]='\0';
}

3.4 同3.3自写函数

strcp(char *p1, char *p2)
{

    while((*p1=*p2)!='\0')
    {
        p1++;
        p2++;
    }
    p1='\0';
}

void strswap(char *pa,char *pb)
{
    char temp[100];
    strcp(temp,pa);
    strcp(pa,pb);
    strcp(pb,temp);
}

4.字符串中单词

4.1 统计字符串中单词个数

其中包含实现了对单词中第一个字符大写

int upfst(char *p)
{
    int cong = 0; //判断前一字符是否为空格标志
    int count = 0; //统计单词个数
    //for (;*p;p++)
    while(*p)
    {
        if (cong)   //前一字符不为空格
        {
            if (*p == ' ')
                cong = 0;
        }
        else    //前一字符是空格操作
        {
            if (*p != ' ')
            {
                cong = 1;
                *p = toupper(*p);  //#include<ctype.h>
            //  *p = *p - 32;  //转大写
                count++;
            }
        }
        p++;
    }
    return count;
}

4.2 最长单词及位置

输出一行字符串中的最长单词及其位置

//输出一行字符串中的最长单词及其位置
#include<stdio.h>
int main()
{
    int word_length = 0, word_max=0;
    printf("请输入一个字符串:");
    char s[20];
    gets_s(s);
    int i,p;//这个p是用来记录最长单词的位置
    for (i = 0; s[i] != '\0'; i++)
    {
        if (s[i] == ' ')//扫到空格,则结算是否为最长的单词
        {
            if (word_length > word_max)
            {
                word_max = word_length;
                p = i;
            }

            word_length = 0;
        }
        else//如果i扫到的不是空格,那么开始计算单词的长度
            word_length++;

    }

    if (word_length > word_max)//此乃用于最长的单词在结尾的情况
    {
        word_max = word_length;
        p = i;
    }
    printf("最长单词的位置:%d\n",p-word_max+1);
    char longest[100];
    for (p = p - word_max, i = 0; word_max > 0; word_max--,p++, i++)
        longest[i] = s[p];
    longest[i] = '\0';
    printf("The longest word is %s\n", longest);

    return 0;
}

5.字符串与整数

5.1 把字符串分别转换成面值相同的整数

long  d = 0;
while (*s)
    if (isdigit(*s))
    {
        d = d * 10 + *s - '0';
        //或d = d * 10 + *s - 48;
        s++;
    }

5.2 产生[m,n]范围内的随机数num

int num=rand()%(n-m+1)+m;

6.复制字符串

6.1 主函数

#include<stdio.h>
#include<string.h>
int main()
{
    char *Mystrcpy(char *s1, char *s2);
    void print(char *s1);
    char a[] = "adad";
    char b[20],*s;
    /*未封装函数*/
    char *p1, *p2;
    /*p1 = a;
    p2 = b;*/
    while (*p1 != '\0')
    {
        *p2 = *p1;
        p1++;
        p2++;

    }
    int i;
    *p2 = '\0';
    for (i = 0; b[i] != '\0'; i++)
    {
        printf("%c",b[i]);
    }
    printf("\n");
    return 0;
    /*封装函数后调用*/
    s=Mystrcpy(b,a);
    print(s);
}

6.2 五种方法复制字符串

/*复制字符串*/
/*方法一*/
char *Mystrcpy(char *s1,char *s2)
{

    char *p1, *p2;
    p1 = s1; p2 = s2;

    /*方法一*/
    /*while (*p2 != '\0')
    {
        *p1 = *p2;
        p1++;
        p2++;

    }
    *p1 = '\0';*/

    /*方法二*/
    //while (*p1++=*p2++);

    /*方法三*/
    //方法三实际上等价于方法二
    //注意此处"="只有一个,为赋值运算并非等于运算
    /*while (*p1=*p2)
    {
        p1++;
        p2++;
    }
*/
    //方法四
    /*
    '\0'字符串对应的ASCII为0,当p2所指向的字符为'\0'时,此时退出循环,未将结束字符串标记赋值给p1所指向的字符串。故在最后加上*p1='\0'/
    */
    do
    {
        *p1++ = *p2++;
    } while (*p2);
    *p1 = '\0';
    /*
    方法五
    方法四等同于方法五
    */
    while (*p2)
    {
        *p1++ = *p2++;
    }
    *p1 = '\0';

    return s1;
}

void print(char *s1)
{
    int i;
    for (i = 0; s1[i] != '\0'; i++)
    {
        printf("%c", s1[i]);
    }
    printf("\n");

}

6.3 最简单方法

/*复制字符串最简单方法*/
#include<stdio.h>
#include<string.h>
int main()
{
    char s1[] = "asda";
    char s2[20];

    strcpy(s2,s1);
    printf("%s",s2);
}

7.删除*号

7.1 删除除了尾部之外的其余*号

void  fun(char *a, char *p)
{
    char *t = a;

    //先把字符串中非*字符存储,此时指针刚好指到最后一个字母的下一个字符(此时为*)
    for (; t <= p; t++)
        if (*t != '*')
            *(a++) = *t;
    //若当前字符串未扫描完,继续将其余所有的*存储,就实现了删除尾部之外的其余*号
    for (; *t != '\0'; t++)
        *(a++) = *t;
    *a = '\0';

}

7.2 只删除前面*号

char *p = a;
while (*p == '*')
p++;
for (; *p != '\0'; p++, a++)
    *a = *p;
*a = '\0';
或者
char *p = a;
while (*p++ == '*')
    p++;
strcpy(a,p)

8.约瑟夫环

#include<stdio.h>
int main()
{
    int out_person = 0;
    int n,m,k;
    printf("请输入人数:");
    scanf("%d",&n);
    printf("请输入逢几退一:");
    scanf("%d", &m);
    int i;
    int a[100];

    for (i = 0; i < n; i++)
        a[i] = i+1;
    i = 0;
    while (out_person < n - 1)
    {
        if (a[i] != 0)
        {
            k++;
        }
        if (k == m)

        {
            a[i] = 0;
            out_person++;
            k = 0;
        }
        i++;
        if (i == n)
            i = 0;
    }
    int *p = a;
    while (*p == 0)
        p++;
    printf("The last one is %d\n",*p);
    return 0;
}

9.文件

16.1 求文件字节数

先fseek到末尾再用ftell得出当前位置,即为总文件字节数
fseek(fp,0l,SEEK_END);
int filesize=ftell(fp);

16.2 读取文件中的数据

//读取文件中的数据
#include<stdio.h>
#include<malloc.h>
int main()
{
    FILE *fp;
    char *p;
    fp = fopen("d:\\file.txt","r");
    fseek(fp,0l,SEEK_END);
    long filesize = ftell(fp);
    rewind(fp);或者fseek(fp,0l,SEEk_SET);
    p = (char *)malloc(filesize+1);
    fread(p,1,filesize,fp);
    p[filesize] = 0;
    puts(p);
    free(p);
    fclose(fp);

    return 0;
}

10.汉诺塔问题

#include<stdio.h>
int main()
{
    void move(int n, char pre, char mid, char end);
    int n;
    printf("请输入要移动的块数:");
    scanf("%d",&n);
    move(n,'a','b','c');

}

void move(int n,char pre,char mid,char end)
{
    if (n == 1)
        printf("%c->%c\n",pre,end);
    else
    {
        move(n - 1, pre, end, mid);
        move(1,pre,mid,end);
        move(n-1,mid,pre,end);
    }

}

11.三天打鱼两天晒网

#include<stdio.h>
int main()
{
    int year, month, day;
    int syear, smonth;
    int a[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    printf("Please input year.month.date:\n");
    scanf("%d,%d,%d",&year,&month,&day);
    int i,m;
    syear = 0;
    m = 365;
    for (i = 1990; i < year; i++)
    {
        if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0))
            syear = m + 1;
        else
            syear = m;
    }
    smonth = 0;
    int k;
    //最后一年前几个月天数
    for (i = 1; i < month; i++)
    {
        smonth += a[i];
    }

    if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0))
        if (month > 2)
        {
            smonth += 1;
        }

    i = syear + smonth + day;

    k = i % 5;
    if (k==1||k==2||k==3)
        printf("今天打渔!\n");
    else
        printf("今天晒网!\n");
    return 0;
}

12.猴子分桃问题

海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,

12.1 递归实现

//递归
#include<stdio.h>
int divided(int n, int m)
{
    //不足5个或不能分5份多1个,分配失败
    if (n / 5 == 0 || n % 5 != 1)
        return 0;
    //分到最后一个猴子,说明能分配成功
    if (m == 1)
        return 1;
    return divided(n-n/5-1,m-1);

}

int main()
{
    int n;
    int m = 5;
    for (n = 1;; n++)
    {
        if (divided(n, m))
        {
            printf("%d\n",n);
            break;
        }
    }
    return 0;
}

12.2 正向求解

//猴子分桃问题
#include<stdio.h>

int main()
{
    int i,num,k;
    for (i = 6;; i += 5) //对所有能分成5份的进行试探
    {
        num = i;
        //5个猴子做同样分挑操作
        for (k = 0; k < 5; k++)
        {
            if (num / 5 == 0 || num % 5 != 1)
                break; /*如果剩余的桃子分不成5份或者分成5份后不会正好多余1个桃子,则说明分桃过程进行不下去了,结束分桃*/
            num = num - num / 5 - 1; /* 如果分桃过程能进行下去,拿走一份,扔掉1个,下一个猴子继续分桃*/

        }
        if (k >= 5)
        {
            break;/*如果上面的循环顺利结束,说明分桃顺利结束,找到了符合条件的最小桃子数,返回*/
        }
    }
    printf("最少桃树为:%d\n",i);
}

12.3 逆向求解

/*还有一种逆向求解的方法,探试的次数要少一点*/
#include<stdio.h>
int MinNum()
{
    int i, j, num;
    for (i = 6;; i += 5)
    {
        num = i;
        for (j = 5; j > 1; j--)
        {
            if (num % 4)
                break;
            num = num + num / 4 + 1;

        }
        if (j <= 1)
            return num;

    }
}
int main()
{
    printf("最少桃子数为:%d\n", MinNum());
    return 0;
}

13.斐波那契数列

13.1 递归实现

int fib1(int n)
{
    if (n == 1 || n == 2)
        return 1;
    else
        return fib1(n-1)+fib1(n-2);
}

13.2 非递归实现

int fib2(int n)
{
    int f1, f2, f3;
    f1 = 1;
    f2 = 1;
    f3 = 0;
    if (n == 1 || n == 2)
        f3=1;
    else
    {
        while (n > 2)
        {
            f3 = f1 + f2;
            f1 = f2;
            f2 = f3;
            n--;
        }

    }

    return f3;

}

14.特殊数

14.1 用穷举法求某数段的素数

#include<stdio.h>
int main()
{
    int i, j;
    int m, n;
    int flag,count=0;
    printf("请输入上下界:\n");
    scanf("%d%d",&m,&n);

    for (i = m; i <= n; i++)
    {
        flag = 1;
        if (i == 1)
        {
            flag = 0;
            continue;
        }
        for (j = 2; j < i; j++)
        {
            if (i%j == 0)
            {
                flag = 0;
                break;
            }
        }
        if (flag)
        {
            printf("%d是素数!\n",i);
            count++;
        }

    }
    printf("共%d个素数!\n",count);
    return 0;
}

14.2 水仙花数

所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身

#include<stdio.h>
int main()
{
    int a, b, c;
    int i,count=0;
    for (i = 100; i < 1000; i++)
    {
        a = i / 100;
        b = i % 100 / 10;
        c = i % 100 % 10;

        if (i == (a*a*a + b*b*b + c*c*c))
        {
            printf("a=%d,b=%d,c=%d\n", a, b, c);
            printf("%d是水仙花数.\n",i);
            count++;
        }
    }
    printf("共%d个水仙花数\n",count);
    return 0;
}

14.3 完全平方数

#include<stdio.h>
#include<math.h>
int main()
{
    int n;
    printf("请输入一个整数:\n");
    scanf("%d",&n);
    //注意sqrt函数原型 ---- double sqrt(double x);
    if (sqrt(n) == (int)sqrt(n))
    {
        printf("%d是完全平方数.\n", n);
        printf("%d=%d*%d\n", n, (int)sqrt(n), (int)sqrt(n));
    }
    else
        printf("%d不是完全平方数.\n", n);

    return 0;
}

14.4 完数

一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6的因子为1,2,3,6=1+2+3,因此6是“完数”。编程找出1000之内的所有完数.

#include<stdio.h>
int main()
{

    int i, sum, j, count=0, k;
    int m;
    int a[100];
    for (i = 1; i <= 1000; i++)
    {
        sum = i;
        k = 0;
        for (j = 1; j < i; j++)
        {
            if (i%j == 0)
            {
                sum -= j;
                a[k++] = j;
            }
        }
        if (sum == 0)
        {
            printf("\n%d是完数!\n", i);
            printf("其因子是:");
            for (m = 0; m < k; m++)
                printf("%d ",a[m]);
            count++;
        }
    }
    printf("\n共%d个完数!\n",count);

    return 0;
}

14.5 同构数

同构数之解法一

正整数n若是它平方数的尾部,则称n为同构数

#include<stdio.h>
int main()
{
    int i;
    for (i = 1; i < 100; i++)
    {
        int pow = i*i;
        int a;
        if (i < 10)
        {
            a = pow % 10;
            if (i == a)
            {
                printf("%d是%d的同构数.\n",i,pow);
            }
        }
        else if (i >= 10&i<100)
        {
            a = pow % 100;
            if (i == a)
            {
                printf("%d是%d的同构数.\n", i, pow);
            }
        }
    }

    return 0;
}

同构数之解法二

#include"stdio.h"
int isomorphism(int i)
{
    int mod;
    if (i<10)
        mod = 10;
    else
        mod = 100;
    if (i == i*i%mod)
        return 1;
    return 0; //不是,则要明确返回0
}
void main()
{
    int i;
    printf("1~100之间的同构数有:\n");
    for (i = 1; i<100; i++)
    {
        if (isomorphism(i) == 1)
            printf("%4d", i);
    }
    printf("\n");
}

同构数之解法三

//判断是不是同构数函数
int fun(int n)
{
    int a, b;
    int m = n*n;
    while (n)
    {
        a = n % 10, b = m % 10;
        if (a != b)
            break;
        n /= 10;
        m /= 10;
    }
    if (n)
        return 0;
    return 1;
}

15.最小公倍数与最大公约数

void fun(int m ,int n)
{
    int r, rx;
    rx = m*n;

    while (n)
    {
        r = m%n;
        m = n;
        n = r;
    }
    printf("最大公约数为:%d\n",m);
    printf("最小公倍数为:%d\n",rx/m);

}

16.验证哥德巴赫猜想

哥德巴赫猜想:任何一个大于6的偶数均可表示为两个素数之和。输入两个整数m,n(6小于等于m,m小于等于n,n小于等100),将m,n之间的偶数表示成两个素数之和

#include<stdio.h>
#include<math.h>
int main()
{
    int isPrime(int n);
    int n, m;
    printf("请输入m和n:");
    scanf("m=%d,n=%d",&m,&n);
    int i,j,count=0;
    if (m > 6)
    {
        for (i = m; i <= n; i++)
        {
            if (i % 2 == 0)
            {
                //注意此处为就j<=i/2
                for (j = 2; j <= i / 2; j++)
                {
                    if (isPrime(j) && isPrime(i - j))
                    {
                        printf("%d=%d+%d\n",i,j,i-j);
                        count ++;
                        break;
                    }
                }
            }
        }
    }
    printf("%d到%d之间共有%d个哥德数.\n",m,n,count);
    return 0;
}

int isPrime(int n)
{
    int i,flag=1;

    for (i = 2; i < sqrt(n); i++)
    {
        if (n == 2)
            return flag;
        else
        {
            if (n%i == 0)
            {
                flag = 0;
                break;
            }
        }
    }
}

 

如何提高编程能力?(上)_#include_02