PTA:C课程设计(5)

山东大学(威海)2022级大一下C习题集(5)

  • 函数题
    • 5-6-1 求一组数中的平均值及最大值
    • 5-6-2 判断满足条件的三位数
    • 5-6-3 函数实现字符串逆序
    • 5-6-4 查找子串
    • 5-6-5 计算最长的字符串长度
    • 5-6-6 二分查找
  • 编程题
    • 5-7-1 找最长的字符串
    • 5-7-2 藏头诗
    • 5-7-3 英文单词排序

函数题

5-6-1 求一组数中的平均值及最大值

接口:

float Fun(  int *p, int n,int *max);

其中 p、n、max 都是用户传入的参数。函数求数组中n个元素的平均值、最大值。最大值通过max带回,函数返回平均值 。

float Fun( int *p, int n,int *max)
{
    float sum = 0.0,ave = 0.0;
    int i  = 0;
    *max = 0;
    for(i = 0;i<n;i++)
    {
        sum += *(p+i);
        if(*(p+i) > *max)
            *max = *(p+i);
    }
    ave = 1.0*sum/n;
    return ave;
}

5-6-2 判断满足条件的三位数

接口:

int search( int n );

统计给定区间内的三位数中有两位数字相同的完全平方数(如144、676)的个数。

其中传入的参数int n是一个三位数的正整数(最高位数字非0)。函数search返回[101, n]区间内所有满足条件的数的个数。

int Jud(int i)
{
    int a,b,c;
    a = i%10;
    i/=10;
    b = i%10;
    i/=10;
    c = i%10;
    if((a==b&&b!=c)||(a==c&&b!=c)||(c==b&&c!=a))
        return 1;
    else
        return 0;
}
int J2(int i)
{
    int j = 10;
    for(;j<40;j++)
    {
        if(j*j==i)
            return 1;
    }
    return 0;
}
int search( int n )
{
    int i = 101;
    int count = 0;
    for(;i<=n;i++)
    {
        if(Jud(i)&&J2(i))
            count++;
    }
    return count;
}

5-6-3 函数实现字符串逆序

接口:

void f( char *p );

函数f对p指向的字符串进行逆序操作。要求函数f中不能定义任何数组,不能调用任何字符串处理函数。

void f( char *p )
{
    char t;
    int n = 0;
    char *tt = p;
    while(*tt!='\0')
    {
        n++;
        tt++;
    }
    
    for(int i = 0;i<n;i++)
    {
        char * t1 = p;
        for(int j = 0;j<n-i-1;j++)
        {
            t = *t1;
            *t1 = *(t1+1);
            *(t1+1) = t;
            t1++;
        }
    }
}

5-6-4 查找子串

接口:

char *search( char *s, char *t );

函数search在字符串s中查找子串t,返回子串t在s中的首地址。若未找到,则返回NULL

char *search( char *s, char *t )
{
    char *pos = s;
    char *s1 = s;
    char *s2 = t;
    if(*t=='\0')
    {
        return s;
    }
    
    while(*pos!='\0')
    {
        s1= pos;
        s2 = t;
        while(*s1 == *s2&& *s2 != '\0')
        {
            s1++;
            s2++;
        }
        if(*s2== '\0')
            return pos;
        pos++;
    }
    return NULL;
}

5-6-5 计算最长的字符串长度

接口:

int max_len( char *s[], int n );

实现一个函数,用于计算有n个元素的指针数组s中最长的字符串的长度。
其中n个字符串存储在s[]中,函数max_len应返回其中最长字符串的长度。

int max_len( char *s[], int n )
{
    int max = 0;
    int i =0 ;
    for(i = 0;i<n;i++)
    {
        if(strlen(s[i])>max)
            max = strlen(s[i]);
    }
    return max;
}

5-6-6 二分查找

接口:

int Search(int *p, int n, int k,int *Count);

实现一个函数,该函数采用二分查找法从一个已经升序排序的数组中,查找某个数k。如果找到k, 输出k所在的数组下标(0~n-1)及比较次数。若k不存在,输出-1和比较次数。

其中 p为数组首地址,n为数组长度,k为待查找的数, *Count为比较次数。
函数返回值:如果k在数组中返回其下标值,没找到返回-1。

int Search(int *p, int n, int k,int *Count)
{
    int left = 0,right = n-1,mid;
    int i = 0;
    *Count = 0;
    while(left<=right)
    {
        mid = (left+right)/2;
        (*Count)++;
        if(*(p+mid)<k)
        {
            left = mid+1;
        }
        else if(*(p+mid)>k)
        {
            right = mid-1;
        }
        else
        {
            return mid;
        }
        
    }
        return -1;
}

编程题

5-7-1 找最长的字符串

PTA:C课程设计(5)_第1张图片

#include
#include
int main()
{
    int n;
    scanf("%d",&n);
    char c[1200][90] ={0};
    int max = 0,i,x;
    int len[1200] = {0};
    for(i = 0;i<n;i++)
    {
        scanf("%s",c[i]);
        len[i] = strlen(c[i]);
        if(len[i]>max)
        {
            max = len[i];
            x = i;
        }
    }
    printf("The longest is: %s",c[x]);
    return 0;
}

5-7-2 藏头诗

PTA:C课程设计(5)_第2张图片
注意这里规定一个汉字占三字节

#include
int main()
{
    char c[4][26] = {0};
    char pr[13] = {0};
    for(int i = 0;i<4;i++)
    {
        scanf("%s",c[i]);
    }
    for(int j = 0;j<4;j++)
    {
        for(int k = 0;k<3;k++)
        {
            pr[3*j+k] = c[j][k];
        }
    }
    pr[12] = '\0';
    printf("%s",pr);
    return 0;
}

5-7-3 英文单词排序

PTA:C课程设计(5)_第3张图片

#include
#include
int main()
{
    char c[20][20] = {0};
    char t[18] = {0};
   	int i=0,j = 0,k = 0;
	while(1)
	{
		scanf("%s",c[i]);
		if(c[i][0]=='#')
			break;
		i++;
	}
    for(j=0;j<i-1;j++)
		for(k=0;k<i-j-1;k++)
			if(strlen(c[k])>strlen(c[k+1]))
			{
				strcpy(t,c[k]);
				strcpy(c[k],c[k+1]);
				strcpy(c[k+1],t);		
			}

    for(j=0;j<i;j++)
		printf("%s ",c[j]);
    return 0;
}

你可能感兴趣的:(PTA大一下习题集,c语言,算法,开发语言)