EG 1
逆序输出
#include <stdio.h>
void main()
{
int i=0,a[10];
for(;i<10;i++)
{
a[i]=i;
}
for(i=9;i>=0;i--)
{
printf("%d\t",a[i]);
}
}
EG 2
计算斐波那契数列
#include <stdio.h>
void main()
{
int i=0,f[40]={
1,1};
// i 从2开始
for(i=2;i<40;i++)
{
f[i]=f[i-1]+f[i-2];
}
for(i=0;i<40;i++)
{
if(i%5==0) printf("\n");
printf("%d\t",f[i]);
}
}
EG 3 排序
排序
冒泡排序
#include <stdio.h>
void main()
{
void bubbleSort(int *arr);
printf("请输入:");
int i=0,j,arr[5];
while((i-5)!=0)
{
scanf("%d",&arr[i]) ;
i++;
}
bubbleSort(arr);
printf("排序后的数组为:\n");
for (j = 0; j<5; j++)
printf("%d ", arr[j]);
printf("\n");
}
void bubbleSort(int *arr)
{
int i,j,tmp;
for(i=0;i<5-1;i++)
{
for(j=0;j<5-1-i;j++)
{
if(arr[j]>arr[j+1])
{
tmp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
}
}
? int *a 与 int b[]
如 int *a 和 int b[]
相同点
a和b的值都表示一片内存区域的地址,都是使用int型进行管理
作为函数的形式参数没有任何区别
区别
a是一个变量,需要分配内存空间进行存储
而b是程序中的一个标号,给编译器提供地址信息,不需要进行保存。因此可以在程序中改变a,但是无法在程序中改变b。
可以使用int b[]定义数组,如 int b[] = {1, 2, 3, 4}, 但是无法使用int *a定义数组 int *a = {1, 2, 3, 4} //语法错误。
EG 4
转置矩阵
#include <stdio.h>
int main()
{
int a[2][3] = {
{
1,2,3},{
4,5,6}};
int b[3][2],i,j;
printf("array a = \n");
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
printf("%5d",a[i][j]) ;
b[j][i] = a[i][j];
}
printf("\n");
}
printf("\n");
printf("array b = \n");
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
{
printf("%5d",b[i][j]) ;
}
printf("\n");
}
}
EG 5
求一个3-4矩阵的最大值并输出下标
#include <stdio.h>
int main()
{
double a[3][4];
int i,j;
printf("请输入 \n");
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
scanf("%lf",&a[i][j]) ;
}
}
printf("\n");
printf("输入的矩阵 = \n");
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%lf\t",a[i][j]) ;
}
printf("\n");
}
printf("\n");
double max = 0;
int row,rol;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
if(a[i][j]>max)
{
max = a[i][j];
row = i;
rol = j;
}
}
}
printf("最大值是%lf \n",max);
printf("坐标是%d,%d \n",row,rol);
return 0;
}
习题 1
- 用筛选法求100之内的素数
筛选法:又称为筛法。先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。因为希腊人是把数写在涂腊的板上,每要划去一个数,就在上面记以小点,寻求质数的工作完毕后,这许多小点就像一个筛子,所以就把埃拉托斯特尼的方法叫做“埃拉托斯特尼筛”,简称“筛法”。(另一种解释是当时的数写在纸草上,每要划去一个数,就把这个数挖去,寻求质数的工作完毕后,这许多小洞就像一个筛子。)
#include<stdio.h>
int main()
{
int i,j,k;
int a[100];
for (i = 0; i < 100; i++)
a[i] = i+1;
// 因为1是素数,把a[0]用0标记
// 最后一个位置数字是100,100不是素数,因此循环可以少循环一次
a[0] = 0;
for(i=0;i<99;i++)
{
// 用a[i]位置的数字去模i位置之后的所有数据
// 如果能够整除则一定不是素数,该位置数据用0填充
for (j = i + 1; j < 100; j++)
{
if (a[i] != 0 && a[j] != 0)
{
//把不是素数的都赋值为0
if (a[j] % a[i] == 0)
a[j] = 0;
}
}
}
printf(" 筛选法求出100以内的素数为:\n");
for (i = 0; i < 100; i++)
{
//数组中不为0的数即为素数
if (a[i] != 0)
printf("%3d", a[i]);
}
printf("\n");
return 0;
}
习题 2 选择排序
用选择法对10个整数排序
选择排序
#include<stdio.h>
int main()
{
int array[10]={
1,4,6,89,3,45,56,89,32,56};
int i, j, k, tmp;
//求长度
int size = sizeof(array) / sizeof(array[0]);
for (i = 0; i < size - 1; i++)
{
k=i;
//找最小的过程
for (j = i + 1; j < size; j++) {
if (array[j] < array[k]) {
k = j;
}
}
// 把最小的数字给arr[i]
tmp = array[k];
array[k] = array[i];
array[i] = tmp;
}
printf("排序后的结果:") ;
for (i = 0; i < size ; i++)
{
printf("%d\t",array[i]) ;
}
return 0;
}
习题 3
求一个3 X 3的整形矩阵对角线元素之和
#include<stdio.h>
int main()
{
int array[3][3];
int i, j, sum=0;
printf("请输入3-3矩阵");
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++) {
scanf("%d",&array[i][j]);
}
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++) {
printf("%d\t",array[i][j]);
if (i==j) {
sum+=array[i][j];
}
}
printf("\n");
}
printf("sum = %d\t",sum);
return 0;
}
习题 4 插入排序
有一个已经排好序的数组,要求输入一个数后,按原来顺序的规律将它插入数组中
插入排序
从第一个元素开始,该元素可以认为已经被排序;
取出下一个元素,在已经排序的元素序列中从后向前扫描;
如果该元素(已排序)大于新元素,将该元素移到下一位置;
重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
将新元素插入到该位置后;
重复步骤2~5。
#include<stdio.h>
int main()
{
int num=0;
int array[100] = {
1,2,55,66,77,89,90,455,789,4556};
printf("请输入一个整数:");
scanf("%d", &num);
int j=9;
while(j >= 0 && (array[j]>num))
{
array[j+1] = array[j];
printf("把原来第%d位的%d赋值给第%d位\n",j+1,array[j],j+2);
j--;
}
printf("第%d位数%d小于%d,把%d插到第%d位\n",j+1,array[j],num,num,j+2);
array[j+1] = num;
for (j = 0 ; j<11; j++)
{
printf("%d\t",array[j]);
}
return 0;
}
结果
请输入一个整数:4
把原来第10位的4556赋值给第11位
把原来第9位的789赋值给第10位
把原来第8位的455赋值给第9位
把原来第7位的90赋值给第8位
把原来第6位的89赋值给第7位
把原来第5位的77赋值给第6位
把原来第4位的66赋值给第5位
把原来第3位的55赋值给第4位
第2位数2小于4,把4插到第3位
1 2 4 55 66 77 89 90 455 789 4556
--------------------------------
Process exited after 3.589 seconds with return value 0
请按任意键继续. . .
习题 5
将一个数组中的值按逆序重新存放。例如:原来顺序为8,6,5,4,1。要求改为1,4,5,6,8。
- 简单版
#include<stdio.h>
int main()
{
int a[5] = {
8,6,5,4,1};
int b[5],i;
for(i=0;i<5;i++)
{
b[4-i]=a[i];
}
for(i=0;i<5;i++)
{
printf("%d",b[i]) ;
}
return 0;
}
- 复杂版本
手动输入—
#include<stdio.h>
int main()
{
int i=0,n;
int a[100],b[100] ;
printf("输入长度:");
scanf("%d",&n);
printf("输入数字:");
for(i=i;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
b[n-i-1]=a[i];
}
for(i=0;i<n;i++)
{
printf("%d\t",b[i]) ;
}
}
- 地狱版本
不定长数组的输入问题C/C++实现
动态规划
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
void main(void)
{
int i =0;
char c;
int count = 10;
int *a = (int*)malloc(10*sizeof(int));//初始分配10个大小的空间
int n;
while( scanf("%d",&n)){
a[i] = n;
i++;
if((c = getchar()) == '\n')
break;
if(i>=count)
{
a = (int *)realloc(a,(i+10)*sizeof(int));//当空间不够,继续追加
count += 10;
}
}
for(int j = 0; j<i;j++)
printf("%d ",a[j]);
system("pause");
return;
}
习题 6
- 输出一下的杨慧三角(要求输出10行)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
#include<stdio.h>
int main()
{
int i,j,a[6][6];
for(i=0;i<6;i++)
{
for(j=0;j<=i;j++)
{
if((i==j)||(j==0))
a[i][j]=1;
else
a[i][j] = a[i-1][j]+a[i-1][j-1];
}
}
for ( i = 0; i < 6; ++i)
{
for ( j = 0; j <= i; ++j)
{
printf("%5d", a[i][j]);
}
printf("\n");
}
}
习题 7
输出"魔方阵"。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如:
8 1 6
3 5 7
4 9 2
要求输出1~n^2 的自然数构成的魔方阵。
————————————————
魔方阵的生成方法为:在第0行中间置1,对从2开始的其余n ^ 2 − 1 个数依次按下列规则存放:
将1放在第1行的中间一列。
从2开始直到n*n止,各数依次按此规律存放:每一个数存放的行比前一个数的行数减1,列数加1。
如果上一行的行数为1,则下一个数的行数为n(指最下一行)。
当上一个数的列数为n时,下一个数的列数应该为1。
如果按上面规律确定的位置有数,或者上一个数是第1行第n列时,则把下一个数放在上一个数的下面。