第六章 利用数组处理批量数据(字符串的使用和折半查找)

例子
逆序打印数组
#include<stdio.h>
int main(){
	int i=0;
	int arr[10];
	for(i=0;i<10;i++) {
		arr[i]=i; 
	}
	for(i=9;i>=0;i--){
		printf("%d ",arr[i]);
	}
} 
冒泡排序
#include<stdio.h>
int main(){
	int i=0;
	int arr[10]={34,67,90,43,124,87,65,99,132,26};
	printf("排序前:\n");
	for(i=0;i<10;i++){
		printf("%d ",arr[i]);
	}
	printf("\n");
	for(i=0;i<9;i++){
		int j=0;
		for(j=0;j<9-i;j++){
			if(arr[j]>arr[j+1]){
				int temp=arr[j];;
				arr[j]=arr[j+1];
				arr[j+1]=temp; 
			}
		}
	}
	printf("排序后:\n");
	for(i=0;i<10;i++){
		printf("%d ",arr[i]);
	}
} 
有多少个单词 
#include<stdio.h>
#include<string.h> 
int main(){
	char str[1000]={0};
	gets(str);
	int i=0;
	int word=0;
	for(i=0;str[i]!='\0';i++){
		if(str[i]!=' '&&(str[i+1]==' '||str[i+1]=='\0'))
		word++;
		
	} 
	printf("%d\n",word);
	return 0;

} 
#include<stdio.h>
#include<string.h> 
int main(){
	char str[1000]={0};
	gets(str);
	int i=0;
	int word=0,num=0;
	for(i=0;str[i]!='\0';i++){
	 if(str[i]==' ')word=0;
	 else if(word==0){ 
	 //根据字符 判断   第一个单词直接进入 后续遇空格后第一个字符num++ 
	 	word=1;
	 	num++;
	 }
	}
	printf("%d\n",num);
	return 0;

} 

函数

#include<string.h>

        puts函数 输出字符串的函数
        gets函数 输入字符串的函数
#include<stdio.h>
#include<string.h> 
int main(){
	char str[10]={0};
	gets(str);
	puts(str);
	return 0;

} 
        strcat函数 字符串连接函数
#include<stdio.h>
#include<string.h> 
int main(){
	char str[30]="cc";
	char str1[10]="acccj";
	strcat(str,str1);
	printf("%s\n",str);
	return 0;

} 
        strcpy和strncpy 字符串复制函数
#include<stdio.h>
#include<string.h> 
int main(){
	char str[10]="ccbbaabbc";
	char str1[6]="acccj";
	strcpy(str,str1);
	printf("%s\n",str);//acccj 
	printf("%c\n",str[8]); //c 
	char str2[10]="ccbbaabbc";
	char str3[6]="acccj";
	strncpy(str2,str3,5);//acccjabbc
	printf("%s\n",str2);
	return 0;

} 
        strcmp 字符串比较函数
#include<stdio.h>
#include<string.h> 
int main(){
	char str[10]="ccbbaabbc";
	char str1[6]="acccj";
	if(strcmp(str,str1)>0){
		printf(">\n");
	} else if(strcmp(str,str1)==0){
		printf("=\n");
	}else{
		printf("<\n");
	}
	strcpy(str,str1);
	if(strcmp(str,str1)>0){
		printf(">\n");
	} else if(strcmp(str,str1)==0){
		printf("=\n");
	}else{
		printf("<\n");
	}

	return 0;

} 
        strlen  测字符串长度的函数
#include<stdio.h>
#include<string.h> 
int main(){
	char str[10]="ccbbaabbc\0";
	char str1[6]="accc";
	printf("%d\n",strlen(str));
	printf("%d\n",strlen(str1));
	return 0;

} 
        strlwr 转换为小写的函数
        strupr 转换为大写的函数

        

