bupt2021秋季计算导论第十三次实验

bupt2021秋季计算导论第十四次实验

函数题

英超一

实验10_1_英超一 (100 分)
英格兰足球超级联赛(Premier League),通常简称“英超”,是英格兰足球总会属下的最高等级职业足球联赛。

英超联赛采取主客场双循环赛制比赛,每支队伍与各球队对赛两次,主客各一次。由1995/96赛季开始参赛球队由22队减至20队,每支球队共进行38场赛事,主场和客场比赛各有19场。每场胜方可得3分,平局各得1分,负方得0分,按各队于联赛所得的积分排列。

现请你写一个函数来计算某支球队的当前的积分。

输入:

只有一行,为一个字符串。该字符串包含不多于40个字符,每个字符代表该队一轮比赛的结果。字符串中只包含W(代表该队某轮取胜)、D(代表该队某轮和对手打平)和L(代表该队某轮失利)三种字符。

输出:

只有一个整数,为根据输入数据,计算出的该队当前的积分。

函数接口定义:
int getScore(char * s) ;
其中 s 为用户传入的参数,为指向某队当前的全部赛果的指针。函数须返该队当前积分。

裁判测试程序样例:
#include <stdio.h>

#define MAX 48

int getScore(char * s) ;

int main()
{
char input[MAX] ;
int score ;

scanf("%s",input);
score = getScore(input) ;
printf("%d\n",score) ;

return 0;

}

/* 请在这里填写答案 */
输入样例:
WDWWWWWWWWWWWWWWWWWWDWLWWDWWWWWLWWWDWW
输出样例:
100

int        getScore(char * s)
{
	int a[3]= {0} ;
    int i = 0;
    while (*(s+i) != '\0')
    {
    	if(*(s+i) == 'W')
		{
			a[0] ++ ;
		}
		else if(*(s+i) == 'D')
			{
				a[1] ++ ;
			}
			else if (*(s+i) == 'L')
				{
					a[2] ++ ;
				}
		i ++ ;
	}
    int sum = 0 ;
    sum = sum + a[0] *3 + a[1] * 1 + a[2] * 0;
    return sum ;
}

动态分配内存函数——1

实验10_2_动态内存分配函数_1 (100 分)
1、设计函数int * create(int n) ;,根据整数n创建一个长度为n的整型动态一维数组,并返回动态数组第一个元素的地址。

2、设计函数 void cal(int * array, int size) ;该函数可计算array 所指向的动态一维数组中存储的size个整数的和及平均值,同时寻找其中的最大值、最小值。

输入共两行,第一行为一个整数n(0<n<100)。第二行为n个用空格分隔的整数。第一行在主函数中输入,第二行需在函数cal中输入,并存储在 array 所指向的动态一维数组中。

输出共5行,前四行依次为和、平均值(精确到小数点后两位)、最大值、最小值。最后一行按原样输出输入的那n个整数。前四行需在函数cal中输出,最后一行由主函数输出。

测试数据保证所有整数可以用int型存储。出题者存储浮点数时用的是 float。

函数接口定义一:
int * create(int n) ;
其中 n 为整数数组的长度; 函数需返回动态数组第一个元素的地址。如果没有获得内存则返回NULL。

函数接口定义二:
void cal(int * array, int size) ;
其中 array 和 size 都是用户传入的参数。 array 为整数数组的首地址; size 是数组中所存储的整数的个数。函数没有返回值。

裁判测试程序样例:
#include<stdio.h>
#include<stdlib.h>

int * create(int n) ;
void cal(int * array, int size) ;

int main()
{
int * array , n , i ;

scanf( "%d", &n );

array = create(n) ;
if ( array == NULL )
    return -1 ; //这里的return是因为没有获得内存而直接结束程序。
     
cal( array, n) ;
for ( i = 0 ; i < n ; i++ )
{
    printf("%d" , *(array+i) ) ;
    if ( i == n - 1 ) printf("\n") ;
    else printf(" ") ;
}     

free(array) ;

return 0;

}

