sdut oj 实验8- 指针的应用

A - 小泉的难题

Description

机械实验班有个同学叫小泉,有一天数学老师给小泉布置了一道个人作业,给小泉M(M<=100)组数据,每组数据有N个正整数(N<=100)让他把每组的N个数按升序排成一行,但由于数的数目比较多,人工做很费时,于是小泉就想到了喜欢编程序的你,请你帮他解决这个问题,可不要让他失望噢。

Input

输入包括M+1行,第一行是两个正整数M、N;M表示总共多少组数据,下面M行每行包含N个正整数。(输入数据之间会用空格隔开)

Output

输出包括M行,每行分别对应输入中M组数据的升序序列,数与数之间用一个空格隔开。

Sample

Input 

2 3
1 3 2
4 2 6

Output 

1 2 3
2 4 6

Hint

#include<stdio.h>
int main()
{
    int m,n,i,j,k;
    int t;
    scanf("%d %d",&m,&n);
    int a[m][n];
    for(i = 0; i < m; i++){
        for(j = 0; j < n; j++){
            scanf("%d",&a[i][j]);
        }
    }
    for(i = 0; i < m; i++){// 外层循环遍历每一行
        for(j = 1; j < n; j++){// 冒泡排序
            for(k = 0; k < n - j; k++){
                if(a[i][k] > a[i][k+1]){
                    t = a[i][k];
                    a[i][k] = a[i][k+1];
                    a[i][k+1] = t;
                }
            }
        }
    }
    for(i = 0; i < m; i++){
        printf("%d",a[i][0]);// 先输出每一行的第一个数
        for(j = 1; j < n; j++){
            printf(" %d",a[i][j]);// 每一行剩下的数
        }
        printf("\n");// 一行输出完之后就换行
    }
    return 0;
}

** 虽然没用指针也能做,但还是写个用指针的吧。。

#include<stdio.h>
int a[110][110];
int (*p)[110] = a;// (*p)[] 是一个数组指针(还是指针,所以必须指向一个数组)
int main()
{
    int m, n;
    scanf("%d %d", &m, &n);
    for(int i = 0; i < m; i++)
        for(int j = 0; j < n; j++)
            scanf("%d", &*(*(p+i)+j));  
    for(int i = 0; i < m; i++){// 遍历每一行
        for(int j = 0; j < n - 1; j++){
            for(int k = j+1; k < n; k++){
                if(*(*(p+i)+k) < *(*(p+i)+j)){
					int temp = *(*(p+i)+k);
					*(*(p+i)+k) = *(*(p+i)+j);
					*(*(p+i)+j) = temp;
				}
            }
        }
        for(int q = 0; q < n; q++){
            if(q == n - 1)
                printf("%d\n", *(*(p+i)+q));
            else
                printf("%d ", *(*(p+i)+q));
        }
    }
    return 0;
}

B - n个数的排序

Description

LeiQ当上了体育委员,现在老师让他去给班级里的人排队,LeiQ刚学了排序,所以他想以这种方式给班级里的人排队(从矮到高),他想知道排序完成后的结果。

Input

 多组输入,每组的第一行是一个正数n(1<=n<=100),第二行是n个数,表示每一个人的高度。

Output

输出排序完成后的结果。

Sample

Input 

3
176 175 174

Output 

174 175 176

Hint

#include<stdio.h>
int main()
{
    int n,a[105],i,j,t;
    while(~scanf("%d",&n)){
        for(i = 0; i < n; i++)
            scanf("%d",&a[i]); 
        for(i = 0; i < n - 1; i++){
            for(j = 0; j < n- 1 - i; j++){
                if(a[j] > a [j+1]){
                    t = a[j];
                    a[j] = a[j+1];
                    a[j+1] = t;
                }
            }
        }
        for(i = 0; i < n; i++){
            if(i == n-1)
                printf("%d\n",a[i]); 
            else
                printf("%d ",a[i]);
        }
    }
    return 0;
}

**这个题怎么用指针啊?

#include<stdio.h>