#include<stdio.h>
#include<string.h> 
int main(){
	char str[10]="abc";
	printf("%s\n",strupr(str)); //ABC
	printf("%s\n",str); //ABC
	printf("%s\n",strlwr(str)); //abc 

	return 0;

} 
课后习题
用筛选法求100以内的素数
#include<stdio.h>
#include<math.h> 
int main(){
	int arr[101]={0};
	int i=1;
	for(i=1;i<=100;i++){
		arr[i]=i; 
	}
	arr[1]=0;
	for(i=2;i<sqrt(100);i++){
	 	int j=0;
		for(j=i+1;j<=100;j++){
			if(arr[i]!=0&&arr[j]!=0){
				if(arr[j]%arr[i]==0){
					//能被素数整除
					arr[j]=0; 
				}
			}
		} 
	}
	for(i=2;i<=100;i++){
		if(arr[i]!=0){
			printf("%d ",arr[i]);
		}
	}
	return 0;

} 
用选择法对10个整数排序
#include<stdio.h>
int main(){
	int arr[10]={0};
	int i=0;
	for(i=0;i<10;i++){
		scanf("%d",&arr[i]);
		printf("arr[%d]=%d\n",i,arr[i]);
	} 
	printf("排序前\n"); 
	for(i=0;i<10;i++){
		printf("%d ",arr[i]); 
	}
	//先找到最小的数的索引 让它和当前i位置的数交换 
	int min=0;
	for(i=0;i<10;i++){
		min=i;//重置当前位置 
		int j=0;
		for(j=i+1;j<10;j++){
			if(arr[min]>arr[j]){
				min=j;
			}
		}
		int temp=arr[i];
		arr[i]=arr[min];
		arr[min]=temp;
		
	}
	printf("\n");
	printf("排序后\n");
	for(i=0;i<10;i++){
		printf("%d ",arr[i]); 
	}
	return 0;

} 
求对角线元素之和
#include<stdio.h>
int main(){
	int arr[3][3]={1,2,3,4,5,6,7,8,9};
	int sum=0;
	int sum1=0;
	int i=0,j=0;
	for(i=0;i<3;i++){
		for(j=0;j<3;j++){
			if(i==j){
			sum+=arr[i][j];
			}
		}
	}
	for(i=0;i<3;i++){
		for(j=0;j<3;j++){
			if(i+j==2)
			sum1+=arr[i][j];
		}
	}
	printf("%d\n",sum);
	printf("%d\n",sum1);  
	return 0;

} 
插入元素进数组
#include<stdio.h>
int main(){
	int arr[11]={0,1,2,3,4,5,6,7,8,9};
//	int arr[11]={0,0,0,0,0,0,0,0,0,0};
//	int arr[11]={9,8,7,6,5,4,3,2,1,0};
	int i=0;
	int num=0;
	scanf("%d",&num); 
	if(arr[0]>arr[9]){
		//逆序  987654321 
		for(i=9;i>=0;i--){
			if(num>arr[i]){
				arr[i+1]=arr[i];
			}else{
				arr[i+1]=num;
				break;
			}
			if(i==0){
				arr[i]=num;//比完也没跳出循环 
			} 
		}
	}else{
		//顺序 或者 00000 
			for(i=9;i>=0;i--){
			if(num<arr[i]){
				arr[i+1]=arr[i];
			}else{
				arr[i+1]=num;
				break;
			}
				if(i==0){
				arr[i]=num;//比完也没跳出循环 
			} 
		}
	} 
	for(i=0;i<11;i++){
		printf("%d ",arr[i]);
	}
	return 0;

} 
逆序重新存放
#include<stdio.h>
int main(){
//	int arr[10]={0,1,2,3,4,5,6,7,8,9};
	int arr[5]={8,6,5,4,1}; 
	int len=sizeof(arr)/sizeof(arr[0]);
	int i=0;
	for(i=0;i<len/2;i++){
		int temp=arr[i];
		arr[i]=arr[len-1-i];
		arr[len-1-i]=temp;
	} 
	for(i=0;i<len;i++){
		printf("%d ",arr[i]);
	}
	return 0;

} 
打印杨辉三角
#include<stdio.h>
int main(){
	int arr[11][11];
	int i=0;
	int j=0;
	//找规律 对角线都为1 第一行都为1 
	for(i=1;i<=10;i++){
		for(j=1;j<=10;j++){
			if(j==1)
			arr[i][j]=1;
			else if(i==j)
			arr[i][j]=1;
			else 
			arr[i][j]=arr[i-1][j]+arr[i-1][j-1];
		}
	}
	for(i=1;i<=10;i++){
		for(j=1;j<=i;j++){
			printf("%2d ",arr[i][j]);
		}
		printf("\n");
	} 
	return 0;

} 
魔方阵
#include<stdio.h>
int main(){
	int n=0;
	scanf("%d",&n);  
	int arr[10][10]={0};
	int i=0;
	int j=0;
	int row=0;
	int col=0; 
	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++)
		arr[i][j]=0;
	} 
	//第一行的中间放1
		arr[1][n/2+1]=i;
		row=1;
		col=n/2+1;
	for(i=2;i<=n*n;i++){
		row-=1;
		col+=1;
		if(row<1)//防止row溢出 
		row+=n;
		if(col>n)//防止col溢出 
		col%=n;
		 
			if(arr[row][col]==0){
				arr[row][col]=i;
			} else{
				row+=2;//row可能溢出 
				col-=1;//col可能溢出 
				if(col<1)
				col+=n;
				if(row>n)
				row%=n; 
			   arr[row][col]=i;
			}
	

	}
	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++){
		printf("%d ",arr[i][j]); 
		} 
		printf("\n");
	}
	return 0;
} 
#include<stdio.h>
int main(){
int a[15][15],i,j,k,p,n;
p=1;
while(p==1){
	printf("1~15");
	scanf("%d",&n);
	if((n!=0)&&(n<=15)&&(n%2!=0)){
		p=0;
	}
	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++){
			a[i][j]=0;
		}
	}
	
