利用模块化设计思想,实现如下功能:
1)定义函数从文件中读取一组数据存入一维数组score中,返回读取的数据个数
2)定义函数,实现任意一个一维数组的前n 个元素求和,并返回最后的结果
3)定义函数实现利用二分法查找该数s是否存在数组score中,如果存在则返回对应的元素下标,否则返回-1
5)定义一个函数,实现输入一个数x,将其插入到数组中,插入后的数组元素顺序不变,返回数组的元素个数。
6) 定义一个函数按某顺序对这数组进行排序,如果des为0,则降序,如果des为1,则升序。算法可以选择冒泡或选择排序。
程序里面测试的文件暂时放在 F:\1.txt
可以根据情况修改。
文件里面的数据格式为一行整数,整数之间用空格分开,例如: 5 84 3 1 0 7 9
#include <stdio.h>
// 1.定义函数从文件中读取一组数据存入一维数组score中,返回读取的数据个数
int read(int arr[])
{
int n = 0;
FILE *fp;
fp = fopen("F:\\1.txt", "r");
if(fp == NULL) {
return -1;
}
while(!feof(fp)) {
fscanf(fp, "%d", &arr[n]);
n++;
}
fclose(fp);
printf("数组数据个数:%d\n", n);
return n;
}
// 2.定义函数,实现任意一个一维数组的前n 个元素求和,并返回最后的结果
int sum(int arr[], int n)
{
int i, s = 0;
for(i=0; i<n; i++) {
s += arr[i];
}
printf("前n个元素的和:%d\n", s);
return s;
}
// 3.定义函数实现利用二分法查找该数s是否存在数组score中,如果存在则返回对应的元素下标,否则返回-1
int search(int arr[], int n, int des)
{
int s;
int left = 0;
int right = n - 1;
int mid = 0;
printf("请输入需要查找的元素: ");
scanf("%d", &s);
if(des == 0) { // 数组元素为降序顺序
while(left <= right) {
mid = (left + right) / 2;
if(arr[mid] > s) {
left = mid + 1;
}
else if(arr[mid] < s) {
right = mid - 1;
}
else {
printf("找到目标,%d 元素的下标是: %d\n", s, mid);
return mid;
}
}
}
else if(des == 1) { // 数组元素为升序顺序
while(left <= right) {
mid = (left + right) / 2;
if(arr[mid] < s) {
left = mid + 1;
}
else if(arr[mid] > s) {
right = mid - 1;
}
else {
printf("找到目标,%d 元素的下标是: %d\n", s, mid);
return mid;
}
}
}
printf("找不到目标\n");
return -1;
}
// 4.定义一个函数实现输入一个数x,将其从数组中删除,返回剩余的元素个数。(首先保证这个数是存在的)
int remove(int arr[], int n)
{
int x, i;
printf("请输入需要删除的元素: ");
scanf("%d", &x);
for(i=0; i<n; i++) {
if(arr[i] == x) {
break;
}
}
for(; i<n-1; i++) {
arr[i] = arr[i + 1];
}
printf("删除成功,数组元素个数为: %d\n", n + 1);
return (n - 1);
}
// 5.定义一个函数,实现输入一个数x,将其插入到数组中,插入后的数组元素顺序不变,返回数组的元素个数。
int insert(int arr[], int n, int des)
{
int x, i, j;
printf("请输入需要插入的元素: ");
scanf("%d", &x);
if(des == 0) { // 数组元素为降序顺序
for(i=0; i<n; i++) {
if(x > arr[i]) {
break;
}
}
for(j=n; j>i; j--) {
arr[j] = arr[j - 1];
}
arr[i] = x;
}
else if(des == 1) { // 数组元素为升序顺序
for(i=0; i<n; i++) {
if(x < arr[i]) {
break;
}
}
for(j=n; j>i; j--) {
arr[j] = arr[j - 1];
}
arr[i] = x;
}
printf("插入成功,数组元素个数为: %d\n", n + 1);
return (n + 1);
}
// 6.定义一个函数按某顺序对这数组进行排序,如果des为0,则降序,如果des为1,则升序。算法可以选择冒泡或选择排序。
void sort(int arr[], int n, int des)
{
int i, j, t;
if(des == 0) { // 数组元素为降序顺序
for(i=0; i<n; i++) {
for(j=0; j<n-1-i; j++) {
if(arr[j] < arr[j + 1]) {
t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
}
}
printf("降序排序: ");
for(i=0; i<n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
else if(des == 1) { // 数组元素为升序顺序
for(i=0; i<n; i++) {
for(j=0; j<n-1-i; j++) {
if(arr[j] > arr[j + 1]) {
t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
}
}
printf("升序排序: ");
for(i=0; i<n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
}
// 7.输出数组所有元素
void print(int arr[], int n)
{
int i;
printf("输出数组所有元素: ");
for(i=0; i<n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[100];
int num; // 数组元素个数
num = read(arr);
sort(arr, num, 1);
sum(arr, 3);
search(arr, num, 1);
num = insert(arr, num, 1);
print(arr, num);
num = remove(arr, num);
print(arr, num);
return 0;
}
1
#include <stdio.h>
int main()
{
int a[6];
FILE* fpread;
fpread = fopen("data.txt", "r");
if (fpread == NULL)
{
printf("file is error.");
return -1;
}
for (int j = 0; j < 6; j++)
{
fscanf(fpread, "%d", &a[j]);
}
fclose(fpread);
for (int j = 0; j < 6; j++)
{
printf("%d\t",a[j]);
}
printf("\n");
return 0;
}
2
#include<stdio.h>
int arraySum(int a[],int n)
{
int Nsum=0; //定义一个变量存储元素的和
for(int i=0;i<n;i++)
{
Nsum=Nsum + a[i];
}
return Nsum;
}
int main()
{
int b[5]={10,23,45,21,67};
int c= 4;
int sum = arraySum(b,c); //调用函数并传参
printf("数组b前%d位的和==%d/n",c,sum);
return 0;
}
3
#include<stdio.h>//标准输出,输入头文件
int brnary_search(int arr[],int k,int sz)//int 这个函数返回整数,注:(int arr[]接收实参数组的第一个元素地址),数组传参数不会把这个数组全部传上去,而是把数组元素首个地址传上去。
{
int left=0;//数组的左下标
int light=sz-1;//数组的右下标,因为sz代表数组元素的个数,因为数组下标从0开始,使用最右下标应该-1;
while(left<=light)//循环条件左下标必须小于或等于才能进入循环。
{
int mid=(left+light)/2;//每次求中间的下标
if(arr[mid]<k)//判断中间下标对应的元素值小于查找k的值。
{
left=mid+1;//中间下标+1,为下次循环left的值
}
else if(arr[mid]>k)//判断中间下标对应的元素值大于查找k的值
{
light=mid-1;//上面判断所查找的值小,所以新的范围应该在左边,左边下标不变,右边下标为中间下标-1;
}
else
{
return mid;//查找的值与数组值相等,返回数组下标,
}
}
return -1;//当查找左下标超过右下标,代表查询整数不在数组范围内,返回-1;
}
int main()//主函数
{
int arr[]={1,2,3,4,5,6,7,8,9,10};//定义数组
int k=0;
printf("请输入想查找的整数:");
scanf("%d",&k);//从键盘获取要查找的整数
int sz=sizeof(arr)/sizeof(arr[0]);//求出数组里元素的个数。
int ret=brnary_search(arr,k,sz);//创建ret 变量来接收查找返回值()里的元素代表要传的实参数。
if(-1==ret)//判断返回值是否等于-1;
{
printf("找不到\n");
}
else
{
printf("找到了,下标为:%d\n",ret);//定义函数返回的数组下标。
}
return 0;
}
5
#include<stdio.h>//直接插入排序
void insert_array(int *a,int length,int element)//插入函数 往有序的数组a里插入值为element的元素使数组a依然有序
{
int i,j,t,f;
for(i=0;i<length;i++)
{
if(a[i]>element)
{
t=i;//找到位置以后 可以依次移动数组元素腾出位置了
for(j=length;j>=t;j--)
{
if(j==t)
a[j]=element;
else
a[j]=a[j-1];//数组依次往后移动 不管正序还是倒序都可以
}
f=1;
break;
}
}
if(f!=1)//当element大于所有数组元素时候
{
a[length]=element;
}
for(i=0;i<length+1;i++)
{
printf("%d ",a[i]);
}
}
int main()
{
int a[5]={1,2,3,5,6};
int e=7;
insert_array(a,5,e);
}
6
#include<stdio.h>
void sort(int a[],int n)
{
int temp,i,j;
for(i=0;i<n-1;i++) //i<n-1是因为数组的最后一位已经在之前的运算中接受了排序。
{
for(j=i+1;j<n;j++)
{
if(a[i]>a[j])
{temp=a[i];a[i]=a[j];a[j]=temp;} //注意if的规范书写(加{}),不规范可能出错。
}
}
}
void PrintArr(int a[], int n)
{
int i;
for(i=0;i<n;i++)
printf("%d ",a[i]);
}
int main(void)
{
int len,a[100],i;
scanf("%d",&len);
for(i=0;i<len;i++)
{
scanf("%d",&a[i]);
}
sort(a,len);
PrintArr(a,len);
return 0;
}