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

来源:互联网 发布:尚硅谷java全套视频 编辑:程序博客网 时间:2024/05/16 07:49

数组中的指针
基本知识:
这里写图片描述
注意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;}

这题真的是很简单了》。

原创粉丝点击