电商专业学习嵌入式软件开发第十天

  • C基础第五天

最近几天的学习给我最大的感触就是懵逼,没有头绪,周六那天从学习C基础的第一天笔记开始敲命令,敲了一天,结果最后除了坐的久带来的身体上的不舒服,其他什么感想都没有,也没敲出一点头绪。

今天上午老师先带着我们把上周留的作业解决了,不做记录,只靠我的逻辑思维,想了好几种方法最后商人都会被仆人杀死,结果通过代码得出是可以渡河的。

#include <stdio.h>
#include <stdlib.h>
char a[6],b[6];
//过河
void Surface()
{
   system("clear");
   printf("这是一个过河游戏:\n");
}
void Print(char a[],char b[])
{
   int i,j,ab=0,aa=0,bb=0,ba=0;      //ab:a岸的商人数   aa:a岸的仆人数,bb:b岸的商人数,ba:b岸的仆人数
   for(i=0;i<6;i++)//统计a岸的人数
   {
       if(a[i]=='B')
           ab++;
       else if(a[i]=='A')
           aa++;
   }
   //统计b按的人数
   for(j=0;j<6;j++)
   {
       if(b[j]=='B')
           bb++;
       else if(b[j]=='A')
           ba++;
   }
   printf("此按的商人数:%d\n",ab);
   printf("此岸的仆人数:%d\n\n",aa);
   printf("彼岸的商人数:%d\n",bb);
   printf("彼岸的仆人数:%d\n",ba);
   if(ab==0 && aa==0 && bb==3 && ba==3)
   {
       printf("\n\n恭喜你,渡河成功!\n");
       getchar();
       exit(0);
   }
}
void Process()
{
   //预处理:
   int i,j,ab,aa,bb,ba,go_b,go_a,back_b,back_a;
   char c;
Start:  for(i=0;i<3;i++)
       a[i]='B';
   for(i=3;i<6;i++)
       a[i]='A';
   for(j=0;j<6;j++)
       b[j]='o';
   Surface();
   printf("按任意键开始游戏(按q/Q退出游戏)\n");
   c=getchar();
   if(c=='q' || c=='Q')
   {
       system("clear");
       exit(0);
   }
   Print(a,b); //把2按的人员情况打印一下,判断是否渡河成功
while(1)
{
   //过去
   for(ab=0,aa=0,i=0;i<6;i++)//统计a岸的人数
   {
       if(a[i]=='B')
           ab++;
       else if(a[i]=='A')
           aa++;
   }
   printf("请输入过河的商人数:");
   scanf("%d",&go_b);
   printf("请输入过河的仆人数:");
   scanf("%d",&go_a);
   if(go_b<0 || go_a<0 || go_b>ab || go_a>aa || go_a+go_b>2 || go_a+go_b<1)
   {
       printf("输入有误,请重新开始!");
       getchar();
       goto Start;
   }
   //重新统计a,b按的人数
   for(j=1;j<=go_b;j++)
       for(i=0;i<6;i++)
       {
           if(a[i]=='B')
           {
               a[i]='o';
               break;
           }
       }
   for(j=1;j<=go_a;j++)
       for(i=0;i<6;i++)
       {
           if(a[i]=='A')
           {
               a[i]='o';
               break;
           }
       }
   for(j=1;j<=go_b;j++)
       for(i=0;i<6;i++)
       {
           if(b[i]=='o')
           {
               b[i]='B';
               break;
           }
       }
   for(j=1;j<=go_a;j++)
       for(i=0;i<6;i++)
       {
           if(b[i]=='o')
           {
               b[i]='A';
               break;
           }
       }
   for(ab=0,aa=0,i=0;i<6;i++)//统计a岸的人数
   {
       if(a[i]=='B')
           ab++;
       else if(a[i]=='A')
           aa++;
   }
   for(bb=0,ba=0,i=0;i<6;i++)//统计b岸的人数
   {
       if(b[i]=='B')
           bb++;
       else if(b[i]=='A')
           ba++;
   }
   //判断能够进行下一次渡河的条件
   if((ab==aa) || (bb==ba) || (ab==3) || (bb==3))
   {
       Print(a,b);
   }
   else
   {
       printf("商人被杀,仆人越货!\n");
       printf("游戏重新开始...\n");
       getchar();
       getchar();
       goto Start;
   }
   //回来
   for(bb=0,ba=0,i=0;i<6;i++)//统计b岸的人数
   {
       if(b[i]=='B')
           bb++;
       else if(b[i]=='A')
           ba++;
   }
   printf("请输入回来的商人数:");
   scanf("%d",&back_b);
   printf("请输入回来的仆人数:");
   scanf("%d",&back_a);
   if(back_b<0 || back_a<0 || back_b>bb || back_a>ba || back_a+back_b>2 || back_a+back_b<1)
   {
       printf("输入有误,请重新开始!");
       getchar();
       goto Start;
   }
   //重新统计a,b按的人数
   for(j=1;j<=back_b;j++)
       for(i=0;i<6;i++)
       {
           if(b[i]=='B')
           {
               b[i]='o';
               break;
           }
       }
   for(j=1;j<=back_a;j++)
       for(i=0;i<6;i++)
       {
           if(b[i]=='A')
           {
               b[i]='o';
               break;
           }
       }
   for(j=1;j<=back_b;j++)
       for(i=0;i<6;i++)
       {
           if(a[i]=='o')
           {
               a[i]='B';
               break;
           }
       }
   for(j=1;j<=back_a;j++)
       for(i=0;i<6;i++)
       {
           if(a[i]=='o')
           {
               a[i]='A';
               break;
           }
       }
   for(ab=0,aa=0,i=0;i<6;i++)//统计a岸的人数
   {
       if(a[i]=='B')
           ab++;
       else if(a[i]=='A')
           aa++;
   }
   for(bb=0,ba=0,i=0;i<6;i++)//统计b岸的人数
   {
       if(b[i]=='B')
           bb++;
       else if(b[i]=='A')
           ba++;
   }
   //判断能够进行下一次渡河的条件
   if((ab==aa) || (bb==ba) || (ab==3) || (bb==3))
   {
       Print(a,b);
   }
   else
   {
       printf("商人被杀,仆人越货!\n");
       printf("游戏重新开始...\n");
       getchar();
       getchar();
       goto Start;
   }
}   
}
void main()
{
   Process();
}
字符串常量:

用双引号扩起来的任意字符序列 “sdfghj”.
通常是用字符数组存储它。例:
char a[]="sdfghj";
char a[8]="asdfg";
char a[10]={'a','h'};

例:
#include <stdio.h>
void main()
{
    char a[]="asdfg";
    printf("%ld\n",sizeof(a));
    char b[5]="asdfg";
    printf("%ld\n",sizeof(b));
    char c[]={'a','s','d','f','g'};
    printf("%ld\n",sizeof(c));
}

1.一个字符串常量后面默认以'\0'结尾。如果数组的长度不够,那么就不会存'\0';
2.在c语言中没有专门的数据类型变量用来接收一个字符串,所以通常是放在字符数组里面
3.sizeof(地址):计算以这个地址为其实地址的一段连续内存的长度

gets(地址):

从标准输入(键盘)获取一行字符串。会把获取的字符串最后的\n换成'\0',然后存储到地址中。

例:
#include <stdio.h>
void main()
{
    char name[20];
    gets(name);
    printf("%s\n",name);
}

puts(地址):输出地址中的字符串

例:
#include <stdio.h>
void main()
{
    char name[20];
    gets(name);
    puts(name);
    puts("asdfghj");
}

字符串常量的特点:表示的是该字符串首元素的首地址

#include <stdio.h>
void main()
{
    char *p="qwertyui";
    printf("%c %c\n",*p,*(p+1));
}

mygets():实现从键盘上获取一行字符串,但是不会出现越界问题。

#include <stdio.h>
void mygets(char *,int);
void main()
{
    char name[30];
    mygets(name,30);
    printf("%s\n",name);
}
void mygets(char *str,int len)
{
    int i;
    for(i=0;i<len-1;i++)
    {
        str[i]=getchar();
        if(str[i]=='\n')
            break;
    }
    if(str[i]!='\n')
    {
        while(getchar()!='\n');
    }
    str[i]='\0';
}

练习:利用gets统计获取的字符串中有多少个空格

#include <stdio.h>
void main()
{
    int i=0,count=0;
    char str[20];
    gets(str);
    while(str[i]!='\0')
    {
        if(str[i]==' ')
            count++;
        i++;
    }
    printf("count:%d\n",count);
}

strlen(地址):计算字符串的长度,返回字符串的个数
头文件:string.h

#include <stdio.h>
#include <string.h>
void main()
{
    char str[]="i love beijing";
    int a=strlen(str);
    printf("a:%d %ld\n",a,strlen("hello hello"));
}

mystrlen() :自己实现strlen的功能。

例:
#include <stdio.h>
#include <string.h>
int mystrlen(char *);
void main()
{
    char str[]="i am falling in love";
    int a=mystrlen(str);
    printf("a=%d\n",a);
}
int mystrlen(char *str)
{
    int n=0;
    while(*str!='\0')
    {
        str++;
        n++;
    }
    return n;
}

strcpy(目标地址,源地址):拷贝字符串,把源地址里面的字符串拷贝到目标地址里。目标地址里的内存要足够容纳的下源地址里的数据。包含头文件:string.h 有返回值,返回目标地址。

