运用数组、函数和指针进行程序设计实验

6-4 求一组数中的最大值、最小值和平均值

编写函数,求一组数中的最大值、最小值和平均值。

函数接口定义:

float fun(int a[],int n,int *max,int *min);

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

裁判测试程序样例:

​
#include 
float fun(int a[],int n,int *max,int *min);
int main()
{
    int x[10],i,m,n;
    float p;
    for(i=0;i<10;i++)
      scanf("%d",&x[i]);
    p=fun(x,10,&m,&n);
    printf("max=%d,min=%d,average=%.2f\n",m,n,p);
    return 0;
}
/* 请在这里填写答案 */

​

Code:

float fun(int a[],int n,int *max,int *min){
    int ret = 0,ma = 0,mi = 0;
    for(int i = 0;i < n;i++)
        ma = a[i] > a[ma] ? i : ma,mi = a[i] < a[mi] ? i : mi,ret += a[i];
    *min = a[mi],*max = a[ma];
    return ret * 1.0 / n; //注意返回值是float
}

6-7 字符串的连接

本题要求实现一个函数,将两个字符串连接起来。

函数接口定义:

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

函数str_cat应将字符串t复制到字符串s的末端,并且返回字符串s的首地址。

裁判测试程序样例:

#include 
#include 

#define MAXS 10

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

int main()
{
    char *p;
    char str1[MAXS+MAXS] = {'\0'}, str2[MAXS] = {'\0'};
    
    scanf("%s%s", str1, str2);
    p = str_cat(str1, str2);
    printf("%s\n%s\n", p, str1);
    
    return 0;
}

/* 你的代码将被嵌在这里 */

Code:

char *str_cat( char *s, char *t ){
    int len = 0;
    while(s[++len] != '\0');//扫描到s的末尾
    for(int i = 0;t[i];i++,len++)
        s[len] = t[i];//粘贴
    s[len] = '\0';//结尾处记得有0
    return s;
}

6-8 使用函数实现字符串部分复制

本题要求编写函数,将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。

函数接口定义:

void strmcpy( char *t, int m, char *s );

函数strmcpy将输入字符串char *t中从第m个字符开始的全部字符复制到字符串char *s中。若m超过输入字符串的长度,则结果字符串应为空串。

裁判测试程序样例:

#include 
#define MAXN 20

void strmcpy( char *t, int m, char *s );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */

int main()
{
    char t[MAXN], s[MAXN];
    int m;
    
    scanf("%d\n", &m);
    ReadString(t);
    strmcpy( t, m, s );
    printf("%s\n", s);

    return 0;
}

/* 你的代码将被嵌在这里 */

Code:

void strmcpy( char *t, int m, char *s ){
    int len = 0,i = 0;m--;
    while(t[++len] != '\0');//得到t的长度
    if(m <= len) //if判断可以避免在m > len时进行复制
        while(t[m] != '\0') s[i++] = t[m++];//复制
    s[i] = '\0';//结尾处要加'\0'
}

6-9 查找子串

本题要求实现一个字符串查找的简单函数。

函数接口定义:

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

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

裁判测试程序样例:

#include 
#define MAXS 30

char *search(char *s, char *t);
void ReadString( char s[] ); /* 裁判提供,细节不表 */

int main()
{
    char s[MAXS], t[MAXS], *pos;
    
    ReadString(s);
    ReadString(t);
    pos = search(s, t);
    if ( pos != NULL )
        printf("%d\n", pos - s);
    else
        printf("-1\n");

    return 0;
}

/* 你的代码将被嵌在这里 */

Code:

int equal(char *s,char *t){
    while(*s != '\0' && *t != '\0'&& *s++ == *t++);//将s与t扫描,在s与t不相等或者s,t末尾停下
    return *t == '\0';//如果停下的地方是t的末尾返回1,否则为0
}//判断s,t字符串是否相等
char *search( char *s, char *t ){
    for(int i = 0;s[i];i++)//把s字符串扫描一遍
        if (equal(s + i,t)) return s + i;//每到一处就与t对比,如果比对成功返回s + i
    return NULL;//如果上述比对没一次成功就返回NULL
}//这里的search是暴力解法,如果数据规模很大可以考虑KMP,Hash

7-1 字符串排序

本题要求编写程序,读入5个字符串,按由小到大的顺序输出。

输入格式:

输入为由空格分隔的5个非空字符串,每个字符串不包括空格、制表符、换行符等空白字符,长度小于80。

输出格式:

按照以下格式输出排序后的结果:

After sorted:
每行一个字符串