int a[110];
int *p = a;
int main()
{
    int n;
    while(~scanf("%d", &n)){
        for(int i = 0; i < n; i++)
            scanf("%d", &*(p+i));
        for(int i = 0; i < n - 1; i ++){
            for(int j = 0; j < n - 1 - i; j++){
                if(*(p+j) > *(p+j+1)){
                    int t = *(p+j);
                    *(p+j) = *(p+j+1);
                    *(p+j+1) = t;
                }
            }
        }
        for(int i = 0; i < n; i++){
            if(i == n - 1)
                printf("%d\n", *(p+i));
            else
                printf("%d ", *(p+i)); 
        }
    }
    return 0;
}

C - C语言实验——矩阵下三角元素之和

Description

输入一个正整数n(1<=n<=10),再输入n*n的矩阵,要求求该矩阵的下三角元素之和。

Input

输入包括n+1行。
第一行为整数n;
接下来的n行为矩阵数据。

Output

矩阵的下三角元素之和。

Sample

Input 

5

1 2 3 4 5

2 3 4 5 6

3 4 5 6 7

4 5 6 7 8

5 6 7 8 9

Output 

75
#include<stdio.h>
int main()
{
    int a[15][15];
    int n,i,j,k,sum = 0;
    scanf("%d",&n);
    for(i = 0; i < n; i++){
        for(j = 0; j < n; j++)
            scanf("%d",&a[i][j]);
    }
    for(i = 0; i < n; i++){
        for(k = 0; k <= i; k++)
            sum += a[i][k]; 
    }
    printf("%d\n",sum);
    return 0;
}
#include<stdio.h>
int  f(int (*p)[10],int n)
{
    int sum = 0;
    for(int i = 0; i < n; i++){
        for(int j = 0; j <= i; j++)
            sum += p[i][j];
    }
    return sum;
}
int main()
{
    int n,i,j,sum;
    int a[10][10];
    scanf("%d",&n);
    for(i=0; i<n; i++){
        for(j=0; j<n; j++)
            scanf("%d",&a[i][j]);
    }
    sum=f(a,n);
    printf("%d",sum);
    return 0;
}

D - 又见回文

Description

    “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。现在呢,就是让你判断输入的字符串是否是回文串。

Input

    有多组输入,每行输入一串字符,保证字符串长度不会大于 100000,字符串由大小写英文字母和空格组成,以字符串“2013”作为结束标志。

Output

    每行输出一个字符串,如果输入是回文串,输出“YES”,否则输出“NO”(注意:判断的时候空格是不作判断的,详见样例)。

Sample

Input 

aaaa

ggg g

lozxvxoMJBCHsTXooXTsHCBJMoxvxzol

i am a good acmer

2013

Output 

YES

YES

YES

NO

Hint

#include<bits/stdc++.h>
using namespace std;
int f(char *a)
{
    int len=strlen(a);
    char *p=a,*q=a+len-1;
    while(p < q){//p为a的首地址,q为a的尾地址
        if(*q == ' '){//指针q向前移动,如果遇到空格继续减1;
            q--;
            continue;
        }
        if(*p == ' '){//指针p向后移动,如果遇到空格继续加1;{
            p++;
            continue;
        }
        if(*q == *p){//如果两个指针代表的字符相等,则向中间同时移动;
            p++;
            q--;
        }
        else
            return 0;
    }
    return 1;
}

int main()
{
    char a[111000];
    while(gets(a)){
        if(strcmp(a,"2013")==0){
            break;
        }
        if(f(a))
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

c:

#include <stdio.h>
#include <string.h>
int f(char *a)
{
    int len=strlen(a);
    char *p=a,*q=a+len-1;
    while(p < q){//p为a的首地址,q为a的尾地址
        if(*q == ' '){//指针q向前移动,如果遇到空格继续减1;
            q--;
            continue;
        }
        if(*p == ' '){//指针p向后移动,如果遇到空格继续加1;{
            p++;
            continue;
        }
        if(*q == *p){//如果两个指针代表的字符相等,则向中间同时移动;
            p++;
            q--;
        }
        else
            return 0;
    }
    return 1;
}

int main()
{
    char a[111000];
    while(gets(a)){
        if(strcmp(a,"2013")==0){
            break;
        }
        if(f(a))
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值