//建立魔方阵
j=n/2+1;
a[1][j]=1;
for(k=2;k<=n*n;k++){
	i=i-1;
	j=j+1;
	if((i<1)&&(j>n)){
		i+=2;
		j-=1;
	}else{
		if(i<1)i=n;
		if(j>n)j=1;
	}
	if(a[i][j]==0)
	a[i][j]=k;
	else{
		i+=2;
		j-=1;
		a[i][j]=k; 
	} 
} 
} 
for(i=1;i<=n;i++){
		for(j=1;j<=n;j++){
		printf("%d ",a[i][j]); 
		} 
		printf("\n");
	}
	return 0;
} 
鞍点
#include<stdio.h>
int main(){
	
	//测试数据 
//	1 2 3 4 5
//	2 4 6 8 10
//	3 6 9 12 15
//	4 8 12 16 20

//	1 2 3 4 11
//	2 4 6 8 12
//	3 6 9 10 15
//	4 8 12 16 7
	int arr[4][5]={0};
	int i=0;
	int j=0;
	int n=0;
	printf("请输入数组数据\n");
	for(i=0;i<4;i++){
		for(j=0;j<5;j++){
			scanf("%d",&arr[i][j]);
		}
	}

	int flag=1; //为1说明有一个鞍点
	int ii=0; 
	int jj=0;//标记最大的一行j在哪 
	for(i=0;i<4;i++){
			int max=arr[i][0];//标记一个最大值
		for(j=1;j<5;j++){
			if(arr[i][j]>max){
				ii=i;
				jj=j;
				max=arr[i][j];
			}
		}
		for(n=0;n<4;n++){
			if(arr[n][jj]<max)
			flag=0;
		}
		if(flag==1)
		break;
	}
	if(flag)
	printf("arr[%d][%d]=%d\n",ii,jj,arr[ii][jj]); 
	else
	printf("没找到\n");
	return 0;
} 
二分查找
#include<stdio.h>
int main(){
//	int arr[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
	int arr[15]={15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
	int left=0;
	int right=sizeof(arr)/sizeof(arr[0]);
	int mid,flag=0;
	int num;//需要查找的那个数
	scanf("%d",&num); 
	while(left<=right){
		mid=(left+right)/2;
		if(num==arr[mid]){
			flag=1;//成功找到该元素 退出循环
			break; 
		}else{
			//该数组从大到小排序 
			if(num>arr[mid]){
				right=mid-1;
			}else{
				left=mid+1;
			} 
		}
	}
	if(flag==1)
	printf("found! 循环为%d\n",mid+1);
	else
	printf("No found!\n"); 
	return 0;
} 

判断字符数量
#include<stdio.h>
#include<string.h>
int main(){
	char text[3][80];
	int i=0,j=0;
	int upstring=0;//大写字符
	int lowstring=0;//小写字符
	int dig=0;//数字
	int space=0;//空格字符
	int other=0;//其它字符 
	for(i=0;i<3;i++){
		printf("please input line %d:\n",i+1);
		gets(text[i]);
		for(j=0;j<80&&text[i][j]!='\0';j++){
			if(text[i][j]>='A'&&text[i][j]<='Z'){
				upstring++;
			}else if(text[i][j]>='a'&&text[i][j]<='z'){
				lowstring++;
			}else if(text[i][j]>='0'&&text[i][j]<='9'){
				dig++;
			}else if(text[i][j]==' '){
				space++;
			}else{
				other++;
			}
		}
	}
	printf("大写字母个数:%d\n",upstring);
	printf("小写字母个数:%d\n",lowstring);
	printf("数字个数:%d\n",dig);
	printf("空格个数:%d\n",space);
	printf("其它字符个数:%d\n",other);

	return 0;
} 
打印图案 
#include<stdio.h>
//* * * * *
//  * * * * *
//    * * * * *
//      * * * * *
//        * * * * *
	int main(){
		int i=0;
		int j=0;
		for(i=0;i<5;i++){
			for(j=0;j<5+i;j++){
				if(j<i){
					printf("  ");
				}else{
					printf("* ");
				}
			}
			printf("\n");
		}

	return 0;
} 
转译密文
#include<stdio.h>
#include<string.h>
//26-(a-'A')+'A'+1 ---->25-a+'A'+'A'
//R droo erhrg Xsrmz mvcg dvvp.
	int main(){
		char text[80],trans[80];
		gets(text);
		int i=0;
		for(i=0;i<80;i++){
			if((text[i]>='a')&&(text[i]<='z')){
				trans[i]=(char)(25-text[i]+'a'+'a');
			}else if((text[i]>='A')&&(text[i]<='Z')){
				trans[i]=(char)(25-text[i]+'A'+'A');
			}else{
				trans[i]=text[i];
			}
		}
		printf("%s\n",trans);
	return 0;
} 
模拟strcat
#include<stdio.h>
	int main(){
		char s1[80],s2[40];
		int i=0,j=0;
		printf("input string1:\n");
		scanf("%s",s1);
		printf("input string2:\n");
		scanf("%s",s2);
		while(s1[i]!='\0')
		i++;
		while(s2[j]!='\0'){
			s1[i++]=s2[j++];
		}
		s1[i]='\0';
		printf("new String is -> %s\n",s1);
		return 0;
	}
模拟strcmp
#include<stdio.h>
	int main(){
		char s1[40],s2[40];
		int num=0;
		gets(s1);
		gets(s2);
		int i=0;
		while(s1[i]==s2[i]&&s1[i]!='\0')
		i++;
		if(s1[i]=='\0'&&s2[i]=='\0')	
		num=0;
		else
		num=s1[i]-s2[i];
		printf("result:%d\n",num);
		return 0;
	}
模拟strcpy
#include<stdio.h>
#include<string.h> 
	int main(){
		char s1[40]="sd",s2[40];
		printf("原来的s1->:%s\n",s1);
		scanf("%s",s2);
		int i=0;
		//=strlen是为了把\0也拷过去 
		for(i=0;i<=strlen(s2);i++)
		s1[i]=s2[i];
		printf("%s\n",s1);
		return 0;
	}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值