Code:

#include
#include
#include
typedef struct {char str[90];} string;
string str[5];
int cmp(string* a,string* b){
    return strcmp(a->str,b->str);//用strcmp比较字符串
}
signed main(){
    for(int i = 0;i < 5;i++) scanf("%s",str[i].str);
    qsort(str,5,sizeof(string),cmp);//C语言内置的排序函数,效率更高
    printf("After sorted:\n");
    for(int i = 0;i < 5;i++) printf("%s\n",str[i].str);
}

7-2 检查密码

本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能。该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母、数字和小数点 .,还必须既有字母也有数字。

输入格式:

输入第一行给出一个正整数 N(≤ 100),随后 N 行,每行给出一个用户设置的密码,为不超过 80 个字符的非空字符串,以回车结束。

注意: 题目保证不存在只有小数点的输入。

输出格式:

对每个用户的密码,在一行中输出系统反馈信息,分以下5种:

  • 如果密码合法,输出Your password is wan mei.
  • 如果密码太短,不论合法与否,都输出Your password is tai duan le.
  • 如果密码长度合法,但存在不合法字符,则输出Your password is tai luan le.
  • 如果密码长度合法,但只有字母没有数字,则输出Your password needs shu zi.
  • 如果密码长度合法,但只有数字没有字母,则输出Your password needs zi mu.

Code:

#include
int a,let,num,len,ill;
char str[81],c;
signed main(){
    scanf("%d",&a),getchar();
    while(a--){
        ill = len = let = num = 0;//动态清零的好习惯
        gets(str);//一定要用gets,scanf遇到' '会停止,而' '是非法字符,可能会误判
        while((c = str[++len]) != '\0')
            if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) let++;//统计字母
            else if(c >= '0' && c <= '9') num++;//统计数字
            else if (c != '.') ill++;//统计非法字符
//上面if-else语句可以用以下语句替换
// (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') ?let++ : c >= '0' && c <= '9' ? num++ : c != '.' ? ill++ : 0;
        if(len < 6) printf("Your password is tai duan le.\n");
        else if(ill) printf("Your password is tai luan le.\n");
        else if (num && let) printf("Your password is wan mei.\n");
        else if (!num && let) printf("Your password needs shu zi.\n");
        else if(!let && num) printf("Your password needs zi mu.\n");
//上面if-else语句可以用以下语句替换
// len < 6 ? printf("Your password is tai duan le.\n") : ill ? printf("Your password is tai luan le.\n") : (num && let) ? printf("Your password is wan mei.\n") : !num && let ? printf("Your password needs shu zi.\n") : !let && num ? printf("Your password needs zi mu.\n") : 0;
    }
}

7-3 九宫格输入法

假设有九宫格输入法键盘布局如下:

 [ 1,.?! ] [ 2ABC ] [ 3DEF  ]
 [ 4GHI  ] [ 5JKL ] [ 6MNO  ]
 [ 7PQRS ] [ 8TUV ] [ 9WXYZ ]
           [ 0空  ]

注意:中括号[ ]仅为了表示键盘的分隔,不是输入字符。每个中括号中,位于首位的数字字符即是键盘的按键,按一下即可输入该数字字符。多次按同一个键,则输入的字符依次循环轮流,例如按两次3,则输入D;按5次7,则输入S;按6次2,则输入A。按键0的输入组合是0空格字符,即按两次0输入空格。

你需要对于给定的按键组合,给出该组合对应的文本。

输入格式:

输入在一行中给出数个字符的按键组合(例如 999 表示按3次9),每个字符的按键组合之间用空格间隔,最后一个输入法组合之后以换行结束。输入数据至少包括一个字符的按键组合,且输入总长度不超过500个字符。

输出格式:

在一行中输出该按键组合对应的文本。

Code:

#include
#include
char str[503],ret[10][10] = {"0 ","1,.?!","2ABC","3DEF","4GHI","5JKL","6MNO","7PQRS","8TUV","9WXYZ"};//打表行为
int cnt = 0;
signed main(){
    gets(str);//最后一个以换行结束,不是EOF,所以不能用scanf
    for(int i = 0;str[i];i++){
        if(str[i] == str[i + 1]) cnt++;//与上一次相等,继续统计
        else if(str[i] != ' ')//遇到' '停止统计
            printf("%c",ret[str[i] - '0'][cnt % strlen(ret[str[i] - '0'])]);//后面那个%防止cnt过大爆数组
        cnt = 0;//动态清零的好习惯
    }
}

你可能感兴趣的:(PTA,c语言)