C语言 谭浩强 题目 -第八章

C语言 谭浩强 题目 -第八章,第1张

C语言 谭浩强 题目 -第八章

文章目录
  • 笔记
    • 通过指针引用数组
    • 用数组名作函数参数
      • 以变量名和数组名作为函数参数的比较
  • 例题
    • 例题5
    • 【例8.6】
    • 【例8.7】
    • 【例8.8】
    • 例题 10
    • 【例8.30】
  • 课后习题
    • 习题 1
    • 习题2
    • 习题 3
      • 方法1 普通指针
      • 方法2:(利用动态内存分配)
      • 作业
    • 习题 4 作业
      • 指针
      • 递归
      • 链表
      • 队列
    • 习题 5
      • 链表
      • 队列
    • 习题 6
      • 作业
    • 习题 7
    • 习题 8
    • 习题 9
        • 指针法
        • 动态内存法
    • 习题 10
      • 作业 将运用数组改为运用指针解决问题,同时起气泡和选择法
        • 起泡法
        • 选择法
    • 习题 11
    • 习题 12
    • 习题 13
    • 习题 14---作业
      • 作业
    • 习题 15
    • 习题 16
    • 习题 17
        • 作业
    • 习题 18
    • 习题 19
    • 习题 20
    • 习题 21

笔记

地址指向该变量单元,将地址形象化地称为“指针”。

在程序中一般是通过变量名来引用变量的值。

  • 直接按变量名进行的访问,称为“直接访问”方式。
  • “间接访问”的方式,即将变量的地址存放在另一变量(指针变量)中,然后通过该指针变量来找到对应变量的地址,从而访问变量。

指针定义:

类型名 *指针变量名;

左端的int是在定义指针变量时必须指定的**“基类型”。**

在定义指针变量时要注意:

  • (1) 指针变量前面的“”表示该变量为指针型变量。指针变量名则不包含“”。
  • (2)在定义指针变量时必须指定基类型。一个变量的指针的含义包括两个方面,一是以存储单元编号表示的纯地址(如编号为2000的字节),一是它指向的存储单元的数据类型(如int,char,float等)。
  • (3) 如何表示指针类型。指向整型数据的指针类型表示为“int *”,读作“指向int的指针”或简称“int指针”。
  • (4) 指针变量中只能存放地址(指针),不要将一个整数赋给一个指针变量。
int a, *p;
p=&a;				//把a的地址赋给指针变量p														
printf("%d",*p);		//以整数形式输出指针变量p所指向的变量的值,即a的值							
*p=1;				//将整数1赋给p当前所指向的变量,由于p指向变量a,相当于把1赋给a,即a=1	②
printf("%o",p);		//以八进制形式输出指针变量p的值,由于p指向a,相当于输出a的地址,即&a	③

都可以存放在同一个指针变量中的,只有与指针变量的基类型相同的数据的地址才能存放在相应的指针变量中。

void *指针是一种特殊的指针,不指向任何类型的数据。如果需要用此地址指向某类型的数据,应先对地址进行类型转换。


指针运算
① 指针变量加(减)一个整数。

p++;		//将该指针变量的原值(是一个地址)和它指向的变量所占用的存储单元的字节数相加

② 指针变量赋值。将一个变量地址赋给一个指针变量。 不应把一个整数赋给指针变量。

p=&a; 		//将变量a的地址赋给p
p=array; 	//将数组array首元素地址赋给p
p=&array[i];	//将数组array第i个元素的地址赋给p
p=max;		//max为已定义的函数,将max的入口地址赋给p
p1=p2;		//p1和p2是基类型相同指针变量,将p2的值赋给p1

③ 两个指针变量可以相减。如果两个指针变量都指向同一个数组中的元素,则两个指针变量值之差是两个指针之间的元素个数。

④ 两个指针变量比较。若两个指针指向同一个数组的元素,则可以进行比较。指向前面的元素的指针变量“小于”指向后面元素的指针变量。如果p1和p2不指向同一数组则比较无意义。

通过指针引用数组

所谓数组元素的指针就是数组元素的地址。可以用一个指针变量指向一个数组元素。

