这是一个简单的数组使用练习
主要基于之前的练习中的乱数生成
题目要求
投100000次(两颗)骰子的点数相加,并统计和次数
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand(time(0));
int i;
int a[12]={0};
for(i=0;i<100000;i++){
int dice1,dice2;
dice1=rand()%6+1;
dice2=rand()%6+1;
int j=dice1+dice2;
a[j-1]++;
}
for(i=1;i<12;i++)
printf("%d:%d\n",i+1,a[i]);
return 0;
}
练习2
让用户输入6个整数,并且通过查询得到相应位置数据的大小
#include<stdio.h>
int main()
{
int i,n[6];
for(i=0;i<6;i++){ //输入
printf("%d:",i+1);
scanf("%d",&n[i]);
}
while(1){ //查询
printf("Q:");
scanf("%d",&i);
if(i==0)
break; //当查询为0时推出
printf("%d\n",n[i-1]);
}
return 0;
}
练习3
让使用者输入10个数字,并输入上限和下限,输出剩余数字,要求可以输出无限次,当输入0 0时结束
#include<stdio.h>
int main(){
int i,a[10];
for(i=0;i<10;i++){ //输入10个数字
printf("%d:",i+1);
scanf("%d",&a[i]);
}
int max,min;
while(1){
printf("请输入上限:");
scanf("%d",&max);
printf("请输入下限:");
scanf("%d",&min);
if(max==0&&min==0){ //上限下限都是0的时候退出
break;
}
for(i=0;i<10;i++){
if(a[i]<min||a[i]>max){ //(之前的笔记中应该有continue和break)跳过不在范围内的数字,当然也可以用 if述句
continue;
}
printf("%d ",a[i]);
}
printf("\n");
}
return 0;
}
练习4
输出范围内数字的最大值
#include<stdio.h>
int Max(int,int);
int main()
{
int i,a[10];
int l=0;
for(i=0;i<10;i++){ //还是输入十个数字
printf("%d:",i+1);
scanf("%d",&a[i]);
}
while(1){
printf("请输入上限:");
int max;
scanf("%d",&max);
if(max==0) //输入0为上限时结束循环
break;
for(i=0;i<10;i++){
if(max<a[i])
continue;
l=Max(l,a[i]); //将较大的一个数赋给l,循环一下l就是最大值了
}
printf("%d\n",l);
}
return 0;
}
int Max(int a,int b){
if(a>=b){
return a;
}else
return b;
}
练习5
查询范围内接近的数
#include<stdio.h>
#include<stdlib.h>//整数的绝对值abs在C语言中的头文件是这个,浮点数好像是math.h
int main()
{
int i,a[10];
int l=0;
for(i=0;i<10;i++){
printf("%d:",i+1);
scanf("%d",&a[i]);
}
while(1){
printf("请输入一个数字:");
int number;
scanf("%d",&number);
if(number==0)
break;
for(i=0;i<10;i++){
if( abs(number-a[i])<abs(number-l)) //先假定l=0是最接近的,然后逐一的排除,当然这么做有一点风险,就是万一0是最接近的又不在数组中,那输出的结果就是错的
l=a[i];
}
printf("最接近这个数的是%d\n",l);
}
return 0;
}
练习6
统计数据段内数据出现的次数,1~10,11~20,.....90~100然后用*画柱状图
#include<stdio.h>
int main()
{
int i,a[10],j;
for(i=0;i<10;i++){
printf("%2d(1~100):",i+1);
scanf("%d",&a[i]);
}
for(i=0;i<10;i++){
printf("%3d0:",i+1); //printf有一个特殊功能,在%和d之间输入一个数字可以使输出的字符具有相应的长度,用于对齐。这里%3d输出的就会是有三个长度的字符
for(j=0;j<10;j++){
if((a[j]-1)/10==i) //数组在使用的时候最需要注意的就是下标是从0开始的a[0],还有不可以超出范围,不然计算机会随便给你一个数
printf("*");
}
printf("\n");
}
return 0;
}
练习7
找出众数
#include<stdio.h>
int main()
{
int i,a[10]={0};
printf("输入十个0~9之间的数:\n");
for(i=0;i<10;i++){
int number;
scanf("%d",&number);
a[number]++; //这里的数组是计次用,不用于存放输入的值
}
int j,n=-1;
for(j=0;j<10;j++){
if(n<a[j]||(n==a[j]&&i<j)){
n=a[j];
i=j;
}
}
printf("%d",i);
return 0;
}
练习8
产生1到10不重复的10个随机数,就是1到10乱序
这个练习我写了一种方法,每次都只有第一个数和后面的重复,检查了一个半小时,愣是没检查出来,最后放弃了
然后换了一种写法,唉,心痛
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand(time(0));
int a[10]={0};
int i,j;
for(i=0;i<10;i++){
do{
a[i]=rand()%10+1; //这种写法是当后来的数与之前的数重复的时候,重新读取一次,难点就在于如何判断是否与之前的的数字重复,这边用的是do-while循环
for(j=0;j<i;j++){
if(a[i]==a[j]){
break;
}
}
}while(j!=i);
printf("%d ",a[i]);
}
printf("ok");
return 0;
}
这题还有一种写法,是参考别人的
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand(time(0));
int a[10]; //先把一到十排好序
int i;
for(i=0;i<10;i++){
a[i]=i+1;
}
for(i=0;i<10;i++){
int j=rand()%(10-i)+i+1; //随机产生一个从 i 到10-i 的数把它和第 i 个数换一下位置
int t=a[i]; //就是从没有读取过的数中随机读取一个数,然后把它往前堆
a[i]=a[j];
a[j]=t;
printf("%d ",a[i]);
}
printf("ok");
return 0;
}
今天的练习有点多,还有一些就不写出来了,最后这一题,我之前的写法检查花了我一个多小时,伤不起,闪人,学单片机去
|