/* 请在这里填写答案 */
输入样例:
10
1 2 3 4 5 6 7 8 9 10
输出样例:
55
5.50
10
1
1 2 3 4 5 6 7 8 9 10

int * create(int n)
{
	int * p;
	p = (int *)malloc(sizeof(int) * n);
	return p ;
 } 
 
 
void cal(int * array, int size)
{
	int i;
	for (i = 0 ; i< size ;i ++)
	{
		scanf("%d" , array + i) ;
	}
    int sum = 0;
    for (i =0 ;i < size ;i ++)
    	{
    		sum = sum + *(array + i);
		}
	printf("%d\n", sum ) ;
	float average = 0.0 ;
	average = (float)(sum * 1.0 / size);
	printf("%.2f\n", average );
	int min = *(array + 0) ;
	int max = *(array + 0);
	for (i =0 ; i< size ; i++)
	{
		if (min > *(array + i))
		{
			min = *(array + i) ;
		}
		if (max < *(array + i))
		{
			max = *(array + i) ;
		}
	}
	printf("%d\n%d\n", max , min) ;
}

 
 

动态分配内存函数——2

实验10_3_动态内存分配函数_2 (100 分)
1、设计函数char ** create1(int n) ;,根据整数n创建一个长度为n的字符型指针动态一维数组,并返回动态数组第一个元素的地址。

2、设计函数void create2( char ** strPtr , int n ) ;,为字符型指针动态一维数组strPtr中的每一个元素创建一个长度为n+1字符型动态一维数组。参数n为字符型指针动态一维数组strPtr的长度。

3、设计函数void fill(char ** strPtr , int n) ;按要去将相应的字符填入二维动态数组strPtr中。具体格式见样例。

输入只有一行,为一个整数n(0<=n<=40)。

输出共2*n+1行,具体见样例。

函数接口定义一:
char ** create1(int n) ;
其中 n 是用户传入的参数,代表字符型指针动态一维数组的长度。 函数须返回动态数组第一个元素的地址。

函数接口定义二:
void create2( char ** strPtr , int n ) ;
其中 strPtr 和 n 都是用户传入的参数,strPtr 为指向字符型指针动态一维数组的指针;n 代表字符型指针动态一维数组的长度。 函数没有返回值。

函数接口定义三:
void fill(char ** strPtr , int n);
其中 strPtr 和 n 都是用户传入的参数,strPtr 为指向字符型指针动态一维数组的指针;n 要填充的字符的阶数,n阶时要填充2*n+1行,具体格式见样例。 函数没有返回值。

裁判测试程序样例:
#include<stdio.h>
#include<stdlib.h>

char ** create1(int n) ;
void create2( char ** strPtr , int n ) ;
void fill(char ** strPtr , int n) ;

int main()
{
int n, i, j;
char** strPtr ;

scanf("%d", &n );
strPtr = create1( n * 2 + 1 ) ;
create2( strPtr ,  n * 2 + 1 ) ;
fill(strPtr , n) ;

for (i = 0; i < 2 * n + 1; i++)
{
    printf("%s\n" , strPtr[i]);
}

for ( i = 0 ; i < n * 2 + 1 ; i++ )
    free(strPtr[i]) ;
free(strPtr) ;

return 0;

}

/* 请在这里填写答案 */
输入样例一:
1
输出样例一:
X
X X
X
输入样例二:
5
输出样例二:
X
/
/
/
/
X X
\ /
\ /
\ /
\ /
X
输入样例三:
8
输出样例三:
X
/
/
/
/
/
/
/
X X
\ /
\ /
\ /
\ /
\ /
\ /
\ /
X

char ** create1(int n) 
{
    char **p ;
    p =(char **)malloc(sizeof(char*) * n);
    return p ;
}


