C语言谭浩强第三版第七章例题及课后题:数组

目录

eg7.1数组元素的引用

eg7.2用数组来处理求Fibonacci数列问题(前面那个我就是用数组写的)(eg6.7)

eg7.3用起泡法对10个数排序(由小到大)

eg7.4将一个二维数组a的行和列的元素互换,存到另一个二维数组b中

eg7.5有一个3x4的矩阵,编程求出其中值最大的那个元素的值,以及其所在的行号和列号

eg7.6输出一个字符串

eg7.7输出一个菱形图

eg7.8输入一行字符,统计其中有多少个单词,单词之间用空格分隔开

eg7.9有3个字符串,要求找出其中最大者

7.1用筛选法求100之内的素数

7.2用选择法对10个整数排序

7.3求一个3x3的整型矩阵对角线元素之和 

7.4已有一个已排好序的数组,要求输入一个数后,按原来排序的过来将它插入数组中

7.5将一个数组中的值按逆序重新排放

7.6输出以下的杨辉三角形(要求输出10行)

7.7输出魔方阵

7.8找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点

7.9折半查找数组中的某元素

7.10有一篇文章,共有3行文字,每行有80个字符要求分别统计出其中英文大学字母、小写字母、数字、空格以及其他字符的个数

7.11输出以下图案

7.12有一行电文,要求输出密码和原文

7.13将两个字符串连接起来,不要用strcat函数

7.14比较两个字符串

7.15字符串拷贝,不要用strcpy函数


eg7.1数组元素的引用

//eg7.1数组元素的引用
//使a[0]~a[9]的值为0~9,然后按逆序输出

#include

void main(void){
	int a[10];
	int i;
	
	for(i = 0; i < 10; i++){
		a[i] = i;
	}
	
	for(i = 9; i >= 0; i--){
		printf("%d ", a[i]);
	}
	
} 

 

eg7.2用数组来处理求Fibonacci数列问题(前面那个我就是用数组写的)(eg6.7)

eg7.3用起泡法对10个数排序(由小到大)

    //数组数据输入:由用户在执行框中输入
    int a[10];
    int i;
    
    printf("Please input 10 numbers:");
    for(i = 0; i < 10; i++){
        scanf("%d", &a[i]);
    } 

//eg7.3用起泡法对10个数排序(由小到大)
//起泡法的思路是:将相邻两个数比较,将小的调到前头。

//自己调试出来的,自己找出来的原因,开心,小机灵鬼,啦啦啦! 
#include

void bubbleSort(int a[], int count);
void swap(int *a, int *b);
void show(int a[], int count);

void show(int a[], int count){
	int i;
	
	for(i = 0; i < count; i++){
		printf("%d ", a[i]);
	}
	printf("\n");
}

void swap(int *a, int *b){
	int tmp;
	
	tmp = *a;
	*a = *b;
	*b = tmp;
}
//刚开始错因:每一轮结束之后,应该要从头开始比较 
void bubbleSort(int a[], int count){
	int i;
	int j;
	
	for(i = 0; i < count-1; i++){       
		for(j = 0; j < count-1-i; j++){  //for(j = i; j < count-1-i; j++){    //for(j = i; j < count-1; j++){
			if(a[j] > a[j+1]){
				swap(&a[j], &a[j+1]);
			}
			//show(a, 10);   为了调试加入 
		}
	}
}

void main(void){
	//数据输入法1:程序员在程序中输入 
	//int a[10] = {1,0,4,8,12,65,-76,100,-45,123}; //int a[10] = {2,7,3,6,1,8,9,0,5,4};
	
	//数据输入法2:由用户在执行框中输入
	int a[10];
	int i;
	
	printf("Please input 10 numbers:");
	for(i = 0; i < 10; i++){
		scanf("%d", &a[i]);
	} 
	
	printf("原数组中的值为:"); 
	show(a, 10);
	
	bubbleSort(a, 10);
	printf("排序后数组中的值为:"); 
	show(a, 10);
}

eg7.4将一个二维数组a的行和列的元素互换,存到另一个二维数组b中

    int row = 3;
    int col = 4;
    int a[row][col];
可以这样子写

//eg7.4将一个二维数组a的行和列的元素互换,存到另一个二维数组b中


#include

void main(void){
	int row = 2;
	int col = 3;
	int a[row][col];
	int b[col][row];
	int i, j;
	
	printf("Please input %dx%d 个元素:", row, col);
	for(i = 0; i < row; i++){
		for(j = 0; j < col; j++){
			scanf("%d", &a[i][j]);
		}
	}

	printf("a数组中的元素为:\n"); 	   //将a数组元素的输出和u具体的元素交换放到一起做了,没有什么影响 
	for(i = 0; i < row; i++){
		for(j = 0; j < col; j++){
			printf("%d ", a[i][j]);
			b[j][i] = a[i][j];			
		}
		printf("\n");
	}
	
	printf("b数组中的元素为:\n"); 
	for(i = 0; i < col; i++){
		for(j = 0; j < row; j++){
			printf("%d ", b[i][j]);
		}
		printf("\n");
	}		
}

