[Coursera C程序设计进阶] 第五周作业

编程题#1:计算矩阵边缘元素之和

来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述

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

输入

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

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

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

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

输出

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

Runtime error:

#include<iostream>
#include<stdio.h> 
using namespace std;

int main() {
	int k,k1=0;
	cin >> k;
	while (k1 < k) {
		int m, n;
		int a[100][100] = { 0 };
		cin >> m >> n;
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				cin >> a[i][j];
			
			}
		}

		int(*aryp)[100] = a;
		int sum = 0;
		int(*p1)[100] = aryp;
		int(*p2)[100] = aryp + m-1;
		for (int i = 0; i < n; i++) {
			sum += (*p1)[i];
		}
		for (int i = 0; i < n; i++) {
			sum += (*p2)[i];
		}
		for (int(*p3)[100] = aryp + 1; p3 != aryp + m-1; p3++)
		{
			sum += (*p3)[0] + (*p3)[n-1];
		}
		cout << sum << endl;
		k1++;
	}
	system("pause");
	return 0;
}
#include<iostream>    
using namespace std;
int main() {
	int t;
	cin >> t;
	for (int i = 0; i < t; i++) {
		int m = 0, n = 0;
		cin >> m >> n;
		int shuzu[100][100];//矩阵最大100*100    
		int sum = 0;
		for (int j = 0; j < m; j++) {
			for (int o = 0; o < n; o++) {
				cin >> shuzu[j][o];//输入数组数值    
				if (j == 0 || j == m - 1)//先算首行,末行    
					sum += shuzu[j][o];
				else if (o == 0 || o == n - 1)//else 之后再用if 找除了四个角落之外的首列,末列    
					sum += shuzu[j][o];
			}
		}
		cout << sum << endl;
	}
	return 0;
}

编程题#2: 二维数组右上左下遍历

来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述

给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺序遍历整个数组。

输入

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

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

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

WA:

#include<iostream>
using namespace std;

int main() {
	
	int m, n;
	int a[100][100] = { 0 };
	cin >> m >> n;

	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			cin >> a[i][j];
		}
	
	}
	for (int count = 0; count <= n+1; count++) {
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				if (i + j == count) {
					cout << a[i][j] << endl;
				}
			}
		}
	}
	

	
	
	system("pause");
	return 0;
}
#include <iostream>  

using namespace std;

int main()
{
	int row = 0, col = 0;
	cin >> row >> col;
	
	int array[100][100] = { 0 };
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			cin >> array[i][j];
		}
	}

	int x = 0, y = 0;
	for (int i = 0; i < row + col - 1; i++)
	{
		x = i > col - 1 ? i - col + 1 : 0;
		y = i - x;
		while (x <= row - 1 && y >= 0)
		{
			cout << array[x][y] << endl;
			x++;
			y--;
		}
	}
	

	return 0;
}

编程题#3:文字排版

来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述

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

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

输入

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

输出

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

#include <iostream>  
#include<string.h>  
using namespace std;

int main()
{
	int words = 0, sum = 0;
	cin >> words;
	char str[41] = { 0 };
	for (int i = 0; i < words; i++)
	{
		cin >> str;
		if (sum + 1 + strlen(str) > 80)
		{
			cout << endl;
			sum = 0;
		}
		else if (i>0)
		{
			cout << " ";
			sum++;
		}
		cout << str;
		sum += strlen(str);
	}
	system("pause");
	return 0;
}
#include <iostream>    
#include <cstring>    
using namespace std;    
int main()    
{    
    char words[1000][40]; //用于保存每一个单词    
    int wordsLen[1000]; // 记录每一个单词的长度    
    int n; // 需要处理的单词总数    
    cin >> n;    
    cin.get();//cin之后要用cin.get()读取换行符,一开始没注意到错误在这里,还是基础不牢靠    
    for (int i = 0; i < n;i++) //输入单词数据,处理后得到每个单词的长度    
    {    
        char temp;    
        for (int j = 0; j < 40;j++) {    
            cin.get(temp);                  
                if (temp != ' '&&temp != '\n') {    
                    words[i][j] = temp;    
                        
                }    
                else    
                {    
                    wordsLen[i] = j;    
                    break;    
                }    
            }    
            
    }    
    //先输出第一个单词    
    int length = wordsLen[0];    
    for (int j = 0; j < wordsLen[0]; j++)    
        cout << words[0][j];    
    for (int i = 1; i < n; i++)    
    {    
        //如果该单词,连同前面的一个空格加入后不换行,则输出空格和该单词    
        if (length + 1 + wordsLen[i] <= 80)    
        {    
            length = length + 1 + wordsLen[i];    
            cout << ' ';    
            for (int j = 0; j < wordsLen[i]; j++)    
                cout << words[i][j];    
        }    
        else//如果该单词,连同前面的一个空格加入后换行,则输出回车和该单词,另外重置本行现有长度为单词长度    
        {    
            cout << endl;    
            length = wordsLen[i];    
            for (int j = 0; j < wordsLen[i]; j++)    
                cout << words[i][j];    
        }    
    }    
    return 0;    
}    




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值