void create2( char ** strPtr , int n )
{
    int i;
    for(i = 0; i< n; i++)
    {
        strPtr[i] = (char *)malloc(sizeof(char) *(n+1));
    }

}


void fill(char ** strPtr , int n)
{
    // int num = (n-1)/2 ;
    // int i;
    // for ( i =0 ;i < n; i++)
    // {
    //     if ( i == 0|| i ==  2*num)//鑰冭檻棣栧熬
    //     {
    //         int j ;
    //         for ( j= 0; j < n ; j++)
    //         {
    //             if (j == num)
    //             {
    //                 **strPtr = 'X';
    //             }
    //             else {
    //                 **strPtr = ' ';
    //             }
    //         }
    //     }杩欎釜鍦版柟鎴戜笉寤鸿浣犺繖鏍锋€濊€冮棶棰橈紝鎴戝缓璁槸浣犳暟鏁版€诲叡鏈夊嚑琛岀劧鍚庣洿鎺ユ壘鍒板惊鐜粨鏉熺殑鏉′欢鍜宯鐨勫叧绯伙紝姣斿n,鎬昏鏁版槸2n+1
    int i,j;
    for(i = 0; i < 2*n+1; i++)
    {
        if( i == 0 || i ==  2*n)
        {
            for(j = 0; j<n; j++)
            {
                strPtr[i][j] = ' ';
            }
            strPtr[i][j] = 'X';//杩欎釜鍦版柟鏈€鍚庝竴娆$瓑浜庝簡n,鐩存帴璧嬪€煎氨琛?
        }
        else if(i >= 1 && i< n)
        {
            for(j = 0; j <=2* n + 1; j++)
            {
                if(j == n - i)
                {
                    strPtr[i][j] = '/';
                }
                else if(j == n + i)
                {
                    strPtr[i][j] = '\\';
                }
                else
                {
                    strPtr[i][j] = ' ';
                    
                }
            }
        }
        else if(i == n)
        {
            for (j =0 ;j < 2*n+1 ; j++)
            {
                if (j ==0 || j == 2*n)
                {
                    strPtr[i][j] = 'X';
                }
                else {
                    strPtr[i][j] = ' ';//杩欓噷鍗充娇浣犺鐢ㄥ湴鍧€璧嬪€间篃瑕佸姞涓婁笅鏍?
                }

            }
        }
        else if(i > n && i < 2*n)
        {
            for(j = 0; j <= 2*n + 1; j++)
            {
                if(j == i - n)
                {
                    strPtr[i][j] = '\\';
                }
                else if(j == 3*n - i)
                {
                    strPtr[i][j] = '/';
                }
                else
                {
                    strPtr[i][j] = ' ';
                    
                }
            }
        }

    }
}

设计函数locatesubstr

实验10_4_设计函数 locatesubstr (100 分)
设计函数 char *locatesubstr(char *str1,char *str2),查找str2指向的字符串在str1指向的字符串中首次出现的位置,返回指向该位置的指针。若str2指向的字符串不包含在str1指向的字符串中,则返回空指针NULL。 注意这里必须使用指针而不是数组下标来访问字符串。

函数接口定义:
char *locatesubstr(char *str1,char *str2);
其中 str1 和 str2 都是用户传入的参数,其含义如题面所述 。若查找成功则返回指向该位置的指针,若失败则返回空指针。

裁判测试程序样例:
#include <stdio.h>

char *locatesubstr(char *str1,char *str2);
int main()
{
char str1[505],str2[505];
char *p;
gets(str1);
gets(str2);
p=locatesubstr(str1,str2);

if(p==NULL)    printf("NULL!\n");
else    puts(p);

return 0;

}

/* 请在这里填写答案 */
输入样例:
didjfsd dabcxxxxxx
abc
输出样例:
abcxxxxxx

