暑期培训-7月10日记录

学习任务

C语言数据类型、地址、函数、编译相关基础知识

完成情况 基本完成知识点巩固
问题汇总

1. 变量

register修饰的变量不能取地址。

const修饰只读变量,不可通过变量名更改对应内存值。可替代宏(宏需预编译)
static静态变量:
(1)修饰全局变量时,改变变量作用域,只能在当前文件使用。修饰函数同理。
(2)修饰局部变量时,改变变量生命周期,将它存放于数据区而非栈区,直到程序运行结束才被释放。
extern声明外部全局变量:
用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,
要在此处引用”。

工作原理:先会去当前文件下查找有没有对应全局变量,如果没有,去其他文件查找。

2. 数据存储的大端模式:高字节存在低地址,低字节存在高地址

判断电脑是否大小端,可利用共用体

#include<stdio.h>
	
	union var
	{
		char c[4];
		int i;
	};
	 
	int main()
	{
		union var data;
		data.c[0] = 0x04;//因为是char类型,数字不要太大,算算ascii的范围~
		data.c[1] = 0x03;//写成16进制为了方便直接打印内存中的值对比
		data.c[2] = 0x02;
		data.c[3] = 0x11;
	//数组中下标低的,地址也低,按地址从低到高,内存内容依次为:04,03,02,11。总共四字节!
	//而把四个字节作为一个整体(不分类型,直接打印十六进制),应该从内存高地址到低地址看,0x11020304,低位04放在低地址上。
		printf("%x\n",data.i);
		
		while(1);
		return 0;
	}

3. 数组

一维:

printf("%p\n", &a[0])//数组首元素地址
printf("%p\n", a)//数组名,也是首元素地址
printf("%p\n", &a)//数组的地址
二维:
printf("%p\n", &a[0][0]);首元素地址
printf("%p\n", a);首行地址
printf("%p\n",a[0]);首行首元素
printf("%p\n",&a);数组地址

字符数组:初始化例如a[10] = "字符串内容",数组长度最好要足够长。输出例如printf("%s", a)。

4. 关于函数参数传递中的地址传递

void swap(int *x, int *y)
{
	int tmp;
	tmp = *x;
	*x = *y;
	*y = tmp;
}

int main()
{
	int a = 1, b = 2;
	swap(&a, &b);//地址传递:当涉及修改内存里的值时,用地址传递,不用值传递。
	printf("a = %d,b = %d\n", a, b);

	while(1);
	return 0;
}


作业1. 在字符数组指定位置插入字符。

#include <stdio.h>

char Insert(int place, char object, char x[], char y[])
{
	int i = 0;
	for (i = 0; i <= place - 1; i++)
    {
        y[i] = x[i];
    }
    y[i] = object;
    while (x[i] != '\0')
    {
        y[i + 1] = x[i];
        i++;
    }    //将插入位置前的字符复制到D数组中,然后在D中接着插入要插入的字符,最后把剩余的字符复制到D中.
    y[i + 1] = '\0';
	
	return y;
}

void main()
{
    char C[100];//原始字符串
    char D[100];//最终字符串
    char b;//插入的字符
	int i = 0;
    int s;
    printf("输入字符串,“#”结束\n");
    char a = 'a';//输入字符串,以#结尾,最后将#改为'\0'

    while (a != '#')
    {
        a = getchar();
        C[i++] = a;
    }
    C[i-1] = '\0';
 
    printf("输出字符串\n");
    printf("%s\n", C);
 
    printf("输入插入位置,在第?个字符后\n");
    scanf("%d", &s);
 
    getchar();//接收回车
    printf("输入插入的字符\n");
    scanf("%c",&b);
	
	Insert(s, b, C, D);

    printf("输出字符串\n");
    printf("%s\n", D);
    
	while(1);
	return 0;
}

结果:

作业2. 设计一个洗牌发牌程序。

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
 
#define NUM 10000 //洗牌混乱度
 
char color[7][7] = {"空白","红桃","黑桃","草花","方片","小王","大王"};  // 1:红桃 2:黑桃 3:草花 4:方片 5:小王 6:大王
char number[]={"0A234567890JQK"};  // 0:不存内容 1:A  2:2  3:3  4:4  5:5  6:6  7:7  8:8  9:9  10:10  11:J  12:Q  13:K
 
//构建扑克
struct card{
    unsigned int number;
    unsigned int color;
};
 
unsigned int NUM_card=53; //剩余未发的牌数(发牌时用的变量)
 
struct card card[54]; //创建保存一副牌的结构体
 
 
//构建一副牌(有序)
void creat_pair_card()
{
    int num=1;
    int col=1;
    int i=0;
    for(num=1;num<=15;num++)
    {
        //生成大小王
        if(num>=14)
        {
            card[i].number=num;
            card[i].color=col++;
            i++;
        }
        else
        {
            //生成普通牌
            for(col=1;col<=4;col++)
            {
                card[i].number=num;
                card[i].color=col;
                i++;
            }
        }
    }
}
 
//显示一副牌
void print_card()
{
    int i;   
    int num,col;  //点数与花色对应数组下标
    for(i=0;i<54;i++)
    {
        col=card[i].color;
        num=card[i].number;
        if(col>=5)
        {
            printf("%s\t",color[col]);
        }
        else
        {
            if(num==10)
            {
                printf("%s:",color[col]);
                printf("10\t");
            }
            else
            {
                printf("%s:",color[col]);
                printf("%c\t",number[num]);
            }
        } 
    }
    printf("\n");
}
 
 
//洗牌

void wash_card()
{
    int i;
    int ch1,ch2;
    srand((unsigned)time(NULL));
    for(i=0;i<NUM;i++) //循环次数越大越乱
    {
        
        
        ch1=rand()%100;  //2147483647 取最后两位0-99
        ch2=rand()%100;
        
 
        if(ch1>53)
        {
            ch1=100-ch1; //随机数大于53则减小
        }
 
        if(ch2>53)
        {
            ch2=100-ch2;
        }
 
        if(ch1 == ch2)
        {
            continue;
        }
        //两个随机牌交换
        struct card tmp=card[ch1];
        card[ch1]=card[ch2];
        card[ch2]=tmp;
    }
}
 
//发牌
void send_card(struct card hand[],int num)
{
    if(NUM_card<num)
    {
        printf("数量不足\n");
        return;
    }
    int i;
    for(i=0;i<num;i++)
    {
        hand[i]=card[NUM_card-i];
    }
    NUM_card=NUM_card-num;
}
 
 
//显示手牌
void print_hand_card(struct card hand[],int num)
{
    int i;
    int point,col;
    for(i=0;i<num;i++)
    {
        col=hand[i].color;
        point=hand[i].number;
        if(col>=5)
        {
            printf("%s ",color[col]);
        }
        else
        {
            if(point==10)
            {
                printf("%s:",color[col]);
                printf("10 ");
            }
            else
            {
                printf("%s:",color[col]);
                printf("%c ",number[point]);
            }
        } 
    }
    printf("\n");
}
 
 
int main(void)
{
 
    creat_pair_card();  //创建一副牌 有序
    wash_card();//洗牌
    print_card();//打印
 
    struct card hand1[17]; //创建两个结构体保存手牌17张
    struct card hand2[17];
    send_card(hand1,17); //发牌
    send_card(hand2,17);
    printf("手牌A: ");
    print_hand_card(hand1,17);
    printf("\n");
    printf("手牌B: ");
    print_hand_card(hand2,17);
    printf("\n");
}

3次结果:


猜你喜欢

转载自blog.csdn.net/jsxyma/article/details/80991218