翁恺老师C语言课程作业代码的C/C++实现(中)

        接下来是中间部分的内容(接上):

4.数组

4.1求序列前N项和

        本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。

        输入格式:

输入在一行中给出一个正整数N。

        输出格式:

在一行中输出部分和的值,精确到小数点后2位。题目保证计算结果不超过双精度范围。

        输入样例:

20

        输出样例:

32.66

C语言实现:

#include <stdio.h>
int main(){
    int i,j,Cnt,q;
    float sum=0;
    int cnt=0;
    scanf("%d",&Cnt);

    i=1,j=1;
    for(;cnt<Cnt;cnt++){
        sum += 1.0*i/j;
        q=j;
        j=i;
        i=q+j;
    }

    printf("%.f\n",sum);
    return 0;
}

C++实现:

#include<iostream>
using namespace std;
int main(){
    int i,j,Cnt,q;
    float sum=0;
    int cnt=0;
    cin>>Cnt;

    i=1,j=1;
    for(;cnt<Cnt;cnt++){
        sum += 1.0*i/j;
        q=j;
        j=i;
        i=q+j;
    }

    cout<<sum<<endl;
    return 0;
}

4.2约分最简分式

        分数可以表示为“分子/分母”的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。

        输入格式:

输入在一行中给出一个分数,分子和分母中间以斜杠“/”分隔,如:12/34表示34分之12。分子和分母都是正整数(不包含0,如果不清楚正整数的定义的话)。

提示:在scanf的格式字符串中加入“/”,让scanf来处理这个斜杠。

        输出格式:

在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用“分子/分母”的形式表示分数。如5/6表示6分之5。

        输入样例:
60/120
        输出样例:
1/2

C语言实现:

#include <stdio.h>

int main() {
    int x, y, i;
    scanf("%d", &x);
    getchar(); // 消耗输入缓冲区中的回车符
    scanf("%d", &y);

    for (i = x; i > 2; i--) { // 从高到低
        if (x % i == 0 && y % i == 0) {
            x /= i;
            y /= i;
        }
    }
    printf("%d/%d\n", x, y);
    return 0;
}

C++实现:

#include<iostream>
using namespace std;
int main(){
    int x,y,i;
    cin>>x;
    char cc=getchar();
    cin>>y;

    for(i=x;i>2;i--){             //从高到低
        if(x%i==0 && y%i==0){
            x/=i;
            y/=i;
        }
    }
    cout<<x<<"/"<<y<<endl;
}

4.3念数字

        输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出“fu”字。十个数字对应的拼音如下:

0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu
        输入格式:

输入在一行中给出一个整数,如:1234。

提示:整数包括负数、零和正数。

        输出格式:

在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如yi er san si。

        输入样例:
-600
        输出样例:
fu liu ling ling

C语言实现:

#include <stdio.h>
#include <string.h>

int main() {
    char *str[] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu", "fu"};
    int m, k, d, N = 1;
    scanf("%d", &m);
    if (m < 0) {
        printf("fu ");
        m = -m;
    }

    int M = m;
    while (M > 9) {
        N *= 10; // 确定初始除数
        M /= 10;
    }

    while (m >= 1) {
        d = m / N;
        m %= N; // 同时缩水十倍
        N /= 10; // 同时缩水十倍
        printf("%s ", str[d]);
    }

    return 0;
}

C++实现:

#include<iostream>
#include<string.h>
using namespace std;
int main(){
    string str[11]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu","fu"};
    int m,k,d,N=1;
    cin>>m;
    if(m<0){
        cout<<"fu ";
        m=-m;
    }

    int M=m;
    while(M>9){
        N*=10;                  //确定初始除数
        M/=10;
    }
    
    while(m>=1){
        d=m/N;
        m%=N;                   //同时缩水十倍
        N/=10;                  //同时缩水十倍
        cout<<str[d]<<" ";
    }

    return 0;

}

4.4求a的连续和

        输入两个整数a和n,a的范围是[0,9],n的范围是[1,8],求数列之和S = a+aa+aaa+...+aaa...a(n个a)。如a为2、n为8时输出的是2+22+222+...+22222222的和。

        输入格式:

