C语言/C++常见习题问答集锦(七)

C语言/C++常见习题问答集锦(七)

程序之美

在这里插入图片描述

1、c语言:定义两个长度相同的整型数组,通过键盘输入给这两个数组赋值。编写程序交换这两个数组对应位置的数值,如数组a[] ={1,2,3,4,5},数组b[] = {6,7,8,9,10},交换后,数组b[] ={1,2,3,4,5},数组a[] = {6,7,8,9,10},输出交换前后数组a、b的值。

#include <stdio.h>
void swap(int *x,int *y)
{
    int tmp=*x;
    *x=*y;
    *y=tmp;
}
 
void swap_array(int *a,int *b,int n)
{
    int i;
    for(i=0;i<n;++i)
        swap(a+i,b+i);
}
 
int main()
{
int n,i;
printf("请输入数组长度");
scanf("%d", &n);
int *a = (int*)malloc(n*sizeof(int));
if (a== NULL);
{
free(a) ;
a= NULL ;
return 1;
}
int *b = (int*)malloc(n*sizeof(int));
if (b== NULL);
{
free(b) ;
b= NULL ;
return 1;
}
printf("请为第一个数组赋值");
for ( i = 0; i < n; ++ i)
{
scanf("%d", &a[i]);
}  
printf("请为第二个数组赋值");
for ( i = 0; i < n; ++ i)
{
scanf("%d", &b[i]);
}  
    swap_array(a,b,n);
     
    printf("after swap b is:\n");
    for(i=0;i<n;++i)
        printf("%d ",b[i]);
    printf("after swap a is:\n");
    for(i=0;i<n;++i)
        printf("%d ",a[i]);
    printf("\n");
}

在这里插入图片描述

2、对某整型二维数组a[4][6],初始化填入一些浮点数,分别求其各行、各列以及所有数之乘积, 并显示数组的数据与计算结果

#include<stdio.h>
int main(){
float a[4][6]={(3.5,2.6,3.9,4.5,4.8,5.7),(2.9,3.5,4.4,5.9,4.9,5.8),(3.5,4.8,5.3,6.5,4.3,5.6),(4.5,5.6,6.3,7.7)};
float b[4];//存储每行乘积
float c[6];//存储每列乘积
float s = 1.0;
//计算乘积
for(int i=0;i<4;i++)
{
b[i]=1;
c[i]=1;
for(int j=0;j<6;j++){
b[i]=a[i][j];
c[i]=a[j][i];
s*=a[i][j];
}
}
 
for(int i=0;i<4;i++){
printf("第%d行乘积:%f\n", i, b[i]);
}
 
for(int i=0;i<6;i++){
printf("第%d列乘积:%f\n", i, c[i]);
}
printf("全部乘积:%f\n", s);
return 0;
}

在这里插入图片描述

3、编写一个程序,要求用户输入两个整数,获取用户输入的数,然后打印出较大 的数,如果这两个数相等,则打印信息:“These numbers are equal.”。
输入第一行有一个整数n,表示下面有n组数据,下面的n行,每行有两个用空格隔开的int 类型整数。
输出有n行,每行输出对应的结果。

样例输入:
2
14 14
13 12

样例输出:
These numbers are equal.
13

解法一:

#include<stdio.h>
 
int max(int a, int b){
    return a>b ? a : b;
}
 
int main()
{
int n,i;
printf("请输入数组组数:");
scanf("%d", &n);
int *a = (int*)malloc(n*sizeof(int));
if (a== NULL);
{
free(a) ;
a= NULL ;
return 1;
}
int *b = (int*)malloc(n*sizeof(int));
if (b== NULL);
{
free(b) ;
b= NULL ;
return 1;
}
printf("请为数组赋值:\n");
for ( i = 0; i < n; ++ i)
{
scanf("%d %d", &a[i], &b[i]);
}  
 
for(i=0;i<n;++i){
    if(a[i] == b[i]){
        printf("These numbers are equal.\n");
 }
 else{
            printf("%d\n",max(a[i], b[i]));
    }
 }
    printf("\n");
}

还有一位朋友的解法更加巧妙:

#include<stdio.h>
int main()
{
int n,i=0,m1,m2;
    printf("请输入一个整数:");
    scanf("%d", &n);
    printf("\n");
    while(i!=n)
    {
        printf("请输入2个整数:");
        scanf("%d %d",&m1,&m2);
        if (m1 > m2) { printf("%d\n", m1); }
        else if (m1 < m2) { printf("%d\n", m2); }
        else if (m1 = m2) { printf("These numbers are equal.\n"); }
        i++;
        printf("\n");
    }
return 0;
}

在这里插入图片描述

4、从键盘输入一串字符以及一个字符,找到这个字符在字符串中出现的第一次的位置和最后一次的位置的间距是多少。
输入:abcdefdef d
输出:字符d第一次出现在第4个
最后一次出现在第7个
第一次的位置和最后一次的位置间距为:3

解法一:

#include <iostream>
 
using namespace std;
 
int main()
{
    int min,max;
    string s;
    char c;
    cin >> s;
    cin >> c;
    for(int i = 0;i < s.length();i++){
        if(s.at(i) == c){
            min = i;
            break;
        }
    }
    for(int i = s.length() - 1;i >= 0;i--){
        if(s.at(i) == c){
            max = i;
            break;
        }
    }
    printf("字符%c第一次出现在第%d个\n最后一次出现在第%d个\n第一次的位置和最后一次的位置间距为: %d",c,min+1,max+1,max-min);
    return 0;
}

解法二:

#include <stdio.h>
int main(){
char a[1024];
char p;
int s = -1, e = 0, i = 0;
printf("请输入字符串:\n");
scanf("%s", a);
printf("请输入字符:\n");
scanf("%c", &p);
char* q = a;
while(*q){
if(*q == p){
if(s == -1){
s = i;
}
e = i;
}
i ++;
}
printf("字符%c第一次出现的位置为%d\n", s);
printf("字符%c最后一次出现的位置为%d\n", e);
printf("第一次的位置和最后一次的位置间隔:%d\n",  e - s);
 
return 0;
 
}

在这里插入图片描述

5、用while语句、do-while语句或for循环语句编写程序,计算e约等于1+1/1!+1/2!+…+1/n!
其中在1/n!小于等于10^(-5)时结束.
用C写.单循环.使误差小于给定的值
除了输出e以外,还要输出总项数n。

解法一:

#include<stdio.h>
void main()
{
float e,a; int i,n=0; /*涉及到小数运算要用浮点型变量*/
e=1,a=1; /*a=1在后面有乘积运算*/
for(i=1;1/a>1e-5;i++) /*条件循环语句*/
{
a*=i; /*级乘的算法*/
e+=1/a ; /*e的运算方法*/
n++;
}
printf("%f,n=%d\n",e,n);
}

解法二:

#include<stdio.h>
int main( )
{
float s = 1,n = 1;int t = 1;
while ( 1 / n >= 0.00001 )
{
s+=1/n;
t++;
n=n*t;
}
printf("%f,n=%d\n",s,t);
return 0;
}

解法三:

#include<stdio.h>
void main()
{
int i=1,j=1;
float e=1.0,k;
do{
j=i*j;
k=1.0/j;
e=e+k;
i++;
}while(k>1e-5);/*判断误差是否小于给定的误差限E=0.00001 */
printf("%f,n=%d\n",e,i);
}
  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五一编程

程序之路有我与你同行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值