eg7.5有一个3x4的矩阵,编程求出其中值最大的那个元素的值,以及其所在的行号和列号

小技巧:

a[3][4]找最大值时,先将max=a[0][0];

//eg7.5有一个3x4的矩阵,要求编程求出其中值最大的那个元素的值,以及其所在的行号和列号
//1 2 3 4 9 8 7 6 -10 10 -5 2
#include

void main(void){
	int row = 3;
	int col = 4;
	int a[row][col];
	int i, j;
	int max;   //int max = a[0][0];  
	//错误原因:如果在这个地方就把max赋值为a[0][0],由于还未对a数组进行初始化,所以此时max中的值是垃圾数据
	//与a的其他元素比较时就会出错 
	int mrow;
	int mcol;
	
	printf("Please input %dx%d 个元素:", row, col);
	for(i = 0; i < row; i++){
		for(j = 0; j < col; j++){
			scanf("%d", &a[i][j]);
		}
	}
	
	
	printf("数组中的元素为:\n"); 	   
	for(i = 0; i < row; i++){
		for(j = 0; j < col; j++){
			printf("%d ", a[i][j]);		
		}
		printf("\n");
	}

	max = a[0][0];
	mrow = 0;
	mcol = 0;
	for(i = 0; i < row; i++){
		for(j = 0; j < col; j++){
			if(a[i][j] > max){
				max = a[i][j];
				mrow = i;
				mcol = j;
			}
			printf("最大值为:%d, row=%d, col=%d\n", max, mrow, mcol);
		}
	}
//	printf("最大值为:%d, row=%d, col=%d\n", max, mrow, mcol);
	

}

eg7.6输出一个字符串

//eg7.6输出一个字符串

#include

void main(void){
	char c[10] = "I am a boy";
	int i;
	
	for(i = 0; i < 10; i++){
		printf("%c", c[i]);
	}
	printf("\n");
}

eg7.7输出一个菱形图

//eg7.7输出一个菱形图

#include