输入在一行中给出两个整数,先后表示a和n。

        输出格式:

在一行中输出要求的数列之和。

        输入样例:
2 4
        输出样例:
2468

C语言实现:

#include <stdio.h>

int main() {
    int m, n, i, j;
    int sum = 0;
    scanf("%d %d", &m, &n);
    int a[n];

    int N = n;
    int M = m;
    for (i = 0; i < N; i++) {
        m = M; // 保留原数值
        n = N; // 保留原数值
        for (; n > i; n--) {
            a[i] += m;
            m *= 10;
        }
    }

    for (j = 0; j < i; j++) // 记住此时i值已经膨胀1跳出上次循环
        sum += a[j];

    printf("%d\n", sum);
    return 0;
}

C++实现:

#include<iostream>
using namespace std;
int main(){
    int m,n,i,j;
    int sum=0;
    cin>>m>>n;
    int a[n]={0};

    int N=n;
    int M=m;
    for(i=0;i<N;i++){
        m=M;                          //保留原数值
        n=N;                          //保留原数值
        for(;n>i;n--){
            a[i]+=m;
            m*=10;
        }
    }
   
   for(j=0;j<i;j++)         //记住此时i值已经膨胀1跳出上次循环
    sum+=a[j];

    cout<<sum<<endl;
}

4.5混合类型数据格式化输入

        本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。

        输入格式:

输入在一行中顺序给出浮点数1、整数、字符、浮点数2,其间以1个空格分隔。

        输出格式:

在一行中按照字符、整数、浮点数1、浮点数2的顺序输出,其中浮点数保留小数点后2位。

        输入样例:
2.12 88 c 4.7
        输出样例:
c 88 2.12 4.70

C语言实现:

#include <stdio.h>

int main() {
    float f1, f2;
    int a;
    char c;
    scanf("%f %d %c %f", &f1, &a, &c, &f2);
    printf("%d %c %.2f %.2f", a, c, f1, f2);

    return 0;
}

C++实现:

#include<iostream>
using namespace std;
int main(){
    float f1,f2;
    int a;
    char c;
    cin>>f1>>a>>c>>f2;
    printf("%d %c %.2f %.2f",a,c,f1,f2);

    return 0;
}

4.6简单计算器

        模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,4种运算符的优先级相同,按从左到右的顺序计算。

        输入格式:

输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。

        输出格式:

在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。

        输入样例:
1+2*10-10/2=
        输出样例:
10

C语言实现:

#include <stdio.h>

int main() {
    int x, total, flag = 1;
    char c = '0';
    scanf("%d", &x);
    total = x;
    while (c != '=') {
        scanf(" %c", &c); // 注意空格,消耗回车或空格等字符
        if (c == '=') {
            break;
        }
        scanf("%d", &x);
        if (c == '+') {
            total += x;
        } else if (c == '-') {
            total -= x;
        } else if (c == '*') {
            total *= x;
        } else if (c == '/') {
            if (x == 0) {
                flag = -1;
            } else {
                total /= x;
            }
        } else {
            flag = -1;
        }
    }
    if (flag == -1) {
        printf("ERROR\n");
    } else {
        printf("%d\n", total);
    }
    return 0;
}

C++实现:

#include<iostream>
using namespace std;
int main(){
    int x,total,flag=1;
    char c='0';
    cin>>x;
	total = x;
    while(c != '='){
        cin>>c;
        if(c=='=')
            break;             //此处的位置也至关重要
		cin>>x;
            if (c == '+') {
                total += x;
            } else if (c == '-') {
                total -= x;
            } else if (c == '*') {
                total *= x;
            } else if (c == '/') {
                if (x == 0) {
                    flag = -1;
                } else {
                    total /= x;
                }
            } else {
                flag = -1;
        }
    }	if(flag==-1) cout<<"ERROR"<<endl;
        else cout<<total<<endl;
    return 0;
}

 5.字符/字符串

5.1字符串字母大小写转换

输入一个以#结束的字符串,本题要求将小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其它字符不变。

        输入格式:

输入在一行中给出一个长度不超过40的、以#结束的非空字符串。

        输出格式:

在一行中按照要求输出转换后的字符串。

        输入样例:
Hello World! 123#
        输出样例:
hELLO wORLD! 123

C语言实现:

#include <stdio.h>

int main() {
    char c;
    c = getchar();
    while (c != '#') {
        if (c >= 'a' && c <= 'z')
            c -= 32;
        else if (c >= 'A' && c <= 'Z')
            c += 32;
        printf("%c", c);
        c = getchar();
    }
    return 0;
}

C++实现:

#include<iostream>
using namespace std;
int main(){
    char c;
    c=getchar();
    while(c!='#'){
        if(c>='a' && c<='z')
            c-=32;
        else if(c>='A' && c<='Z')
            c+=32;
        cout<<c;
        c=getchar();
    }
    return 0; 
}

5.2单词长度

        你的程序要读入一行文本,其中以空格分隔为若干个单词,以‘.’结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如“it's”算一个单词,长度为4。注意,行中可能出现连续的空格;最后的‘.’不计算在内。

        输入格式:

输入在一行中给出一行文本,以‘.’结束。

提示:用scanf("%c",...);来读入一个字符,直到读到‘.’为止。

        输出格式:

在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。

        输入样例:

It's great to see you here.
        输出样例:

4 5 2 3 3 4

C语言实现:

#include <stdio.h>

int main() {
    char a[30];
    int b[100] = {0}, j = 0, cnt = 0;
    for (int i = 1; a[i - 1] != '.'; i++) {
        a[i] = getchar();
        
        if (a[i] != ' ' && a[i] != '.') {
            cnt++;
        } else {
            b[j++] = cnt;
            cnt = 0; 
        }
    } 
    for (int i = 0; i < j; i++) {
        if (b[i] != 0) {
            printf("%d ", b[i]);
        }
    }
    return 0;
}

C++实现:

#include<iostream>
using namespace std;
int main(){
    char a[30];
    int b[100] = {}, j = 0, cnt = 0;
    for (int i = 1; a[i - 1] != '.'; i++)
    {
        a[i] = getchar();    //双指放在触控板实现粘贴
        
        if(a[i] != ' ' && a[i] != '.')
            cnt++;
        else
        {
            b[j++] = cnt;    //a[i++]=a[j]相当于a[i]=a[j],i++;
            cnt = 0; 
        }
    } 
    for (int i = 0; i < j; i++)
    {
        if (b[i] != 0)
            cout << b[i] << " ";
    }
    return 0;
}

5.3写出这个数

        读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

        输入格式:

每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10100。

        输出格式:

在一行内输出n的各位数字之和的每一位,拼音数字间有1空格,但一行中最后一个拼音数字后没有空格。

        输入样例:
1234567890987654321123456789
        输出样例:
yi san wu

C语言实现:

#include <stdio.h>

