C程序设计进阶week5(指针2注意)

本文介绍了数组的基本概念,如指针与字符数组的区别,并详细解析了三个编程题:计算矩阵边缘元素之和、二维数组右上左下遍历及文字排版。通过这些题目加深了对数组操作的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组中的指针
基本知识:
这里写图片描述
注意b,pb,c,pc,b和pb是地址,c和pc打印出来是内容,因为是字符数组

这里写图片描述
这段,加上那一段就打印地址了

这里写图片描述
定义指针后可以直接把字符串赋给pc,但这样就不能用pc指针修改这个字符串
buffer可以赋给pc,因为都是char指针


这里,a+1是下一个int,&a是指向数组的指针,表整个数组的地址
&a+1到了数组尾,跨过整个数组
*(&a)是&a指向的内容,由 *(&a)+1的打印结果可以看出
*(&a)等价于a
&相当于上升一级(指向元素变成指向数组),*相当于下降一级(指向数组变成指向元素)

这里写图片描述
这个图讲的很清楚了..

编程题#1:计算矩阵边缘元素之和
输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。
输入

第一行为整数k,表示有k组数据。

每组数据有多行组成,表示一个矩阵:

第一行分别为矩阵的行数m和列数n(m < 100,n < 100),两者之间以空格分隔。

接下来输入的m行数据中,每行包含n个整数,整数之间以空格作为间隔。

输出

输出对应矩阵的边缘元素和,一个一行。

#include <iostream>
using namespace std;

int main() {
    int k = 0;//定义变量的时候要直接赋个初值
    int a[100][100];
    cin >> k;
    for (int i = 0; i < k; i++) {//for里面都这么用比较好
        int m=0, n=0, sum = 0;
        cin >> m >> n;
        for (int j = 0; j < m; j++) {
            for (int t = 0; t < n; t++) {
                int num;
                cin >> num;
                if (j == 0 || j == m - 1 || t == 0 || t == n - 1)//这样比较简单,二维数组反而麻烦
                    sum += num;
            }
        }
        cout << sum << endl;
    }
    return 0;
}//没有使用指针,这里看起来没必要指针

编程题#2: 二维数组右上左下遍历(查blog的,有难度..)
给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺序遍历整个数组。

输入

输入的第一行上有两个整数,依次为row和col。

余下有row行,每行包含col个整数,构成一个二维整数数组。

(注:输入的row和col保证0 < row < 100, 0 < col < 100)
输出

按遍历顺序输出每个整数。每个整数占一行。

这里写图片描述

#include <iostream>
using namespace std;

int main() {
    int row, col;
    cin >> row >> col;
    int array[100][100];
    for (int i = 0; i < row; i++)
        for (int j = 0; j < col; j++)
            cin >> array[i][j];
    int diaNum = col + row - 1;//共有col+row-1条对角线
    for (int p = 0; p <= diaNum; ++p) {//对每条对角线
        int c = p;//对角线行数起始点为0,每次+1,
        for (int r = 0; r < row; r++) {//补上三角形后,只要每次输出时候把不在范围内的去掉就行了
            if (r >= 0 && r < row&&c < col&&c >= 0) {
                cout << *(*(array + r) + c) << endl;//打印坐标(c,r)的值
            }
            c--;
        }
    }
    return 0;
}//参考http://www.lai18.com/content/8577707.html



这种题得再看几遍,刚下了个csdn app,平时可以翻翻自己的blog..
自己做的时候没考虑到那个补三角形,结果做的非常麻烦.

编程题#3:文字排版(相对简单)
给一段英文短文,单词之间以空格分隔(每个单词包括其前后紧邻的标点符号)。请将短文重新排版,要求如下:

每行不超过80个字符;每个单词居于同一行上;在同一行的单词之间以一个空格分隔;行首和行尾都没有空格。
输入

第一行是一个整数n,表示英文短文中单词的数目. 其后是n个以空格分隔的英文单词(单词包括其前后紧邻的标点符号,且每个单词长度都不大于40个字母)。
输出

排版后的多行文本,每行文本字符数最多80个字符,单词之间以一个空格分隔,每行文本首尾都没有空格。

#include <iostream>
#include <cstring>
using namespace std;

int main() {
    int n=0,len =0;
    cin >> n;
    cin.get();
    char a[1000][40];//这里开头写了[200][40]没通过..
    for (int i = 0; i < n; i++)
        cin >> a[i];
    cout << a[0];//先输出第一个词
    len = strlen(a[0]);
    for (int j = 1; j < n; j++) {
        len = len + strlen(a[j]) + 1;
        if (len > 80) {
            cout << endl;
            cout << a[j];//长度超了就输出/n+单词
            len = strlen(a[j]);
        }
        else {
            cout << ' ' << a[j];//空格+单词
        }
    }
    return 0;
}



这题真的是很简单了》。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值