Skip to content

数组(2)

1249字约4分钟

2024-07-07

44.求二维数组的鞍点

//鞍点是该位置的元素在该行上最大,该列上最小
#include<stdio.h>
#include<stdbool.h>
#define N 5
#define M 6
bool f(int (*a)[N],int i,int j)
{
	for(int x =0;x<M;++x)
	{
		if(a[x][j]<a[i][j])
			return false;
	}
	return true;
}
void show(int a[M][N])          //int a[][N]或者int (*a)[N]都是定义了一个指向N个整型元素的数组的指针
{
	for(int i=0;i<M;++i)
	{
		for(int j=0;j<N;++j)
		{
			printf("%5d",a[i][j]);
		}
		putchar('\n');
	}
}
int main(void)
{
	int a[M][N];
	for(int i=1;i<M*N;++i)
		a[i/N][i%N]-i;
	show(a);




	for(int i = 0;i<M;++i)
	{
		int k=0;
		for(int j =1;j<N;++j)
		{
			if(a[i][k]<a[i][j])
				k=j;
		}
		if(f(a,i,k))
			printf("a[%d][%d]是这个二维数组的鞍点\n");
	}
		return 0;


}

45.字符数组

#include <stdio.h>
int main(void)
{
	char a[10]={'h','a',' ','h','a','\n'};    //'\0'空字符是c语言中字符串结束的标志
	printf("haha\0hehe");
	printf("%s","ABCD");                      //字符串末尾都由一个空字符
	printf("%s",a);




	//字符型数组定义时初始化所特有的形式
	char b[10]={"ha ha\n"};
	char c[10]="hah ha\n";
	char d[]="ha";


//	c= "ha ha\n";          error 因为c是一个char *类型的常量
	char *ch ="ha ha\n";                      //字符型常量在计算机的内存中是一个没有名字的数组
	printf("AAA%s",ch);
	return 0;
}


##

46.字符串的输入输出

#include <stdio.h>
void show(char *a,int len)
{
	for(int i =0;i<len;++i)
	{
		printf("%d\n",a[i]);
	}
}
int main(void)
{
	char a[30],b[30],c[30],ch;
	scanf("%s%s%s%s",a,b,c,&ch);      //如果输入项是字符型数组的数组名或者是char *类型的变量 就不需要加取地址符
									  //使用scanf函数输入多个字符串时,用空格,tab,换行来分隔
//	show(a,30);                       a数组中没有被赋值的元素,是一个垃圾值
	printf("%s%s%s%s",a,b,c,ch);




	gets(a);                           //和scanf函数一样都会把字符数组中的一个元素赋值为空字符,
									  //不同点:get可以把空格、tab赋给这个字符数组的元素;gets会丢掉换行符
	
	ch = getchar();
	puts(a);
	putchar(ch);
	puts("haha");                     //puts输出该字符串之后,再输出一个换行符
	
	int x = 2,y = 3;
	printf("x=%d,y=%d",x,y);
	char *p = "x=%#x,y=%#x\n";
	printf(p,x,y);
	return 0;


}

47.字符串常用的函数

#include <stdio.h>
#include <stdbool.h>
int strlen(char *a)                //求字符串长度
{
	if(a== NULL)
		return 0;
	int len =0;
	while(a[len] !='\0')
		len++;
	return len;
}
char *strlwr(char *a)             //大写字母转换为小写字母
{
	if(a == NULL)
		return NULL;
	char *a1 = a;
	while(*a != '\0')
	{
		if(*a <= 'Z' && *a >= 'A')
			*a+=32;
		++a;
	}
	return a1;
}
char *strupr(char *a)              //小写字母转换为大写字母
{
	if(a == NULL)
		return NULL;
	char *a1 = a; 
	while(*a !='\0')
	{
		if(*a >= 'a' && *a <= 'z')
			*a-=32;
		++a;
	}
		return a1;
}
char * strcpy(char *a,char *b)     //b字符串复制到a字符串
{
	if(a == NULL || b == NULL)
		return a;
	char *a1=a;
	while((*a = *b)!= '\0')
	{
		a++;
		b++;
	}
/*或者写成
	while(*(a++) = *(b++) !='\0')
	;
*/
	return a1;
}
char * strcat(char *a,char *b)      //a字符串与b字符串合并连接
{
	if(a == NULL || b == NULL)
		return a;
	char *a1=a;
	while(*(a++) !='\0')
		;
	a--;
	while((*a = *b)!= '\0')
	{
		a++;
		b++;
	}
	return a1;
}
char * strncpy(char *a,char *b,int n)//b字符串前n个元素覆盖a字符串前n个元素,返回a字符串
{
	if(a == NULL || b == NULL)
		return a;
	char *a1=a;
	for(int i =0;i<n;++i)
		a[i]=b[i];
	return a1;
}
int strcmp(char *a,char *b)       //判断两个字符串是否相等
{
	if(a == NULL || b== NULL)
		return 2;                 //不为1,0,-1都可以
	do
	{
		if(*a == '\0' && *b == '\0')
			return 0;
		else if(*a <*b)
			return -1;
		else if(*a>*b)
			return 1;
		a++;b++;
	}
	while (true);
}
int main(void)
{
	char a[]="bcde";
	printf("%d\n",strlen(a));
	printf("%s\n",strlwr(a));
	printf("%s\n",strupr(a));
	printf("%s\n",strcpy(a,"lala"));
	printf("%s\n",strcat(a,"123"));
	printf("%s\n",strncpy(a,"abcdef",4));
	printf("%d\n",strcmp("abcde","abde"));
	return 0;
}

48.习题1

#include <stdio.h>
#define N 10
void show(int a[N][N])
{
	for(int i =1;i<N;++i)
	{
		for(int j =0;j<N;++j)
		printf("%6d",a[i][j]);
	putchar('\n');
	}
}
int main(void)
{
		int a[N][N]={0};
		for(int i =0;i<N;++i)
			a[i][0]=1;
		for(int i =1;i<N;++i)
			for(int j =1;j<=i;++j)
			a[i][j]=a[i-1][j-1]+a[i-1][j];
		show(a);
		return 0;
}

49.习题2

#include <stdio.h>


#define N 10
void show(int a[])
{
	for(int i=0;i<N;++i)
		printf("%6d",a[i]);
	putchar('\n');
}
void move(int *a ,int k,int index)
{
	for(int i=0;i<k;++i)
	{
		int d =a[index];
		a[index]=a[index-1];
		a[index-1]=d;
		index--;
	}
}
int main(void)
{
	int a[N];
	for(int i=0;i<N;++i)
		a[i]=i;
	show(a);


	int m;
	do
	{
		printf("请输入m的值:");
		scanf("%d",&m);
		if(m>=0 && m<=N)
			break;
		printf("输入有误");
	}while (1);
	for(int i=N-m;i<N;++i)
		move(a,N-m,i);
	show(a);
	return 0;


}

50.习题3

#include <stdio.h>
int main(void)
{
	int a[1000]={0};
	printf("请输入总人数:");
	int n,i;
	scanf("%d",&n);
	for(int i=0,cnt=0,sum=0;sum!=n-1;++i)
	{
		if(a[i%n] == 3)
			continue;
	if((a[i%n]=(cnt++)%3+1) ==3)
		sum++;
	}
	for(i=0;i<n;++i)
	if(a[i]!=3)
		break;
	printf("最后留下的是原来的%d个人\n",i+1);
	return 0;
}