int main() {
    int n, d, m = 0;
    scanf("%d", &n);
    
    while (n > 0) {
        d = n % 10;
        n /= 10;
        m += d;
    }

    char *str[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
    int k, N = 1;
    int M = m;
    
    while (M > 9) {
        N *= 10;                  
        M /= 10;
    }

    while (m >= 1) {
        d = m / N;
        m %= N;                   
        N /= 10;                  
        printf("%s ", str[d]);
    }

    return 0;
}

C++实现:

#include<iostream>
using namespace std;
int main(){
    int n,d,m=0;
    cin>>n;
    while(n>0){
        d=n%10;
        n/=10;
        m+=d;
    }

    string str[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
    int k,N=1;
    int M=m;
    while(M>9){
        N*=10;                  
        M/=10;
    }

    while(m>=1){
        d=m/N;
        m%=N;                   
        N/=10;                  
        cout<<str[d]<<" ";
    }

    return 0;
}

5.4换个格式输出整数

        让我们用字母B来表示“百”、字母S表示“十”,用“12...n”来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数。例如234应该被输出为BBSSS1234,因为它有2个“百”、3个“十”、以及个位的4。

        输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000)。

        输出格式:每个测试用例的输出占一行,用规定的格式输出n。

        输入样例1:
234
        输出样例1:
BBSSS1234
        输入样例2:
23
        输出样例2:
SS123

C语言实现:

 #include <stdio.h>

int main() {
    int x, i = 0, j, k;
    int a[3] = {0};

    // 读取输入
    scanf("%d", &x);

    // 将输入分解为个位、十位和百位
    while (x > 0) {
        a[i] = x % 10;
        x /= 10;
        i++;
    }
    i--;

    // 根据数字的位置输出相应的字符串
    if (i == 2) {
        // 输出百位的B
        for (k = 1; k <= a[2]; k++) {
            printf("B");
        }
        // 输出十位的S
        for (k = 1; k <= a[1]; k++) {
            printf("S");
        }
        // 输出个位的数字
        for (j = 1; j <= a[0]; j++) {
            printf("%d", j);
            if (a[0] == j) {
                break;
            }
        }
    } else if (i == 1) {
        // 输出十位的S
        for (k = 1; k <= a[1]; k++) {
            printf("S");
        }
        // 输出个位的数字
        for (j = 1; j <= a[0]; j++) {
            printf("%d", j);
            if (a[0] == j) {
                break;
            }
        }
    } else {
        // 仅输出个位的数字
        for (j = 1; j <= a[0]; j++) {
            printf("%d", j);
            if (a[0] == j) {
                break;
            }
        }
    }

    return 0;
}

C++实现:

#include<iostream>
using namespace std;
int main(){
    int x,i=0,j,k;
    int a[3]={0};
    cin>>x;
    while(x>0){
        a[i]=x%10;
        x/=10;
        i++;
    }i--;
    
    if(i=2){
        for(k=1;k<=a[2];k++)
            cout<<"B";
        for(k=1;k<=a[1];k++)
            cout<<"S";
        for(j=1;j<=9;j++){
            cout<<j;
            if(a[0]==j) break;    
        }
    }
    else if(i=1){
        for(k=1;k<=a[1];k++)
            cout<<"S";
        for(j=1;j<=9;j++){
            cout<<j;
            if(a[0]==j) break;
        }
    }
    else{
        for(j=1;j<=9;j++){
            cout<<j;
            if(a[0]==j) break;
        }
    }

    
}

5.5A+B和C

        给定区间[-231, 231]内的3个整数A、B和C,请判断A+B是否大于C。

        输入格式:

输入第1行给出正整数T(<=10),是测试用例的个数。随后给出T组测试用例,每组占一行,顺序给出A、B和C。整数间以空格分隔。

        输出格式:

对每组测试用例,在一行中输出“Case #X: true”如果A+B>C,否则输出“Case #X: false”,其中X是测试用例的编号(从1开始)。

        输入样例:
4
1 2 3
2 3 4
2147483647 0 2147483646
0 -2147483648 -2147483647

        输出样例:
Case #1: false
Case #2: true
Case #3: true
Case #4: false

C语言实现:

 #include <stdio.h>

int main() {
    int x, i, j;
    scanf("%d", &x);

    int a[x][3];

    // 读取输入
    for (i = 0; i < x; i++) {
        for (j = 0; j < 3; j++) {
            scanf("%d", &a[i][j]);
        }
    }

    // 检查每个案例
    for (i = 0; i < x; i++) {
        if (a[i][0] + a[i][1] > a[i][2]) {
            printf("Case #%d: true\n", i + 1);
        } else {
            printf("Case #%d: false\n", i + 1);
        }
    }
    return 0;
}

C++实现:

#include<iostream>
using namespace std;
int main(){
    int x,i,j;
    cin>>x;

    int a[x][3]={0};
    for(i=0;i<x;i++){
        for(j=0;j<3;j++){
            cin>>a[i][j];
        }
    }
    for(i=0;i<x;i++){
        if(a[i][0]+a[i][1]>a[i][2])
            cout<<"Case #X: true"<<endl;
        else
            cout<<"Case #X: false"<<endl;
    }
    return 0;
}

        本次呈现数组和字符串相关内容,后面的内容在(下)中呈现!

        若是小白,推荐看看翁恺老师的系列课程,各大平台都有,很好找。

习题参考了这位道友的博客内容,其他内容皆是原创,附上对应链接-->
                        
原文链接:https://blog.csdn.net/fjinhao/article/details/4685317

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值