第8周編程作業
本作業是在線評測形式。提交源程序,系統自動評測,可多次提交。輸出格式嚴格按題目要求,參考給出的樣例。大小寫、中英文、空格數量都必須嚴格。
依照學術誠信條款,我保證此作業是本人獨立完成的。
溫馨提示:
1.本次作業屬於Online Judge題目,提交後由系統即時判分。
2.學生可以在作業截止時間之前不限次數提交答案,系統將取其中的最高分作爲最終成績。
1輸出數字的英文名稱(20分)
題目內容:
編寫一個函數,將表示數字的數值(0-12)轉換成對應的英文名稱(小寫)。用戶輸入阿拉伯數字,程序輸出對應數的英文單詞。要求必須使用指針數組完成。
輸入格式:
0-12的數
輸出格式:
輸入數字對應的英文單詞,均爲小寫字母
【提示】:函數格式: char * digitName(int n);
輸入樣例:
1
輸出樣例:
one
時間限制:500ms內存限制:32000kb
C++
#include<iostream>
using namespace std;
char str[][10] = { "zero","one", "two", "three" ,"four","five","six","seven","eight","nine","ten","eleven","twelve" };
int main()
{
char(*p)[10] = str;
int number;
cin >> number;if(number>=0&&number<13)cout << p[number];
return 0;
}
用例測試結果 運行時間 佔用內存 提示 得分
用例1通過 14ms 368kb
4
用例2通過 2ms 368kb
4
用例3通過 2ms 256kb
4
用例4通過 14ms 372kb
4
用例5通過 2ms 372kb
4
提交答案本次得分/總分:20.00/20.00分
2去除字符串首尾多餘的空格(20分)
題目內容:
用戶輸入一個字符串,首尾有多餘的空格,編寫程序來去除這些多餘的空格。要求必須使用指針來完成本題。
輸入格式:
一個首尾有多餘空格字符串。爲了便於標識出尾部的空格,在字符串尾部額外添加了個#號表示字符串結束。字符串內部保證不會出現#號。
輸出格式:
去除空格後的字符串,同樣在在字符串尾部額外添加了個#號表示字符串結束。
輸入樣例:
my score #
輸出樣例:
my score#
時間限制:500ms內存限制:32000kb
C++
#include<iostream>
using namespace std;
char str[100];
int main()
{
char*p = str;
cin.getline(str, 100);
while (*p == ' ')++p;
char *q = p;
while (*(q) != '#')++q;
--q;
while (*(q) == ' ')--q;
*(q + 1) = '#';*(q + 2) = '\0';
cout << p;
return 0;
}
用例測試結果 運行時間 佔用內存 提示 得分
用例1通過 2ms 376kb
7
用例2通過 2ms 364kb
7
用例3通過 2ms 256kb
3
用例4通過 3ms 360kb
3
提交答案本次得分/總分:20.00/20.00分
3遍歷二維數組(20分)
題目內容:
用戶首先輸入兩個整數m和n,然後輸入mn個元素,建立一個mn的二維數組。要求使用 行指針 來遍歷這個二維數組,輸出該數組中所有元素的和。
輸入格式:
首先輸入兩個整數m和n,然後依次輸入m*n個元素
輸出格式:
二維數組中所有元素的和
輸入樣例:
2 3
1 3 5
2 4 6
輸出樣例:
21
提示:動態申請二維數組的方法
//動態申請二維數組
#include
using namespace std;
int main()
{
int **a; //指向指針的指針
int n,m;//n行 m列
int i,j;
cin>>n>>m; //輸入行數和列數
//申請空間
a= new int * [n]; //n個 int 指針 數組
for(i=0;i<n;i++) //n個大小爲m的一維數組
{
a[i]=new int[m]; //1個大小爲m的一維數組,a[i]是int指針
}
//輸入數據
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
//cin>>a[i][j];//輸入
cin>> *(*(a+i)+j);//同上a相當於行指針
}
}
//輸出數據
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
//cout<<a[i][j]<<"\t";//輸出
cout<< *(*(a+i)+j)<<"\t";
}
cout<<endl;
}
//釋放申請的空間!!!
for(i=0;i<n;i++) //釋放n個大小爲m的一維數組
{
delete []a[i];
}
delete []a;//釋放int指針數組
return 0;
}
時間限制:500ms內存限制:32000kb
C++
//動態申請二維數組
#include <iostream>
using namespace std;
int main()
{
int **a; //指向指針的指針
int n,m;//n行 m列
int i,j;
cin>>n>>m; //輸入行數和列數
//申請空間
a= new int * [n]; //n個 int 指針 數組
for(i=0;i<n;i++) //n個大小爲m的一維數組
{
a[i]=new int[m]; //1個大小爲m的一維數組,a[i]是int指針
}
//輸入數據
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
//cin>>a[i][j];//輸入
cin>> *(*(a+i)+j);//同上a相當於行指針
}
}
//輸出數據
int sum=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
//cout<<a[i][j]<<"\t";//輸出
// cout<< *(*(a+i)+j)<<"\t";
sum+= *(*(a+i)+j);
}
// cout<<endl;
}
cout<<sum;
//釋放申請的空間!!!
for(i=0;i<n;i++) //釋放n個大小爲m的一維數組
{
delete []a[i];
}
delete []a;//釋放int指針數組
return 0;
}
用例測試結果 運行時間 佔用內存 提示 得分
用例1通過 3ms 256kb
7
用例2通過 2ms 244kb
7
用例3通過 2ms 372kb
6
提交答案本次得分/總分:20.00/20.00分
4動態申請大數組(20分)
題目內容:
本題要求編寫兩個函數並測試。
第一個函數原型爲 int *new_array(int n); 該函數可以根據參數n動態申請n個元素的整型數組,最後將數組指針返回。
第二個函數原型爲 void init_array(int *p, int n,int c); 將指定的n個元素的數組每個元素的值均初始化爲c。
用戶輸入數組大小n和待初始化的值c,調用new_array函數申請空間,再調用init_array初始化,最後輸出這個數組的所有元素。
輸入格式:
數組大小n和待初始化的值c
輸出格式:
數組的所有元素,注意最後一個元素後沒有空格
輸入樣例:
8 27
輸出樣例:
27 27 27 27 27 27 27 27
時間限制:500ms內存限制:32000kb
C++
#include <iostream>
using namespace std;
int *new_array(int n) {
int *p = new int[n];
return p;
}
void init_array(int *p, int n, int c) {
while (n) {
*p = c;
--n;++p;
}
}
int main()
{
int n, m, *q;
cin >> n >> m;
q = new_array(n);
init_array(q, n, m);
cout << *q;
int *p = q;
while (--n)cout <<" "<< *(++p);
delete[]q;//釋放int指針數組
return 0;
}
用例測試結果 運行時間 佔用內存 提示 得分
用例1通過 3ms 360kb
7
用例2通過 2ms 376kb
7
用例3通過 3ms 360kb
6
提交答案本次得分/總分:20.00/20.00分
5矩陣對角線元素之和(20分)
題目內容:
編寫函數,求n階方陣的對角線元素之和。編寫主程序,用戶輸入矩陣的階數n,動態申請n*n的存儲空間,再輸入n行、n列的元素,調用函數求矩陣的對角元素之和,在主函數中輸出這個和。設元素均爲整數。n>=1。
函數格式:int sumDiagonal(int *a,int n);
輸入格式:
一個正整數n,表示矩陣的階數。
n行、n列的矩陣元素。數據間用空格隔開。
輸出格式:
一個整數
輸入樣例:
3
6 1 2
1 13 6
62 4 35
輸出樣例:
54
時間限制:1000ms內存限制:32000kb
C++
#include <iostream>
using namespace std;
int sumDiagonal(int *a, int n) {
int sum = 0;
for (int i = 0; i < n; ++i)
for(int j = 0; j < n; ++j){
cin >> *(a + i * n + j);
if(j == i)sum += *(a + i * n + j);
}
return sum;
}
int main()
{
int n;
cin >> n;
int *p = new int[n*n];cout << sumDiagonal(p, n);
delete[]p;//釋放int指針數組
return 0;
}
用例測試結果 運行時間 佔用內存 提示 得分
用例1通過 2ms 252kb
4
用例2通過 2ms 364kb
4
用例3通過 2ms 248kb
4
用例4通過 2ms 256kb
4
用例5通過 2ms 256kb
4
提交答案本次得分/總分:20.00/20.00分
6(本題只記3分)十進制點分IP轉換爲32位二進制IP(3分)
題目內容:
編寫程序,將十進制點分的IP轉換爲32位二進制IP地址。程序要能驗證輸入的十進制點分IP地址的合法性。用戶輸入的IP不和法時,輸出"data error"。
請使用模塊化程序設計的思想,將功能模塊編寫成函數。通過指針傳遞參數,操作數據,返回結果。在主函數中輸入IP地址,調用函數進行合法性驗證和轉換,在主函數中輸出32位二進制IP。
輸入格式:
十進制點分IP地址(英文句點)
輸出格式:
32位二進制數(二進制字符串)
輸入樣例:
202.151.96.33
輸出樣例:
11001010100101110110000000100001
提示:十進制轉換爲二進制。對整數部分,除2取餘,直到商爲0。例如
13/2=6…1(低位)
6/2=3…0
3/2=1…1
1/2=0…1
轉換後的二進制數位1101
時間限制:2000ms內存限制:32000kb
C++
#include<iostream>
using namespace std;
bool intput(int *a) {
for (int i = 0;i < 4;++i) {
cin >> a[i];
if ((i < 3 && cin.get() != '.') || ((i == 3 && a[i] < 1) || a[i] < 0 || a[i]>255))
return 1;
}
return 0;
}
void coutip32(int *a) {
for (int i = 0;i < 4;++i)
for (int j = 7;j >= 0;--j)
cout << (a[i] >> j & 1);
}
int main(){
int a[4];
if(intput(a))cout << "data error";
else coutip32(a);
return 0;
}
用例測試結果 運行時間 佔用內存 提示 得分
用例1通過 2ms 392kb
1
用例2通過 3ms 380kb
1
用例3通過 2ms 380kb
1
提交答案本次得分/總分:3.00/3.00分