void main(void){
	char c[][5] = {{' ', ' ', '*'}, {' ', '*', ' ', '*'}, {'*', ' ', ' ', ' ', '*'}, {' ', '*', ' ', '*'}, {' ', ' ', '*'}};
	int i,j;
	
	for(i = 0; i < 5; i++){
		for(j = 0; j < 5; j++){
			printf("%c", c[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

eg7.8输入一行字符,统计其中有多少个单词,单词之间用空格分隔开

//eg7.8输入一行字符,统计其中有多少个单词,单词之间用空格分隔开

/*
1.如何输入一行字符?  
  之前的例题中有一个方法 while(c != '\n') scanf
  此题用gets 
2.如果用字符数组存字符的话,字符数组要开多大呢?
  定义时,要确定的呀. 
  此题直接自己设定了一个初值 
*/

/*
//自己 考虑不充分 只考虑了最简单的情况
//未考虑的情况1:若是两个单词之间出现多个空格怎么办?
//未考虑的情况2:若是刚开始就输入空格怎么办? 
#include

void main(void){
	char c[100];
	int i;
	int count = 0;
	
	printf("请输入一行字符:"); 
	gets(c);
	
	for(i = 0; i < 100; i++){
		if(c[i] == ' '){
			count++;
		}
	}
	printf("单词个数为:%d", count+1);
} 
*/

//课本
//1.不用把整个数组遍历一遍,只需要遍历字符串就好,那怎么确定循环条件呢?别忘了字符串的本质特征----以'\0'结尾的字符数组。
//2.解题思路:单词的数目可以由空格出现的次数决定(连续的若干个空格作为出现一次空格;一行开头的空格不统计在内)。 
#include

void main(void){
	char str[100];
	char c;
	int i;
	int count = 0;
	int n = 0;     //记录当前字符是否为空格,为下次循环时判断个数是否加1做准备 
	
	printf("请输入一行字符:"); 
	gets(str);
	
	for(i = 0; (c=str[i]) != '\0'; i++){      //for(i = 0; i < 100; i++){
		if(c == ' '){     //当前字符是空格 
			n = 0;        //为了下一次循环做准备 
		}else if(n == 0){       //当前字符不是空格 
			n = 1;
			count++;
		}
	}
	printf("单词个数为:%d", count);
} 

eg7.9有3个字符串,要求找出其中最大者

1.字符串比较函数strcmp
2.自己一直在纠结,三个字符串怎么比较大小,要是三个里面有2个一样该怎么办,该不该继续向下比较,该算在拿一个里面呢 
答案是两个两个进行比较的,就像当年朱老师比较的,先找到两个里面的最大值,然后用这个最大值和第三个进行比较,从而找到3个里面的最大值 
3.自己还找了一下三个字符串最长字符串的字符个数,其实不用找的
字符串比较的规则是:对两个字符串自左向右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到'\0'为止。
如果全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。
所以,人家比到'\0'就结束了,不用你给人家定界啦。 

//eg7.9有3个字符串,要求找出其中最大者
/*
anan is a girl.
susu is a boy.
susu likes anan.
*/

/*

自己写的这个有bug,不对
1.要比较的是字符,自己是用int比较的,没有报错,应该是把char型的直接转化为了int型进行比较的。 
但是人家有专门的字符串比较函数strcmp呀,好傻呀
2.自己一直在纠结,三个字符串怎么比较大小,要是三个里面有2个一样该怎么办,该不该继续向下比较,该算在拿一个里面呢 
答案是两个两个进行比较的,就像当年朱老师比较的,先找到两个里面的最大值,然后用这个最大值和第三个进行比较,从而找到3个里面的最大值 
3.自己还找了一下三个字符串最长字符串的字符个数,其实不用找的
字符串比较的规则是:对两个字符串自左向右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到'\0'为止。
如果全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。
所以,人家比到'\0'就结束了,不用你给人家定界啦。 
 
#include

int numberOfCharacters(char str[], int count);  //统计字符串的有效字符个数 
int max(int a, int b, int c);
void swap(int *a, int *b);    


void swap(int *a, int *b){
	int tmp;
	
	tmp = *a;
	*a = *b;
	*b = tmp;
}

int maxValue(int a, int b, int c){
	int max = a;
	
	if(b > max){         //max是a、b中最大的 
		swap(&b, &max);
	} 
	
	if(c > max){        //max是a、b、c中最大的 
		swap(&c, &max);
	} 
	return max; 
}

int numberOfCharacters(char str[], int count){
	int n = 0;
	int i;
	
	for(i = 0; i < count; i++){
		if(str[i] != '\0'){
			n++;
		}else{
			return n;
		}
	}	 
}
void main(void){
	char str1[100];
	char str2[100];
	char str3[100];
	int maxCount;
	int i;
	int max;
	
	printf("请依次输入三个字符串的值:\n");
	gets(str1);
	gets(str2);
	gets(str3);
	
	printf("三个字符串的值分别为:\n");
	printf("str1: %s\n", str1); 
	printf("str2: %s\n", str2); 
	printf("str3: %s\n", str3); 
	
	
	printf("三个字符串的字符个数分别为:%d %d %d\n", numberOfCharacters(str1, 100),
	numberOfCharacters(str2, 100), numberOfCharacters(str3, 100));
	maxCount = maxValue(numberOfCharacters(str1, 100), numberOfCharacters(str2, 100), numberOfCharacters(str3, 100));
	printf("最长的字符串个数为:%d\n", maxCount);
	
	for(i = 0; i < maxCount; i++){
		max = maxValue(str1[i], str2[i], str3[i]);
		if(max == str1[i]){
			printf("最大的字符串为str1:%s\n", str1);
		}else if(max == str2[i]){
			printf("最大的字符串为str2:%s\n", str2);
		}else{
			printf("最大的字符串为str3:%s\n", str3);
		}
	}
	
}
*/

#include
#include

void main(void){
	char str1[100];
	char str2[100];
	char str3[100];
	char str[100]; 
	
	printf("请依次输入三个字符串的值:\n");
	gets(str1);
	gets(str2);
	gets(str3);
	
	printf("三个字符串的值分别为:\n");
	printf("str1: %s\n", str1); 
	printf("str2: %s\n", str2); 
	printf("str3: %s\n", str3); 
	
	if(strcmp(str1, str2) > 0){
		strcpy(str,str1); 
	}else{
		strcpy(str,str2);
	}
	
	if(strcmp(str3, str) > 0){
		strcpy(str,str3);
	} 
	printf("最大的字符串为:%s\n", str);
}

7.1用筛选法求100之内的素数

   //每一行输出10个数字  i=0时就要输出回车怎么办? 加个1就好了

 for(i = 0; i < 100; i++){
        printf(...);
        if((i+1)%10 == 0){     //哈哈,我真是太聪明了 
            printf("\n");
        }

//7.1用筛选法求100之内的素数

/*
筛选法又称筛法,具体做法是:先把N个自然数按次序排列起来。1不是质数,也不是合数,
要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没
划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数
是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N
的全部合数都筛掉,留下的就是不超过N的全部质数。

合数(Composite number)指自然数中除了能被1和本身整除外,还能被其他数(0除外)整除的数。
与之相对的是质数,而1既不属于质数也不属于合数。最小的合数是4。
质数(prime number)又称素数
*/

#include
#include

typedef unsigned char  boolean;
#define  TRUE      1
#define  FALSE     0

void initArray(int a[], int n);
void showArray(int a[], int n);
boolean isPrimeNumber(int num);
int arePrimeNumbers(int a[], int n,int b[]);   //把b[]的个数传出去 

int arePrimeNumbers(int a[], int n,int b[]){
	int i,j;
	int count = 0;
	
	for(i = 0; i < n; i++){
		if(a[i] < 0){
			continue;
		}
		
		if(isPrimeNumber(a[i])){
			b[count] = a[i];
			count++;
			for(j = i+1; j < n; j++){
				if(a[j]%a[i] == 0){
					a[j] = -1;
				}
			}
		}
	}
	return count;
}


boolean isPrimeNumber(int num){
	int i;
	
	if(num == 1){
		return FALSE;
	}
	for(i = 2; i <= sqrt(num); i++){
		if(num % i == 0){
			return FALSE;
		}
	}
	return TRUE;	
}

void showArray(int a[], int n){
	int i;
	
	printf("数组中的元素为:\n");
	for(i = 0; i < n; i++){
		printf("%2d ", a[i]);
		if((i+1)%10 == 0){   //哈哈,我真是太聪明了 
			printf("\n");
		}
	}
	printf("\n");
}

void initArray(int a[], int n){
	int i;
	
	for(i = 0; i < n; i++){
		a[i] = i+1;
	}
}

void main(void){
	int n = 99;
	int a[n];
	int b[n]; 
	int count; //b数组有效元素的个数 
	
	initArray(a, n);
	showArray(a, n);
	printf("\n");
	
	count = arePrimeNumbers(a, n, b);
	showArray(b, count);

}
//	int num = 11;
//	isPrimeNumber(num) == 1 ? printf("%d是质数\n", num) : printf("%d不是质数\n", num); 

7.2用选择法对10个整数排序

冒泡排序法:一趟一趟的将两个相邻的数进行交换如果有10个数则需要排9趟,
如果是从大到小输出则需要每次将后一个数和前一个数进行比较将较大的数赋
值给前一个数,将较小的数赋值给后一个数,其实就是两个数交换,那么第一
趟交换完毕后,最小的数便出现在了数组的最后面,然后进行第二趟的比较时
则要对余下的前9个数进行比较,9趟比较完成后则数组也已经排好序。

选择排序法:10个数则是需要排9次,若按降序排列,第一次比较:则是将数组
的第一个元素与数组中从第二个元素开始到最后的元素进行比较找到最大的数
记录下来然后将值赋值给数组的第一个元素,然后进行第二次比较:则是将数
组的第二个元素与数组中从第三个元素开始到最后的元素进行比较,找最大的
数记录下来将值赋值给数组的第二个元素。。。依次循环找完
排序算法那个链接: http://www.cnblogs.com/eniac12/p/5329396.html#s2

//7.2用选择法对10个整数排序
/*
冒泡排序法:一趟一趟的将两个相邻的数进行交换如果有10个数则需要排9躺,
如果是从大到小输出则需要每次将后一个数和前一个数进行比较将较大的数赋
值给钱一个数,将较小的数赋值给后一个数,其实就是两个数交换,那么第一
趟交换完毕后,最小的数便出现在了数组的最后面,然后进行第二趟的比较时
则要对余下的前9个数进行比较,9趟比较完成后则数组也已经排好序。

选择排序法:10个数则是需要排9次,若按降序排列,第一次比较:则是将数组
的第一个元素与数组中从第二个元素开始到最后的元素进行比较找到最大的数
记录下来然后将值赋值给数组的第一个元素,然后进行第二次比较:则是将数
组的第二个元素与数组中从第三个元素开始到最后的元素进行比较,找最大的
数记录下来将值赋值给数组的第二个元素。。。依次循环找完


原文:https://blog.csdn.net/persistence_s/article/details/53200421 
*/
#include

void selectionSort(int a[], int count);
void swap(int *a, int *b);
void show(int a[], int count);

void show(int a[], int count){
	int i;
	
	for(i = 0; i < count; i++){
		printf("%d ", a[i]);
	}
	printf("\n");
}

void swap(int *a, int *b){
	int tmp;
	
	tmp = *a;
	*a = *b;
	*b = tmp;
}

void selectionSort(int a[], int count){
	int i;
	int j;
	int min;
	int index;
	
	for(i = 0; i < count-1; i++){
		min = a[i];
		index = i;    
		   
		for(j = i+1; j < count; j++){  
			if(a[j] < min){
				min = a[j];   //swap(&a[j], &min);
				index = j;
			}
			//printf("最小值为:%d, 其下标为:%d\n", min, index);  //为了debug加入 
		}
				
		swap(&a[i], &a[index]);
		show(a, 10);   //为了调试加入 

	}
}

void main(void){
	//数据输入法1:程序员在程序中输入 
	//int a[10] = {1,0,4,8,12,65,-76,100,-45,123}; //int a[10] = {2,7,3,6,1,8,9,0,5,4};  
	//9 8 7 4 16 5 6 3 1 2 
	
	//数据输入法2:由用户在执行框中输入
	int a[10];
	int i;
	
	printf("Please input 10 numbers:");
	for(i = 0; i < 10; i++){
		scanf("%d", &a[i]);
	} 
	
	printf("原数组中的值为:"); 
	show(a, 10);
	printf("************\n"); 
	
	selectionSort(a, 10);
	printf("************\n"); 
	printf("排序后数组中的值为:"); 
	show(a, 10);
}

7.3求一个3x3的整型矩阵对角线元素之和 

//7.3求一个3x3的整型矩阵对角线元素之和 
//课本只求了主对角线的和
 
#include

void main(void){
	int row = 3;
	int col = 3;
	//int a[row][col] = {{1,2,3}, {4,5,6}, {7,8,9}};  //不能这样子 
	int a[row][col];
	int i,j;
	int sum = 0;
	
	printf("Please input %dx%d 个元素:", row, col);
	for(i = 0; i < row; i++){
		for(j = 0; j < col; j++){
			scanf("%d", &a[i][j]);
		}
	}
	
	for(i = 0; i < row; i++){
		for(j = 0; j < col; j++){
			if(i == j || (i+j) == row-1){
				sum += a[i][j];
				//printf("对角线元素之和为:%d\n", sum); 
			}			
		}
	}
	//sum-=a[row/2][col/2];  //因为是3x3,所以最中间的必定多加一次,故要减去
	                       //如果是偶数的话,就不用减了
	//为什么最后不用加了呢?因为遍历的时候,最中间的元素只算了一次 
	printf("对角线元素之和为:%d\n", sum); 
	
}

7.4已有一个已排好序的数组,要求输入一个数后,按原来排序的过来将它插入数组中

//7.4已有一个已排好序的数组,要求输入一个数后,按原来排序的过来将它插入数组中
//1 2 3 4 5 6 7 9 10 8

/*
//自己方法1:
//遍历数组,找到比新输入的数值大的那个元素,和新输入的值交换
//以后的每次,数组的最后一个元素都和上一次交换的下一个元素交换,最后就排好序了 
#include

void show(int a[], int count);
void swap(int *a, int *b);

void swap(int *a, int *b){
	int tmp;
	
	tmp = *a;
	*a = *b;
	*b = tmp;
}

void show(int a[], int count){
	int i;
	
	for(i = 0; i < count; i++){
		printf("%d ", a[i]);
	}
	printf("\n");
}

void main(void){
	int n = 10;
	int a[n];
	int i;
	
	printf("Please input 10 numbers:");
	for(i = 0; i

void show(int a[], int count);
void swap(int *a, int *b);

void swap(int *a, int *b){
	int tmp;
	
	tmp = *a;
	*a = *b;
	*b = tmp;
}

void show(int a[], int count){
	int i;
	
	for(i = 0; i < count; i++){
		printf("%d ", a[i]);
	}
	printf("\n");
}

void main(void){
	int n = 10;
	int a[n];
	int i;
	int index; //记录比新插入的元素大的那个元素的下标 
	int new;
	
	printf("Please input 10 numbers(其中第10个数为要插入的值):");
	for(i = 0; i index; i--){
		a[i] = a[i-1];
	}
	a[index] = new;
	
	printf("插入新值后数组中的值为:"); 
	show(a, n);	
}

7.5将一个数组中的值按逆序重新排放

//7.5将一个数组中的值按逆序重新排放

#include

void show(int a[], int count);
void swap(int *a, int *b);
void reverse(int a[], int n);

void reverse(int a[], int n){
	int i;
	
	for(i = 0; i <= (n-1)/2; i++){
		swap(&a[i], &a[n-1-i]);
	}
}

void swap(int *a, int *b){
	int tmp;
	
	tmp = *a;
	*a = *b;
	*b = tmp;
}

void show(int a[], int count){
	int i;
	
	for(i = 0; i < count; i++){
		printf("%d ", a[i]);
	}
	printf("\n");
}

void main(void){
	int a[10] = {1,0,4,8,12,65,-76,100,-45,123};
	
	printf("原数组中的值为:"); 
	show(a, 10);
	
	reverse(a, 10);
	printf("逆序后数组中的值为:"); 
	show(a, 10);

}

7.6输出以下的杨辉三角形(要求输出10行)

C语言谭浩强第三版第七章例题及课后题:数组_第1张图片

//7.6输出以下的杨辉三角形(要求输出10行)
/*
各行的第一个数都是1
各行最后一个数都是1
以后的各行,除上面指出的第一个数和最后一个数外,其余各数是上一行同列和前一列两个数之和。 
*/ 
#include
#define  N  10

void main(void){
	int a[N][N] = {0};
	int i,j;
	
	for(i = 0; i < N; i++){
		a[i][0] = 1;
		a[i][i] = 1;
		
		for(j = 1; j < i; j++){ 
			a[i][j] = a[i-1][j-1] + a[i-1][j];
		} 
	}
		
	printf("a数组中的元素为:\n"); 	   
	for(i = 0; i < N; i++){
		for(j = 0; j < i+1; j++){
			printf("%-3d ", a[i][j]);	
		}
		printf("\n");
	}

} 

7.7输出魔方阵

 

 

C语言谭浩强第三版第七章例题及课后题:数组_第2张图片   C语言谭浩强第三版第七章例题及课后题:数组_第3张图片   C语言谭浩强第三版第七章例题及课后题:数组_第4张图片

//7.7输出魔方阵

/*
魔方阵的排列规律如下:
⑴将1放在第一行中间一列;
⑵从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);
⑶如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;
⑷当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;
⑸如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。
  例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面。
*/
#include

#define N   3

void main(void){
	int a[N][N] = {0};
	int i,j, k;
	int prerow = 0;
	int precol = N/2;
	
	for(a[0][N/2] = 1, i = 2; i <= N*N; i++){
		if(prerow == 0 && precol == N-1){
			a[prerow+1][precol] = i;
			prerow = prerow+1;
			precol = precol;
		}else if(prerow == 0){
			if(a[N-1][precol+1] != 0){
				a[prerow+1][precol+1] = i;	
				prerow = prerow+1;
				precol = precol+1;
			}else{
				a[N-1][precol+1] = i;
				prerow = N-1;
				precol = precol+1;	
			}
		}else if(precol == N-1){
			if(a[prerow-1][0] != 0){
				a[prerow+1][precol+1] = i;
				prerow = prerow+1;
				precol = precol+1;				
			}else{
				a[prerow-1][0] = i;
				prerow = prerow-1;
				precol = 0;				
			}
		}else{
			if(a[prerow-1][precol+1] != 0){
				a[prerow+1][precol] = i;
				prerow = prerow+1;
				precol = precol;					
			}else{
				a[prerow-1][precol+1] = i;
				prerow = prerow-1;
				precol = precol+1;				
			}
		}

	printf("数组中的元素为:\n"); 	   //将a数组元素的输出和u具体的元素交换放到一起做了,没有什么影响 
	for(k = 0; k < N; k++){
		for(j = 0; j < N; j++){
			printf("%2d ", a[k][j]);
		}
		printf("\n");
	}
	printf("\n");
			
	}	
}

7.8找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点

//7.8找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点
//1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20
//1 12 3 4 5 2 4 16 8 10 3 6 9 12 15 4 8 12 16 20

#include

void main(void){
	int row = 4;
	int col = 5;
	int a[row][col];
	int i, j;
	int flag = 0;   //检测有没有鞍点 
	
	int rowmax[row];
	int colmin[col];
	
	int max;
	int min;
	
	printf("Please input %dx%d 个元素:", row, col);
	for(i = 0; i < row; i++){
		for(j = 0; j < col; j++){
			scanf("%d", &a[i][j]);
		}
	}

	printf("数组中的元素为:\n"); 	   
	for(i = 0; i < row; i++){
		for(j = 0; j < col; j++){
			printf("%2d ", a[i][j]);
		}
		printf("\n");
	}
	
	printf("每一行中最大的值的列下标为:"); 
	for(i = 0; i < row; i++){
		rowmax[i] = 0;
		max = a[i][0]; 
		for(j = 0; j < col; j++){
			if(a[i][j] > max){
				max = a[i][j];
				rowmax[i] = j;
			}
		}
		printf("%d ", rowmax[i]);
	}
	printf("\n");

	printf("每一列中最小的值的行下标为:"); 
	for(j = 0; j < col; j++){
		colmin[j] = 0;
		min = a[0][j];
		for(i = 0; i < row; i++){			
			if(a[i][j] < min){
				min = a[i][j];
				colmin[j] = i;
			}
		}
		printf("%d ", colmin[j]);
	}
	printf("\n");

	
	for(i = 0; i < row; i++){
		for(j = 0; j < col; j++){
			if(i == colmin[j] && j == rowmax[i]){
				printf("鞍点为:a[%d][%d]=%2d ", i, j, a[i][j]);
				flag = 1;
			} 
		} 
	} 
	printf("\n");
	
	if(flag == 0){
		printf("Not exist.\n");
	} 
	 
}

7.9折半查找数组中的某元素

//7.9折半查找数组中的某元素
//有15个数按由大到小顺序存放在一个数组里,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值
//如果该数不在数组中,则输出“无此数” 
//15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

#include
#define N  15

void show(int a[], int count);
int halfSearch(int a[], int count, int value);

int halfSearch(int a[], int count, int value){
	int left = 0;
	int right = count-1;
	int mid;
	int flag = 0;

	while(left <= right){
		mid = (left+right)/2;
		
		if(value == a[mid]){
			printf("能找到\n");
			flag = 1;
			return mid;			
		}else if(value > a[mid]){
			right = mid-1;
		}else{
			left = mid+1;
		}		
	}
	
	if(flag == 0){
		printf("找不到\n");
		return -1;
	}
}

void show(int a[], int count){
	int i;
	int index;
	
	for(i = 0; i < count; i++){
		printf("%d ", a[i]);
	}
	printf("\n");
}

void main(void){
	int a[N];
	int value;
	int i;
	int index;
	
	printf("请输入数组元素(共%d个):", N);
	for(i = 0; i < N; i++){
		scanf("%d", &a[i]);
	}
	
	printf("数组中的元素为:"); 
	show(a, N);
	
	printf("请输入要查找的数:");
	scanf("%d", &value);
	 
	index = halfSearch(a, N, value);
	if(index == -1){
		printf("该值不存在\n");
	}else{
		printf("%d在数组中的下标为:%d\n", value, index);
	}
} 

7.10有一篇文章,共有3行文字,每行有80个字符要求分别统计出其中英文大学字母、小写字母、数字、空格以及其他字符的个数

    char c[3][80];
    int i,j;
    
    for(i = 0; i < 3; i++){
        printf("请输入一串字符:"); 
        gets(c[i]);
        printf("%s\n", c[i]);
        for(j = 0; c[i][j] != '\0'; j++){    //for(j = 0; j < 80; j++){ 
            ......
        }
    }
  

//7.10有一篇文章,共有3行文字,每行有80个字符。要求分
//别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数

/*
I am a student. 12234 AWE 
I am a student.
123456
ASDFG
答案:6 10 6 3 1 
*/


/*自己:还是用的之前那个例子的方法,自己理解题意错误,是要把三行的统计到一起 
#include

void fun(char c[], int count);

void fun(char c[], int count){
//	int count;	
//	count = sizeof(c)/sizeof(char);	
//	printf("sizeof(c)=%d,数组元素个数为:%d\n", sizeof(c),count);

	int capital = 0;
	int xiaoxie = 0;
	int num = 0;
	int space = 0;
	int other = 0;
	int i;
	
	for(i=0; c[i] != '\0'; i++){      //for(i=0; i < count; i++){    
		if(c[i] >= 'A' && c[i] <= 'Z'){
			//printf("*\n");
			capital++;
		}else if(c[i] >= 'a' && c[i] <= 'z'){
			//printf("**\n");
			xiaoxie++;
		}else if(c[i] >= '0' && c[i] <= '9'){
			//printf("***\n");
			num++;
		}else if(c[i] == ' '){
			//printf("****\n");
			space++;
		}else{
			//printf("*****\n");
			other++;
		}		
	}
	
	printf("大写字母个数:%d\n小写字母个数:%d\n数字个数:%d\n空格个数:%d\n其他字符个数:%d\n\n", capital, xiaoxie, num, space, other);
	
}

void main(void){
	char c1[80];
	char c2[80];
	char c3[80];
	
	printf("请输入一串字符:"); 
	gets(c1);
	//printf("%s\n", c1);
	fun(c1, 80);
	
	printf("请输入一串字符:"); 
	gets(c2);
	fun(c2, 80);
	
	printf("请输入一串字符:"); 
	gets(c3);
	fun(c3, 80);
}
*/
//课本:用的是二维数组 
#include

void main(void){
	char c[3][80];
	int upper = 0;
	int lower = 0;
	int digit = 0;
	int space = 0;
	int others = 0;
	int i,j;
	
	for(i = 0; i < 3; i++){
		printf("请输入一串字符:"); 
		gets(c[i]);
		printf("%s\n", c[i]);
		for(j = 0; c[i][j] != '\0'; j++){    //for(j = 0; j < 80; j++){
			if(c[i][j] >= 'A' && c[i][j] <= 'Z'){
				//printf("*\n");
				upper++;
			}else if(c[i][j] >= 'a' && c[i][j] <= 'z'){
				//printf("**\n");
				lower++;
			}else if(c[i][j] >= '0' && c[i][j] <= '9'){
				//printf("***\n");
				digit++;
			}else if(c[i][j] == ' '){
				//printf("****\n");
				space++;
			}else{
				//printf("*****\n");
				others++;
			}		
			
		}
	}
	
	printf("大写字母个数:%d\n小写字母个数:%d\n数字个数:%d\n空格个数:%d\n其他字符个数:%d\n\n", upper, lower, digit, space, others);	
} 




7.11输出以下图案

//7.11输出以下图案

#include

void space(int count);
void star(int count);

void star(int count){
	int i;
	
	for(i = 0; i < count; i++){
		printf("*");
	}
}
void space(int count){
	int i;
	
	for(i = 0; i < count; i++){
		printf(" ");
	}
}

void main(void){
	int row = 5;
	int i;
	
	for(i = 0; i < row; i++){
		space(i);
		star(5);
		printf("\n");
	}
	
} 

7.12有一行电文,要求输出密码和原文

C语言谭浩强第三版第七章例题及课后题:数组_第5张图片

//R droo erhrg Xsrmz mvcg dvvp.

#include

void main(void){
	char cipher[100] = {0};
	char original[100] = {0};
	char tmp;
	int i; 
	
	
	printf("请输入密码:");
	gets(cipher);;
	
	for(i = 0; cipher[i] != '\0'; i++){
		if(cipher[i] >= 'A' && cipher[i] <= 'Z'){ 
			tmp = cipher[i]; 
			//original[i] = (char)(25-(int)(tmp));//original[i] = 26-cipher[i]+1;
			original[i] = 'Z'-cipher[i] + 'A';   //A 65    Z 90   
		}else if(cipher[i] >= 'a' && cipher[i] <= 'z' ){
			original[i] = 'z'-cipher[i] + 'a';
		}else{
			original[i] = cipher[i];			
		}u8ujn
	}
	
	printf("输入的密码为:");
	puts(cipher);
	printf("对应的原文为:");
	puts(original);
}

7.13将两个字符串连接起来,不要用strcat函数

//7.13将两个字符串连接起来,不要用strcat函数
#include
#include 

void main(void){
	char str1[80];
	char str2[80];
	int index = -1; 
	int i;
	
	printf("请输入第一串字符:"); 
	gets(str1);

	printf("请输入第二串字符:"); 
	gets(str2);

	for(i = 0; i < 80; i++){
		if(str1[i] == '\0'){
			index = i;
			break;
		}
	}
	
	for(i = index; i < strlen(str2)+index+1; i++){
		str1[i] = str2[i-index];
	}
	
	printf("合并的字符串为:");
	puts(str1);

}

7.14比较两个字符串

C语言谭浩强第三版第七章例题及课后题:数组_第6张图片

printf("*%d*", 'Z'-'A');

 

//7.14比较两个字符串

/*
Aid
And
-5
*/

//遗留问题:未处理边界
 
#include

void main(void){
	char str1[80];
	char str2[80];
	int i;
	
	printf("请输入第一串字符:"); 
	gets(str1);

	printf("请输入第二串字符:"); 
	gets(str2);
	
	for(i = 0; i < 80; i++){
		/*
		if(str1[i] > str2[i]){
			printf("第一个字符串的第%d个字符%c比第二个字符串的第%d个字符%c大%d", 
			i+1, str1[i], i+1, str2[i], str1[i]-str2[i]);
			break;
		}else if(str1[i] < str2[i]){
			printf("第一个字符串的第%d个字符%c比第二个字符串的第%d个字符%c大%d", 
			i+1, str1[i], i+1, str2[i], str1[i]-str2[i]);
			break;
		}
		*/
		
		//把上面的两个合并了 
		if(str1[i] == str2[i] ){
			continue;
		}else{
			printf("第一个字符串的第%d个字符%c比第二个字符串的第%d个字符%c大%d", 
			i+1, str1[i], i+1, str2[i], str1[i]-str2[i]);
			break;
		}
	}
		
}

7.15字符串拷贝,不要用strcpy函数

小技巧:寻找字符串结束标志

方法1:自己

    for(i = 0; i < 80; i++){  
        if(str2[i] == '\0'){
            index = i;
            break;
        }
    }
方法2:课本

index = strlen(str2);



/*自己 
#include
#include 

void main(void){
	char str1[80] = {0};
	char str2[80] = {0};
	int index = -1; 
	int i;
	
	printf("请输入第二串字符:"); 
	gets(str2);

	for(i = 0; i < 80; i++){  
		if(str2[i] == '\0'){
			index = i;
			break;
		}
	}
	printf("字符串结束标志下标为:%d\n",index); 

	printf("拷贝前的第一串字符为:");
	puts(str1);
		
	for(i = 0; i < index+1; i++){  
		str1[i] = str2[i]; 
	}

	printf("拷贝后的第一串字符为:");
	puts(str1);

}
*/

//课本

 #include
#include 

void main(void){
	char str1[80] = {0};
	char str2[80] = {0};
	int index = -1; 
	int i;
	
	printf("请输入第二串字符:"); 
	gets(str2);

	index = strlen(str2);
	printf("字符串结束标志下标为:%d\n",index); 

	printf("拷贝前的第一串字符为:");
	puts(str1);
		
	for(i = 0; i < index+1; i++){  
		str1[i] = str2[i]; 
	}

	printf("拷贝后的第一串字符为:");
	puts(str1);

}

 

你可能感兴趣的:(C语言,C语言,谭浩强,第三版,课后题,第七章)