1~4维数组的动态构建实例
一维
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n1,i;
int *array;
puts("输入一维长度:");
scanf("%d",&n1);
array=(int*)malloc(n1*sizeof(int));//第一维
for(i=0;i<n1;i++)
{
array[i]=i+1;
printf("%d/t",array[i]);
}
free(array);//释放第一维指针
return 0;
}
二维
#include <stdlib.h>
#include <stdio.h>
int main()
{
int n1,n2;
int **array,i,j;
puts("输入一维长度:");
scanf("%d",&n1);
puts("输入二维长度:");
scanf("%d",&n2);
array=(int**)malloc(n1*sizeof(int*)); //第一维
for(i=0;i<n1; i++)
{
array[i]=(int*)malloc(n2* sizeof(int));//第二维
for(j=0;j<n2;j++)
{
array[i][j]=i+j+1;
printf("%d/t",array[i][j]);
}
puts("");
}
for(i=0;i<n1;i++)
{
free(array[i]);//释放第二维指针
}
free(array);//释放第一维指针
return 0;
}
三维
#include <stdlib.h>
#include <stdio.h>
int main()
{
int n1,n2,n3;
int ***array;
int i,j,k;
puts("输入一维长度:");
scanf("%d",&n1);
puts("输入二维长度:");
scanf("%d",&n2);
puts("输入三维长度:");
scanf("%d",&n3);
array=(int***)malloc(n1*sizeof(int**));//第一维
for(i=0; i<n1; i++)
{
array[i]=(int**)malloc(n2*sizeof(int*)); //第二维
for(j=0;j<n2;j++)
{
array[i][j]=(int*)malloc(n3*sizeof(int)); //第三维
for(k=0;k<n3;k++)
{
array[i][j][k]=i+j+k+1;
printf("%d/t",array[i][j][k]);
}
puts("");
}
puts("");
}
for(i=0;i<n1;i++)
{
for(j=0;j<n2;j++)
{
free(array[i][j]);//释放第三维指针
}
}
for(i=0;i<n1;i++)
{
free(array[i]);//释放第二维指针
}
free(array);//释放第一维指针
return 0;
}
四维
#include <stdlib.h>
#include <stdio.h>
int main()
{
int n1,n2,n3,n4;
int ****array;
int i,j,k,m;
puts("输入一维长度:");
scanf("%d",&n1);
puts("输入二维长度:");
scanf("%d",&n2);
puts("输入三维长度:");
scanf("%d",&n3);
puts("输入四维长度:");
scanf("%d",&n4);
array=(int****)malloc(n1*sizeof(int***));//第一维
for(i=0; i<n1; i++)
{
array[i]=(int***)malloc(n2*sizeof(int**)); //第二维
for(j=0;j<n2;j++)
{
array[i][j]=(int**)malloc(n3*sizeof(int*)); //第三维
for(k=0;k<n3;k++)
{
array[i][j][k]=(int*)malloc(n4*sizeof(int));//第四维
for(m=0;m<n4;m++)
{
array[i][j][k][m]=i+j+k+m+1;
printf("%d/t",array[i][j][k][m]);
}
puts("");
}
puts("");
}
puts("");
}
for(i=0;i<n1;i++)
{
for(j=0;j<n2;j++)
{
for(k=0;k<n3;k++)
free(array[i][j][k]);//释放第四维指针
}
}
for(i=0;i<n1;i++)
{
for(j=0;j<n2;j++)
{
free(array[i][j]);//释放第三维指针
}
}
for(i=0;i<n1;i++)
{
free(array[i]);//释放第二维指针
}
free(array);//释放第一维指针
return 0;
}
动态扩充数组案例
#include <stdio.h>
#include <stdlib.h>
int main()
{
int*n,*p;
int i;
n=(int*)calloc(1,sizeof(int));
for(i=0;i<5000;i++)
{
n[i]=i+1;
printf("%d/t",n[i]);
p=(int*)realloc(n,(i+2)*sizeof(int));//动态扩充数组
if(p!=NULL)
n=p;
else
{
puts("error!");
return 0;
}
}
free(n);
return 0;
}
消字母游戏精简版中的应用
预备知识
(1)getch()
函数原型: int getch(void);
函数功能: 从控制台读取一个字符,但不显示在屏幕上。
函数返回: 读取的字符。
(2)rand()
函数原型: int rand(void);
函数功能: 随机函数, 产生0到32767间的随机整数(0到0x7fff之间)。
函数返回: 随机整数
所属文件: <stdlib.h>
(3)srand()
函数原型: void srand(unsigned seed);
函数功能: 该函数和rand随机函数配合使用,产生随机数的起始发生数据。
参数说明: seed为无符号整数。
所属文件: <stdlib.h>
(4)time()
函数原型: time_t time(time_t *timer)
函数功能: 得到机器的日历时间或者设置日历时间。
函数返回: 机器日历时间。
参数说明: timer=NULL时得到机器日历时间,timer=时间数值时,用于设置日历时间,
time_t是一个long类型。
所属文件: <time.h>
(5)'/b'实现退格,即当前光标后退一格。
(6)'/a'实现响铃,即执行时计算机会嘟一声。
(7)得到随机数值范围在a~b(包含b)的方法:rand()%(b-a+1)+a;
代码
#include <stdio.h>
#include <conio.h>//getch()函数所需头文件
#include <stdlib.h>//随机函数所需头文件
#include <time.h>//time()函数所需头文件
void clear(void)//此函数用以清除当前行
{
printf("/r /r");
}
void start(void)
{
puts("这是消单词游戏的精简版,还不会图像编程的人可以看一看");
puts(" 由于没有引人数据库,所以此单词是模拟的。");
puts("按任意键开始,按Esc键结束,按tab键重新开始:");
puts(" 一旦输错,将发出声音警告,你必须重新输入。");
puts(" 按任意键开始,按Esc键结束:");
getch();
}
int main()
{
char*c_rand,*c_input;
int i,j,N,n,space,N_rand;
start();
printf("/r你想消最多由多少个字母组成的单词?(输入数字(1-9)");
n=getch();
N=n-'0';//将输入的字符转换为整型数字
clear();//清除当前行
if(!((N>=1&&N<=9)||n==27))//27是键Esc的ASII值
{
printf("/r范围错误,请重新开始:");
getch();
exit(1);//异常退出
}
if(n==27)
return 0;
srand(time(NULL));//用来对随机函数初始化
c_rand=(char*)malloc(N+1);
c_input=(char*)malloc(N+1);
while(1)
{
N_rand=rand()%N+1;//实现单词长度随机定义
for(i=0;i<N_rand;i++)
{
c_rand[i]=(rand() ==0)?(rand()&+'A'):(rand()&+'a');//随机取个字母
}
c_rand[N_rand]='/0';
//下面四行代码实现单词位置随机出现
space=rand()P;
putchar('/r');
for(i=0;i<space;i++)
putchar(' ');
printf("%s",c_rand);
for(i=0;i<N_rand;i++)
{
c_input[i]=getch();//用户输入
if(c_input[i]=='/x1b')//"/x1b"代表的是Esc键
break;
//下面五行代码实现字母消失效果
putchar('/r');
for(j=0;j<space;j++)
putchar(' ');
for(j=0;j<=i;j++)
putchar(' ');
if(c_input[i]!=c_rand[i])
{
i=-1;
putchar('/a');
//下面四行代码代码字母重现效果
putchar('/r');
for(j=0;j<space;j++)
putchar(' ');
printf("%s",c_rand);
}
}
if(c_input[i]=='/x1b')//"/x1b"代表的是Esc键
break;
}
free(c_rand);
free(c_input);
return 0;
}