例:
#include <stdio.h>
#include <string.h>
void main()
{
    char src[]="i am a good student";
    char tar[50];
    char *p=strcpy(tar,src);
    puts(p);
}
mystrcpy();
#include <stdio.h>
#include <string.h>
char *mystrcpy(char *,char *);
void main()
{
    char src[]="i am a good student";
    char tar[50];
    char *p=mystrcpy(tar,src);
    puts(p);
}
char *mystrcpy(char *tar,char *src)
{
    int i=0;
    while(src[i]!='\0')
    {
        tar[i]=src[i];
        i++;
    }
    tar[i]='\0';
    return tar;
}
#include <stdio.h>
#include <string.h>
void main()
{
    char src[]=" a good student";
    char tar[50]="i am";
    char *p=strcpy(tar+4,src);
    puts(p);
    puts(tar);
}
//p是源字符串拷贝到目标字符串的起始地址
//注意,不要在目标字符串'\0'之后接入拷贝的源字符串
#include <stdio.h>
#include <string.h>
void main()
{
    int n;
    char src[50]=" a good student";
    char tar[10]="i am";
    char *p=strncpy(tar,src,10);//把src中的10个字符拷贝到tar中。
    puts(p);
    p=strncpy(tar+4,src,10);
    puts(tar);
}

strcat(desc,src):拼接字符串,把src字符串接在desc后面,desc要足够大,能够容纳下拼接后的字符串,返回desc的地址。
包含头文件:string.h

#include <stdio.h>
#include <string.h>
void main()
{
    int n;
    char src[20]=" a good student";
    char tar[50]="i am";
    char *p=strcat(tar,src);
    puts(p);
    puts(tar);
}
strncat():
#include <stdio.h>
#include <string.h>
void main()
{
    int n;
    char src[20]=" a good student";
    char tar[50]="i am";
    char *p=strncat(tar,src,7);//把src中的前7个字符拼接到tar中字符串的后面保存在tar中
    puts(p);
    puts(tar);
}

strcmp(a,b):比较2个字符串是否完全一致.如果a与b一致,返回0,如果a大于b返回一个正数,否则返回一个负数
头文件:string.h

#include <stdio.h>
#include <string.h>
void main()
{
    char a[]="i am a boy";
    char b[]="i am a student";
    int c=strcmp(a,b);
    printf("%d\n",c);
}
//a,b大小比较的规则:从一个字符开始比,第一个不相同的字符的ascii值大的,字符串大。

strncmp(a,b,n);

#include <stdio.h>
#include <string.h>
void main()
{
    char *list[5]={"awayken is good","awayken is young","awayken is smart","awayken is wise","awayken is nb"};
    for(int i=0;i<5;i++)
    {
        if(strncmp(list[i],"awayken is a good boy",7)==0)
        printf("%s\n",list[i]);
    }
}

扩充:

  • strchr();
  • strrchr();

static:

#include <stdio.h>
void func();
void main()
{
    int i=0;
    for(;i<3;i++)
        func();
//  printf("a=%d\n",a);
}
void func()
{
    static int a;
    a++;
    printf("a=%d\n",a);
}

static:静态变量修饰符,静态局部变量的生命周期是整个程序,但是作用域只限于定义它的函数。
静态局部变量没有初始化,默认为0。
全局变量:
1.没有赋值,默认为0
2.作用域是整个程序,定义在1.c中的变量在2.c中也能用
局部变量:
1.没有赋值,为随机值
2.作用域只限于定义它的函数,出了函数不能访问它,
3.生命周期也只限于定义它的函数
4.可以和全局变量同名,在定义它的函数里,会隐藏同名的全局变量的作用
5.可以和其他局部变量同名,互相不影响
静态全局变量:

1.没有赋值,默认为0
2.只能的是定义它的文件能使用它,其他文件不能使用。
3.存在于整个程序,作用域为定义它的文件。

const:被修饰的变量体现出常量的特性,只能在定义的时候以初始化的方式给它赋值,之后不能改变它的值。

#include <stdio.h>
void main()
{
    const a=1;
    a=2;
}

常量指针与指针常量

const int *p;    <=> int const *p;
int *const p;
例:
#include <stdio.h>
void main()
{
    int a=10;
    const int *p=&a;//const 修饰的是*p,则不能改变*p的值,但可以改变p
    printf("%d\n",*p);
    int b=20;
    p=&b;
    printf("%d\n",*p);
}
#include <stdio.h>
void main()
{
    int a=10;
     int *const p=&a;//const 修饰的是p,则不能改变p的值,但可以改变*p
    printf("%d\n",*p);
    int b=20;
//  p=&b;
    *p=20;
    printf("%d\n",*p);
}
#include <stdio.h>
void main()
{
    int a=10;
     int const *const p=&a;//const 修饰的是p,则不能改变p的值,但可以改变*p
    printf("%d\n",*p);
    int b=20;
//  p=&b;
//  *p=20;
//  printf("%d\n",*p);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335

推荐阅读更多精彩内容