char *locatesubstr(char *str1, char *str2)
{
	int i;
	if (*str2 != '\0')
	{
		while (*str1 != '\0')
		{
			for (i = 0; *(str1 + i) == *(str2 + i); i++)
			{
				if (*(str2 + i + 1) == '\0')
					return str1;
			}
			str1++;
		}
		return NULL;
	}
	else
		return str1;
}

英超一

实验10_5_指针数组初步 (100 分)
已知一个总长度不超过10000的字符串,字符串中只包含大写字母“A—Z”、小写字母“a—z”和空格‘ ’。空格用于分割单词,空格的个数不超过1000个。你的任务是将字符串中用空格分隔的单词打印出来。 你要按照如下要求完成任务: 1.利用指针数组指向每个单词的开始位置。 2.把字符串中单词结束后的空格改为“\0”,然后使用指针数组将每个单词打印出来。

测试用例保证至少有一个单词。

函数接口定义:
int getString( char * source , char *strPtr[] ) ;
其中 source 和 strPtr 都是用户传入的参数。 source 为待处理字符串; strPtr 是保存各个单词开始位置的指针数组。函数返回值为单词的个数。

裁判测试程序样例:
#include<stdio.h>

int getString( char * source , char *strPtr[] ) ;

int main()
{
char str[100005];
char *strPtr[1005]={0};
int i, num ;

gets(str);
num = getString( str , strPtr ) ;
for( i = 0 ; i < num ; i++ )
    puts(strPtr[i]);

return 0;    

}

/* 请在这里填写答案 */
输入样例:
You are great
输出样例:
You
are
great

int getString(char *source, char *strPtr[]) {
    if (*source!=' '){
    strPtr[0] = source;}
    else{
        while (*source==' '){
            source++;
        }
        strPtr[0] = source;
    }
    int i = 1;
    while (*source != '\0') {
        if (*source == ' ') {
            *source = '\0';
            if (*(source + 1) != ' '&&*(source + 1) != '\0') {
                strPtr[i] = source + 1;
                i++;
            }
        }
        source++;
    }
    return i;
}

实验10_8_设计函数 void delcharfun(char *str,char ch) (100 分)
设计函数 void delcharfun(char *str,char ch)实现从字符串str中删除指定的字符ch。同一字母的大、小写按不同字符处理。

函数接口定义:
void delcharfun(char *str,char ch);
其中 str 和 ch 都是用户传入的参数。 str 为指向待删除数组的指针; ch 指定字符。函数没有返回值。

裁判测试程序样例:
#include<stdio.h>

void delcharfun(char *str,char ch);

int main()
{
char ch,str[110];

scanf("%s",str);    //读入字符串 
getchar();            //读取回车符号 
scanf("%c",&ch);    //读入字符 
delcharfun(str,ch);    //删除 
printf("%s\n",str);    //输出删除后结果 
return 0;    

}

/* 请在这里填写答案 */
输入样例:
abcABCabc#
b
输出样例:
acABCac#

编程题

二级目录

实验10_9_指针数组进阶 (100 分)
已知正整数n,n的范围是1—100。你要从键盘读入n个字符串,每个字符串的长度不确定,但是n个字符串的总长度不超过100000。你要利用字符指针数组将这n个字符串按照ASCII码顺序进行升序排序,然后再打印到屏幕上。字符串中可能包含ASCII码中的任意字符,每个字符串以换行符结束输入。

要求:不允许定义如char str[100][100000];这样的二维数组,因为会极大的浪费内存空间。你应定义char str[100000];这样的存储空间,将n个字符串连续的存储在一维字符空间内,然后将这n个字符串的起始位置保存在字符指针数组中,再进行排序操作。

输入格式:
输入一个正整数n,代表待排序字符串的个数,n不超过100,然后是n个字符串,每个字符串的长度不确定,但至少包含1个字符。n个字符串的总长度不会超过100000。

输出格式:
排序后的n个字符串,每个字符串占一行。

