大一上 c + +上机实验总结(十二)

大一上 c + +上机实验总结目录:返回目录


1、自学教材P140-P141有关随机数的知识,然后做P168编程题的第2题
参考程序:

#include<iostream>
#include<cmath>	
#include <cstdlib>
#include<ctime>
using namespace std;
int main()
{ 
  int a[10],i,j;
  srand( int( time(0)) );   //为随机数生成器设置种子值
  for( i=0; i<10; i++ )
  {
   a[i] = rand()%90+10;      //产生随机数存放到数组中
   for( j=0; j<i; j++ )		//排除相同数据
          while( a[i]==a[j] ) 
              a[i]=rand()%90+10;
  }
  for( i=0; i<10; i++ )
     cout << a[i] << "   ";
  cout << endl;
  for( i=0; i<10; i++ )
  { 
     double m=sqrt( double (a[i]) );
     for( j=2; j<=m; j++)
        if( a[i] % j == 0 )break;
     if( j>m )
       cout << a[i] << "   ";
  }
  cout << "是素数!" << endl;
}

2、输出杨辉三角前10行:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
题解题思路:
杨辉三角各行上的数有以下的规律:
各行第1个数都是1
各行最后一个数都是1
从第3行起,除上面指出的第1个数和最后一个数外,其余各数是上一行同列和前一列两个数之和。可以这样表示:a[i][j]=a[i-1][j]+a[i-1][j-1]
参考程序1:

#include <iostream>
#include<iomanip>
using namespace std;
int main()
{int i,j,a[10][10];
 for(i=0;i<10;i++)
 {a[i][i]=1;     /*使对角线元素的值为1*/
  a[i][0]=1;   /*使第1列元素的值为1*/
}
 for(i=2;i<10;i++)    /*从第3行开始处理*/
     for(j=1;j<=i-1;j++)
	a[i][j]=a[i-1][j]+a[i-1][j-1];
 for(i=0;i<10;i++)
	{for(j=0;j<=i;j++)
	    cout<<setiosflags(ios::left)<<setw(6)<<a[i][j]; /*输出数组各元素的值*/
	 cout<<endl;
	}
 cout<<endl;  
 return 0;
}

参考程序2:

#include <iostream>
#include<iomanip>
using namespace std;
int main()
{int i,j,a[10][10]={0};
 for(i=0;i<10;i++)
    a[i][0]=1;     /*使第1列元素的值为1*/    
     
 for(i=1;i<10;i++)    /*从第2行开始处理*/
     for(j=1;j<=i;j++)
          a[i][j]=a[i-1][j]+a[i-1][j-1];
 for(i=0;i<10;i++)
	{for(j=0;j<=i;j++)
	    cout<<setiosflags(ios::left)<<setw(6)<<a[i][j]; /*输出数组各元素的值*/
	 cout<<endl;
	}
 cout<<endl;  
 return 0;
}

3、将二维数组(5行5列)的右上部分清0。
算法思想:扫描二维数组的上三角,在扫描的同时将上三角元素清0
参考程序:

#include <iostream>
#include<iomanip>
using namespace std;
int main()
{int  a[5][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25}},i,j;
  for(i=0;i<5;i++)
	for(j=i+1;j<5;j++)
		a[i][j]=0;
  //输出改变后的数组
  for(i=0;i<5;i++)
	{for(j=0;j<5;j++)
	 cout<<setiosflags(ios::left)<<setw(3)<<a[i][j];
	 cout<<endl;
	}

  return 0;
}

4、教材P168 编程题第5题
参考程序:

#include<iostream>
using namespace std;
int main()
{ 
  int a[4] = { 1, 2, 5, 7 };
  int b[8] = { 3, 4, 8, 8, 9, 10, 11, 12 };
  int c[12];
  int i,j,k;
  i = j = k = 0;
  while( i<4 && j<8 )
  {
    if( a[i] > b[j] )             		//当a[i]>b[j],把b[i]写入数组c
      { c[k] = b[j];  k++;  j++; }
    else                          	//当a[i]<=b[j],把a[i]写入数组c
      { c[k] = a[i];  k++;  i++; }
}
  while( i<4 )
  { 
   c[k] = a[i];  i++;  k++;			 //把数组a的剩余元素写入数组c
}     
  while( j<8 )
  { 
    c[k] = b[j];  k++;  j++;			//把数组b的剩余元素写入数组c
}     
  
  for( i=0; i<12; i++ )
    cout << c[i] << "   ";
  cout << endl;
}

5、一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。
提示:可设一个二维数组a[3][5]存放五个人三门课的成绩。再设一个一维数组grade[3]存放所求得各分科平均成绩,设变量average 为全组各科总平均成绩。
参考程序:

#include <iostream>
using namespace std;
int main()
 { int i,j,s=0, a[3][5];  
   float grade[3],average;
   cout<<"input score"<<endl;
   for(i=0;i<3;i++)
   { for(j=0;j<5;j++)
	  { cin>>a[i][j];	    
            s=s+a[i][j];
          }
     grade[i]=s/5.0;        
     s=0;        //注意,在累加下一门课程成绩之和时,s要清0
   }
   average =(grade[0]+grade[1]+grade[2])/3.0;   //求总平均成绩
   cout<<"math:"<<grade[0]<<endl<<"English:"<<grade[1]<<"clanguag:"<<grade[2]<<endl;
   cout<<"total:"<<average<<endl;
   return 0;
}

6、求s=a+aa+aaa+……aa…a(最后一项有n个a),其中,a是一个数字,n表示a的位数。例如:2+22+222+2222+22222(此时n=5)
参考程序:

#include <iostream>
using namespace std;
int main()
 { int  a,n,i=1,s=0,t=0;
   cout<<"a,n=:"<<endl;  
   cin>>a>>n;
   while (i<=n)
   {t=t*10+a; 
    s=s+t; /*赋值后的s为多项式前i项之和*/
    ++i;
   }
   cout<<"a+aa+aaa+...="<<s<<endl;
   return 0;
}

7、输入两个正整数m和n,求其最大公约数和最小公倍数
参考程序1:

#include <iostream>
using namespace std;
int main()
 { int  p,r,u,v,temp;
   cout<<"请输入两个正整数u,v:"<<endl;
   cin>>u>>v;
   if (u<v)
   {temp=u;
    u=v;
    v=temp;
   }
   p=u*v;
   r=u%v;
   while(r!=0)
   {u=v;
    v=r;
    r=u%v;
	}
   cout<<"它们的最大公约数为:"<<v<<endl;
   cout<<"它们的最小公约数为:"<<p/v<<endl;
   return 0;
}

参考程序2:

#include <iostream>
using namespace std;
int main()
 { int  p,r,u,v,temp;
   cout<<"请输入两个正整数u,v:"<<endl;
   cin>>u>>v;
   if (u<v)
   {temp=u;
    u=v;
    v=temp;
   }
   p=u*v;
   while((r=u%v)!=0)
   {u=v;
    v=r;
   }
   cout<<"它们的最大公约数为:"<<v<<endl;
   cout<<"它们的最小公约数为:"<<p/v<<endl;
   return 0;
}

8、输入3行字符串,每行最多有80个字符。要求分别统计出其每行中英文大写字母、小写字母、空格以及其他字符的个数。(提示:可以定义一个3行80列的二维字符数组,把此二维字符数组的每一行看成是一个一维的字符数组,每个一维字符数组中存放一个字符串)
参考程序:

#include <iostream>
using namespace std;
int main()
{char  a[3][80];
 int i,j,e,x,k,q;
 //输入3行字符串
 for(i=0;i<3;i++)
   cin.getline(a[i],80);//gets(a[i]);
 for(i=0;i<3;i++)
   puts(a[i]);
 for(i=0;i<3;i++)
	{  e=0;x=0;k=0;q=0;
	   for(j=0;a[i][j]!='\0';j++)
		{if(a[i][j]>='A'&&a[i][j]<='Z')
		   e++;  //统计大写字母个数
		 else if(a[i][j]>='a'&&a[i][j]<='z')
			     x++;  //统计小写字母个数
		      else
			     if(a[i][j]==' ')
				 k++;  //统计空格个数
			     else
			         q++;//统计其它字符个数		
		}
  cout<<"第"<<i<<"行上大写字母、小写字母、空格、其它字符个数分别为"<<e<<","<<x<<","<<k<<","<<q<<endl;
	}


 return 0;
}

9、从键盘输入一行字符,将其中的大写变小写,小写变大写,其余不变,要求把变化前后的字符串分别输出。
参考程序:

#include<iostream>
using namespace std;
int main( )
{
 char ch[50];
 int i;
 cin.getline(ch,50);    //可输入一行包含空格的字符串,系统会自动加'\0'
 cout<<ch<<endl;
 for(i=0;ch[i]!='\0';i++)
	 if(ch[i]>='A'&&ch[i]<='Z')
		 ch[i]=ch[i]+32;
	 else
		 if(ch[i]>='a'&&ch[i]<='z')
			 ch[i]=ch[i]-32;
 cout<<ch<<endl;
 return 0;
}

10、输入任意两个字符串,实现字符串的连接。不能使用strcat函数。
参考程序:

#include <iostream>
#include<cstring>
using namespace std;
int main()
{int i,j;
 char s1[200],s2[100];
 cout<<"input string1:"<<endl;
 //cin.getline(s1,100);
 cin>>s1;
 cout<<"input string2:"<<endl;
 //cin.getline(s2,100);
 cin>>s2;
 for (i=0;s1[i]!='\0';i++)for(j=0;s2[j]!='\0';j++)
   s1[i+j]=s2[j];
 s1[i+j]='\0';
 cout<<"\nThe new string is: \n"<<s1<<endl;
 return 0;
} 
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值