int *p=&a[0];   ==   int *p=a;

用数组名作函数参数
int main()
{	void fun(int arr[], int n);	//对fun函数的声明
	int array[10];			//定义array数组
	   ⋮
	fun(array,10); 			//用数组名作函数的参数
	return 0;
} 
void fun(int arr[], int n) 		//定义fun函数
{
	   ⋮
}

array是实参数组名,arr为形参数组名。当用数组名作参数时,如果形参数组中各元素的值发生变化,实参数组元素的值随之变化。

在该函数被调用时,系统会在fun函数中建立一个指针变量arr,用来存放从主调函数传递过来的实参数组首元素的地址

以变量名和数组名作为函数参数的比较

例题 例题5 【例8.6】

有一个整型数组a,有10个元素,要求输出数组中的全部元素

#include 
int main()
{	int a[10];
	int *p,i;
	printf("please enter 10 integer numbers:");
	for(i=0;i<10;i++)
		scanf("%d",&a[i]);
	for(p=a;p<(a+10);p++)
		printf("%d ",*p);
	//用指针指向当前的数组元素
	printf("n");
	return 0;
}
【例8.7】

通过指针变量输出整型数组a的10个元素

#include 
int main()
{	int i,a[10],*p=a;	//p的初值是a,p指向a[0]
	printf("please enter 10 integer numbers:");
	for(i=0;i<10;i++)
	scanf("%d",p++);
	p=a;				//重新使p指向a[0]
	for(i=0;i<10;i++,p++)
	printf("%d ",*p);
	printf("n");
	return 0;
}
【例8.8】

将数组a中n个整数按相反顺序存放。

#include 
int main()
{	void inv(int *x,int n);
	int i,a[10]={3,7,9,11,0,6,7,5,4,2};
	printf("The original array:n");
	for(i=0;i<10;i++)
		printf("%d ",a[i]);
	printf("n");
	inv(a,10);
	printf("The array has been inverted:n");
	for(i=0;i<10;i++)
		printf("%d ",a[i]);
	printf("n");
	return 0;
}