输入样例:
4
Where there is hope ,there is a way.
Welcome Beijing.
Nice idea.
Have fun.
输出样例:
Have fun.
Nice idea.
Welcome Beijing.
Where there is hope ,there is a way.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void sort(char *a[],int size);
int main()
{
	int n,i,j;
	char st[100000];
	char *ptr[100];
	ptr[0]=st;
	scanf("%d",&n);
	getchar();
	 
	for(i=0;i<n;i++)
	{
		gets(ptr[i]);
		if(i!=n-1)//当不为最后一项时 
		  ptr[i+1]=ptr[i]+strlen(ptr[i])+1;
//下一字符串的首地址等于现在字符串的首地址加字符串长度加1(还有'\0'存在) 
	}
	sort(ptr,n);
	for(i=0;i<n;i++)
	  puts(ptr[i]);
	return 0;
} 
void sort(char *a[],int size)//对字符指针数组进行排序 
{
	char *tempPtr;
	int i,j,min;//选择排序
	for(i=0;i<=size-2;i++)
	{
		min=i;
		for(j=i+1;j<=size-1;j++)
		{
			if(strcmp(a[min],a[j])>0)
			  min=j;
		}
		if(min!=i)
		{
			tempPtr=a[i];
			a[i]=a[min];
			a[min]=tempPtr;
		}
	 } 
}

动态数组进阶

实验10_10_动态数组进阶 (100 分)
已知正整数n,n的范围不确定。从键盘读入n个字符串,每个字符串的长度小于1000,要保存到动态数组中。为了能访问到所有的字符串,需要建立一个长度为n的动态指针数组,用于保存n个字符数组的内存地址。在读入每个字符串时,用一个长度为1000的字符数组作为缓冲数组,将字符串读入并求出长度后,再动态分配空间,将缓冲数组中的字符串复制到新分配的动态空间中,并将动态空间的首地址保存到指针数组中。读完n个字符串后你要将这n个字符串按照ASCII码顺序升序排序,然后再打印到屏幕上。字符串中可能包含大小写字母“A-Z”、“a—z”与空格字符。每个字符串以换行符结束输入。

输入格式:
输入一个正整数n,代表待排序字符串的个数。然后输入n个字符串,每个字符串至少包含一个字符,占一行。

输出格式:
排序后的n个字符串,每个字符串占一行。

输入样例:
10
Bb b
zzz zzz
aab bbccc
aaabbaaa
abb bbb
ccidfjD
Aidj idj
Ccidf jD
sidfjijE EE
kkkkkk
输出样例:
Aidj idj
Bb b
Ccidf jD
aaabbaaa
aab bbccc
abb bbb
ccidfjD
kkkkkk
sidfjijE EE
zzz zzz

#include <stdio.h>
#include<string.h>
#include <stdlib.h>
void pai(char str[],char *ptr[],int n);
void swap(char *m[],int n);
int main() {
    int n;
    scanf("%d",&n);
    char *s[n+10];
    char lin[1000];
    getchar();
    int m;
    for (int i = 0; i <n ; i++) {
        gets(lin);
        m=(int)strlen(lin)+1;
        s[i]=malloc(sizeof(char)*(m+10));
        for (int j = 0; j <m ; j++) {
            *(s[i]+j)=lin[j];
        }
    }
    pai(lin,s,n);
    for (int i = 0; i <n; i++) {
        puts(s[i]);
    }
    return 0;
}
void swap(char *m[],int n){
    char *a;
    a=m[n];
    m[n]=m[n+1];
    m[n+1]=a;
}
void pai(char str[],char *ptr[],int n){
    int c;
    for (int i = 1; i <=n-1 ; i++) {
        for (int j = 0; j <n-i ; j++) {
            c=strcmp(ptr[j],ptr[j+1]);
            if (c>0){
                swap(ptr,j);
            }
        }
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

影不在遗忘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值