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);
}