void inv(int *x,int n)			//形参x是指针变量
{	int *p,temp,*i,*j,m=(n-1)/2;
	i=x; j=x+n-1; p=x+m;
	for(;i<=p;i++,j--)
	{	temp=*i; *i=*j; *j=temp;}	//*i与*j交换
	return;
}
例题 10
#include
int main()
{
	void pop(int *arr,int len);
	int arr[10] = {4,3,5,7,9,2,1,6,8,10};
	int *p = arr;
	printf("排序前n");
	for(p=arr;p 
【例8.30】 

建立动态数组,输入5个学生的成绩,另外用一个函数检查其中有无低于60分的,输出不合格的成绩。

课后习题

本章习题均要求使用指针方法处理。

习题 1

输入3个整数,要求按由小到大的顺序输出。

#include

int main()
{
	void swap(int*,int*);
	int a,b,c ;
	
	int *p=&a,*q=&b,*t=&c;
	printf("请输入三个数");
	scanf("%d,%d,%d",&a,&b,&c);
	if(*p<*q)
	{
		swap(p,q);
	}
	if(*p<*t)
	{
		swap(p,t);
	}
	if(*q<*t)
	{
		swap(q,t);
	}
	printf("%d,%d,%d",*p,*q,*t);
	return 0; 
}

void swap(int*a,int*b)
{
	int temp = *a;
	*a = *b;
	*b = temp; 
}
习题2

输入3个字符串,要求按由小到大的顺序输出

字符串的比较可以使用strcmp函数,返回值>0表示大于,返回值小于0表示小于,返回追等于0表示相同。其他的比较排序思路与数字的排序交换没有区别,逐个进行比较先找出最大的,然后找出第二大的。

#include
#include
int main()
{
	char str[3][50];
	char *p[3],*temp;
	int i,j;
	printf("please enter ");
	for(i=0;i<3;i++)
	{
		p[i] = str[i];
		gets(p[i]);
	}
	for(i=0;i<2;i++)
	{
		for(j=i+1;j<3;j++)
		{
			if(strcmp(p[i],p[j])>0)
			{
				temp = p[i];
				p[i] =  p[j];
				p[j] = temp;
			}
		}
	}
	printf("%s %s %sn", p[0], p[1], p[2]);
}
习题 3

输入10个整数,将其中最小的数与第一个数对换, 把最大的数与最后一个数对换

①输人10个数;
②进行处理;
③输出10个数。

解题思路: 在进行数值逐个比较的同时找到最小值的空间地址以及最大值的空间地址,使用这两个空间中的数据最终与第一和最后数据进行对换即可。

要注意覆盖问题!!!

方法1 普通指针

输出函数

void input(int *array,int len)
{
	int *m;
	for(m=array,printf("enter 10 numn");m 

交换函数(没有问题)

void handble(int *array,int len)
{
	// 最小值 
	int *i,*j,*min,*man,t;
	for(i=array,min = i;i*j?min=j++:j++)
	t = *min;
	*min=*array; 
	*array = t;
	
	// 最大值
	for(i=array+1,max = i;i 

输出函数

void print(int *array, int len)

{
	int *i;
	for(i=array,printf("SORT BY :");i 

交换函数(有问题)

void handble(int *array,int len)
{
	int max = array[0],min = array[9];
	int *maxp = NULL,*minp = NULL;
	int i;
	for(i=1;iarray[i])
		{
			min = array[i];
			minp = &array[i];
		}
		if(max 
方法2:(利用动态内存分配) 
	int *array;
	array = (int*)malloc(10*sizeof(int));
作业
#include
int main()
{
	void handble(int *array,int len);
	int array[10]= {9,7,5,3,10,8,6,4,1,2};
	int *i;
	printf("对换前:n");
	for(i=array;i*j)?min=j++:j++);
	}
	t = *min;
	*min = *array;
	*array=t;
	
	for(i=array+1,max=i;i 
习题 4 作业 

.有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,见图8.43。 写一函数实现以上功能,在主函数中输人n个整数和输出调整后的n个数。

双指针搬运

for(p=a,q=b;p<=(a+n-m);p++,q++);
指针
#include
#include
#include

int main()
{
	void move(int *array,int n,int m);
	int number[50],n,m,i,j;
	
	printf("Please enter the number of numbers: ");
	scanf("%d", &n);//先确定要输入多少个数字
	
	printf("Please enter %d numbers: ", n);
	for (i = 0; i < n; i++) {
		scanf("%d", &number[i]);//输入指定个数的数字
	}
	
	printf("Number of positions to move: ");
	scanf("%d", &m);//确定要向后移动多少个位置
	
	move(number,n,m);
	
	for (i = 0; i < n; i++) {
		printf("%d ", number[i]);
	}
	printf("n");
	return 0;
}

void move(int *array,int n,int m)
{
	int end = n-m;
	int i,j;
	for(i=0;ii;j--)
		{
			*p = *(p-1);
			p--;
		}
		*(array+i) = tmp;
	}
}
递归
#include

int* move(int str[],int n,int m)
{
	int *p,str_end;
	
	if(m>0) 
	{
		str_end=*(str+n-1);
		for(p=str+n-1;p>str;p--)
			*p=*(p-1);      // 每个都后移一位 
		*p=str_end;
		
		m--;
	}
		
	if(m>0)
		move(str,n,m); //递归,循环后移 
	else
		return p;
}

int main()
{
	int a[20],i,m,n;
	scanf("%d %d",&n,&m);
	for(i=0;i 
链表 
队列 
习题 5 

有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

解题思路: 从第一个人开始,逐个报数,谁报3就退出,并且重置报数,直到最后一个人后,又重新从第一个人继续报数,直到最终只剩一个人的时候退出即可。

#include
#include
#include

int main()
{
	int pep[128],n,i;
	printf("Please input how many people: ");
	scanf("%d",&n);
	for(i=0;i1)   //直到还剩一个人为止 
	{
		p = pep;
		while(p!=pep+n)   // 当没有转完一圈 
		{
			if((*p)!=0)   //若这个位置人还在
			{
				off++;  //报数 
				if(off==3)  //否则当前的人即将要报的数字是3
				{
					*p=0;   //则剔除这个人
					off=0;  //并且重新开始计数,下边会++,所以是从1开始报数
					remain--;
				}
			}
			p++;  
		}
	
	} 
	
	for(i=0;i 
链表 
队列 
习题 6 

写一函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。

#include
#include
#include

int main()
{
	int mystrlen( char *str);
	char buff[100];
	printf("Please enter a string: ");
	gets(buff);
	printf("string len:%dn", mystrlen(buff));
	return 0;
}

int mystrlen( char *str){
	int len =0;
	char *ptr = str;
	while(*ptr!='')
	{
		ptr++;
		len++;
	}
	return len;
}
作业
#include 
int main()
{
	int my_strlen(char *str);
	char str[1000];
	printf("Please enter a string: ");
	gets(str);
	printf("string len:%dn", my_strlen(str));
	return 0;
}
int my_strlen(char *str)
{
	int len = 0;
	char *ptr = str;
	while (*ptr != '') {
		ptr++;
		len++;
	}
	return len;
}

习题 7

有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。

#include
#include
#include

int main()
{
	char* mycmp(char *str  ,int m);
	char str1[1024], *len=NULL;
	int m;
	printf("Please enter a string: ");
	gets(str1);
	printf("Please enter a location to start copying: ");
	scanf("%d",&m);
	if(m<0||m>strlen(str1))
	{
		printf("Illegal location enteredn");
		return -1;
	}
	else
	{
//		mycmp(str1,m);
		len = mycmp(str1,m);
		puts(len);
		return 0;
	}
}
char* mycmp(char *str  ,int m){
	
	char str2[100];
	char *ptr  = str+m;
	char *ptr2 = str2;
	while(*ptr !='')
	{
		*ptr2++ = *ptr++;
	 } 
	 *ptr2 = '';  //不要忘了字符串结尾标志
//	puts(str2);
	return str2;
}
习题 8

输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符各有多少。

#include
#include
#include

int main()
{
	char str[100];
	printf("please enter a string");
	gets(str);
	int upper = 0,lower = 0,digit =0,space = 0,other = 0;
	char *ptr = str;
	while(*ptr!='')
	{
		if(*ptr>='a'&&*ptr<='z'){
			upper++;
		}
		else if (*ptr>='A'&& *ptr<='Z'){
			lower++; 
		}
		else if(*ptr>='0'&&*ptr<='9')
		{
			digit++;
		}
		else if(*ptr==' '){
			space++;
		}
		else{
			other++;
		}
		ptr++;
		
	}
	printf("upper:%d; lower:%d; digit:%d; space:%d; other:%dn", 
		upper, lower, digit, space, other);
}
习题 9

写一函数,将一个3x3的整型矩阵转置。

解题思路: 矩阵转置就是行变列,列变行,说白了就是 arry[i][j] 转换为 arry[j][i] ; 但是需要注意的是,

一. 因为行列个数可能并非相同,转换后行数或者列数变多了或者变少,因此不能直接转换。需要重新申请空间存储转换后的数据。

二. 二维数组是线性扁平化存储的,无法确定列数的情况下传参后,在函数中使用时需要头指针向后偏移 列数*第n行 才能访问到第n行的数据。例如在函数中访问 arry[i][j] ,需要通过arry + col_num*i + j 方式进行访问。

指针法
#include 
int main()
{
	void trans(int (*p)[3],int x ,int y);
	int a[3][3] = {1,2,3,4,5,6,7,8,9};
	int i,j;
	trans(a,3,3);
	for(i=0;i<3;i++)
	{
		for(j=0;j<3;j++)
		{
			printf("%dt",*(*(a+i)+j));
		}
		printf("n");
	}
	
}
void trans (int (*s)[3],int x,int y)
{
	int i,j,t;
	for(i=0;i 
动态内存法 
习题 10 

将一个5x5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下依次从小到大存放),写一函数实现之。用main函数调用。

作业 将运用数组改为运用指针解决问题,同时起气泡和选择法 起泡法

二维数组转成一维数组;

对一维数组进行指针法排序

一维数组转成二维数组

#include 
int main()
{
	void max(int *x,int *y);
	void min(int *a,int x,int y);
	void pop(int *a,int x,int y);
	void print(int *a,int x,int y); 
	
	int a[5][5] = {{1,2,4,3,5},{6,7,9,8,11},{10,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25}};
	int x=5,y=5;
	printf("")
	print(*a,5,5);
	pop(*a,5,5);
	print(*a,5,5);
	max(*a+x*y-1,*a+x*y/2);
	min(*a,x,y);
	print(*a,5,5);
	return 0;
}

void pop(int *a,int x,int y)
{
	int i,j,temp;
	for(i=0;i*(a+j+1))
			{
				temp = *(a+j);
				*(a+j) = *(a+j+1);
				*(a+j+1) = temp;
			}
		}
	}	
}

void print(int *a,int x,int y)
{
	int i;
	for(i=0;i 
1       2       4       3       5
6       7       9       8       11
10      12      13      14      15
16      17      18      19      20
21      22      23      24      25

1       2       3       4       5
6       7       8       9       10
11      12      13      14      15
16      17      18      19      20
21      22      23      24      25

1       5       21      13      2
6       7       8       9       10
11      12      25      14      15
16      17      18      19      20
3       22      23      24      4

选择法
void select(int *a,int x,int y)
{
	int i,j,k,temp;
	for(i=0;i 
习题 11 

在主函数中输入10个等长的字符串。用另一函数对它们排序。然后在主函数输出这10个已排好序的字符串。

解题思路: 排序方式与数字比较没什么不同,先遍历比较找出最大的字符串,与第一个字符串进行交换,然后剩下的进行比较找出最大的字符串与第二个交换…

需要主机的就是字符串的比较采用strcmp接口,返回值大于0表示第一个字符串大于第二个字符串

#include
#include
#include

int main()
{
	void sort(char s[10][50]);
	char str [10][50];
	printf("Please enter ten strings:n");
	int i;
	for(i=0;i<10;i++)
	{
		gets(str[i]);
	}
	sort(str);
	printf("n");
	for(i=0;i<10;i++)
	{
		puts(str[i]);
	}
	return 0;
}

void sort(char s[10][50])
{
	int i,j;
	for(i=0;i<9;i++)
	{
		for(j=i+1;j<10;j++)
		{
			if(strcmp(s[i],s[j])>0)
			{
				char tmp[50];
				strcpy(tmp,s[i]);
				strcpy(s[i],s[j]);
				strcpy(s[j],tmp);
			}
		}
	}
}
习题 12

用指针数组处理上一题目,字符串不等长

#include
#include
#include

int main()
{
	void sort(char *s[10]);
	char *str[10];
	printf("Please enter ten strings:n");
	int i;
	for(i=0;i<10;i++)
	{
		str[i] = (char*)malloc(sizeof(char));//为每一个指针分配空间
		gets(str[i]);
	}
	sort(str);
	printf("n");
	for(i=0;i<10;i++)
	{
		puts(str[i]);
	}
	return 0;
}

void sort(char *s[10])
{
	int i,j;
	for(i=0;i<9;i++)
	{
		for(j=i+1;j<10;j++)
		{
			if(strcmp(s[i],s[j])>0)
			{
				char *tmp = s[i]; //指针的好处在于直接通过赋值可以改变指向
				s[i] = s[j]; 
				s[j] = tmp;
			}
		}
	}
}
习题 13 习题 14—作业

将n个数按输入时顺序的逆序排列,用函数实现。

#include
#include
#include

int main()
{
	void rerand(int *array,int n);
	int array[10];
	printf("Please enter ten numbers:");
	for (int i = 0; i < 10; i++) {
		scanf("%d", &array[i]);
	}
	rerand(array,10);
	for (int i = 0; i < 10; i++) {
		printf("%d ", array[i]);
	}
	return 0;
 } 
 
void rerand(int *array, int n)
{
	int *start = array;
	int *end = array+n-1;
	for(;start 
作业 
#include
//#include
//#include

int main()
{
	void rerand(int *array,int n);
	int array[10] = {1,3,5,2,4,6,8,10,7,9},i;
	rerand(array,10);
	for ( i = 0; i < 10; i++) {
		printf("%d ", array[i]);
	}
	return 0;
 } 
void rerand(int *array, int n)
{
	int temp;
	int *start = array;
	int *end = array+n-1;
	for(;start 
习题 15 

有一个班4个学生,5门课程。
①求第1门课程的平均分;
②找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均成绩;
③找出平均成绩在90分以上或全部课程成绩在85分以上的学生。
分别编3个函数实现以上3个要求。

4个学生,5门课程就是一个4x5的二维数组,

求第一门课的平均分,就是将第0列数据相加除以学生人数
遍历每个学生的成绩,判断不及格次数,若大于2则输出信息即可
统计每个学生总成绩,以及对每门课程成绩进行判断即可

#include
#include
#include

int main()
{
	void avg(int array[][5],int n);
	void fail(int array[][5],int n);
	int exce(int array[][5],int n);
	int i,j;
	int array[4][5];
	printf("Please enter a 4x5 matrix:n");
	for (i = 0; i < 4; i++) {
		for (j = 0; j < 5; j++) {
			scanf("%d", &array[i][j]);
		}
	}
	avg(array,4);
	fail(array,4);
	exce(array,4);
	return 0;
}

void avg(int array[][5],int n)
{
	double sum = 0;
	int i;
	for(i=0;i85)
				count++;
		}
		if((sum/n)>90||count==5)
			printf("Excellent students: %dn", i + 1);
	}
}
习题 16

输入一个字符串,内有数字和非数字字符,例如:A123x456 17960? ,302tab5876,将其中连续的数字作为一个整数,依次存放到一数组a中。例如,123放在a[0],456放在a1[1]…统计共有多少个整数,并输出这些数。

遇到数字字符,则开始统计连续数字字符的个数,统计完毕后,则从右往左每次乘以10(除了个位数)作为数字的单位,最终相加得到数字;然后越过这个数字,从后边继续查找。

#include
#include
int main()
{
	void strfun(char*str);
	char str[] = "A12345Bcd4567ef891";
	strfun(str);
	return 0; 
}
void strfun(char *str)
{
	int trans(char *str,int i);
	char *ptr =str;
	char str1[100] = {''};
	int num[50],i=0,j=0;
	while(*ptr !='')
	{
		// 如果指向的是数字 
		if(*ptr>='0'&& *ptr<='9')
			// 如果是数字的末尾 
			if(*(ptr+1)<'0'||*(ptr+1)>'9')
			{
//				printf("nptr = %cn",*ptr);
				str1[i] = *ptr;
//				puts(str1);
				// str1 的长度为i+1 
				num[j++] = trans(str1,i+1) ;
				printf("n num =%dn",num[j-1]); 
				i=0;   				// 重置i 
				ptr++;
			 } 
			else 
			{
//				printf("nptr = %cn",*ptr);
				str1[i++] = *ptr++;
			}
		else
		{
//			printf("nptr = %cn",*ptr);
			ptr++;// 下一个 
		}		
	}		
//	输出,其中j为整数个数 
	printf("一共有%d个数字n",j); 
	for(;j>0;j--)
		printf("%dt",num[j-1]);
}
//字符型变整数 
int trans(char *str,int i)
{
	int num=0; 
	char *p = str;
	while(i--)
	{
		num = num*10 + ((*p++)-'0');
	}
	return num;	
}
习题 17

写一函数,实现两个字符串的比较。即自己写一个strcmp函数,函数原型为int strcmp(char * p1 ,char * p2); 设p1指向字符串s1, p2指向字符串s2。要求当s1=s2时,返回值为0;若s1≠s2,返回它们二者第1个不同字符的ASCII码差值(如"BOY"与"BAD" ,第2个字母不同,0与A之差为79- 65=14)。如果s1>s2,则输出正值;如果s1

#include
int main()
{
	int my_strcmp(char *str1,char *str2);
	char str1[100],str2[100];
	gets(str1);
	gets(str2);
	puts(str1);
	puts(str2);
	printf("ans = %d",my_strcmp(str1,str2));
	return 0;
}

int my_strcmp(char *str1,char *str2)
{
	char *p1 = str1,*p2 = str2;
	int num=0;
	while(*p1!=''&&*p2!='')
	{
		if(*p1!=*p2)
		{
			num = (*p1-*p2);
			break;
		}
		p1++;
		p2++;
	}
	
	// 同时指向末尾 
	if(*p1 == '' || *p2=='')
	{
		num = *p1-*p2;
	}
	return num;
}
作业
#include
int main()
{
	int my_strcmp(char *str1,char *str2);
	char str1[100],str2[100];
	gets(str1);
	gets(str2);
	printf("差值是= %d",my_strcmp(str1,str2));
	return 0;
}
int my_strcmp(char *str1,char *str2)
{
	char *p1 = str1,*p2 = str2;
	int num=0;
	while(*p1!=''&&*p2!='')
	{
		if(*p1!=*p2)
		{
			num = (*p1-*p2);
			break;
		}
		p1++;
		p2++;
	}
	// 同时指向末尾 
	if(*p1 == '' || *p2=='')
	{
		num = *p1-*p2;
	}
	return num;
}
习题 18

编一程序,输入月份号,输出该月的英文月名。例如,输人3,则输出"March" ,要求用指针数组处理。

字符串指针
month 是一个含有12个指针的。指针指向字符串,的字符串指针数组

month[2]是一个指针,这个指针指向February

c语言入门 第十六章 指针和字符串(指针数组)

int main()
{
	int month;
	char *Month[12] = { "January","February","March","April","May","June",
	"July","August","September","October","November","December" };
	while (1) {
		printf("Please enter the month: ");
		scanf("%d", &month);
		if (month < 1 && month>12) {
			printf("Input error, Month should be greater than 0 and less than 12n");
		}
		printf("%sn", Month[month - 1]);
	}
	return 0;
}

方法二

#include 

int main()
{
	int n;
	char *Month[12] = {"January","February","March","April","May","June","July","August","September","October","November","December"};
	printf("请输入月份:n");
	scanf("%d",&n);
	printf("英文是:%sn",*(Month + n - 1));
//	printf("英文是:%sn",(Month + n - 1));
}
习题 19

(1) 编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针(地址),指向字符串开始的空间。new(n)表示分配n个字节的内存空间。

(2)写一函数free,将前面用new函数占用的空间释放。free§表示将p(地址)指向的单元以后的内存段释放。

#include
#include
#include

int main()
{
	void *NEW(int n);
	void FREE(char *p);
	int num;
	char *str = NULL;
	printf("Please enter number: ");
	scanf("%d", &num);
	printf("before new p--%p:%sn", str, str);//申请空间之前,查看指针的地址和指向空间数据
	str = (char*)NEW(num);
	printf("after new p--%p:%sn",str,str);
	printf("Please enter a string:n");
	scanf("%s", str);
	printf("before free p--%p:%sn", str, str);//释放空间之前,查看指针的地址和指向空间数据
	FREE(str);
	printf("after free p--%p:%sn", str, str);//释放空间之后,查看指针的地址和指向空间数据
	return 0;
}

void *NEW(int n)
{
	return malloc(n);
}
void FREE(char *p)
{
	return free(p);
}
习题 20

用指向指针的指针的方法对5个字符串排序并输出。

指向指针的指针其实就是二级指针,使用二级指针的保存一级指针的地址,让这个一级指针指向具体的数据空间; 定义一个字符串指针数组包含5个元素,每个元素可以保存一个字符串的首地址,而这个地址指向的是具体的字符串数据空间,通过指针访问实现对指向空间内的字符串进行比较排序交换即可。

习题 21

用指向指针的指针的方法对n个整数排序并输出。要求将排序单独写成一个函数。n个整数在主函数中输入,最后在主函数中输出

指向指针的指针其实就是二级指针,使用二级指针的保存一级指针的地址,让这个一级指针指向具体的数据空间。排序就是按照每个元素指针指向空间中的数据进行比对排序即可。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5692000.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存