【GZIST】C语言程序设计
实验六 数组类型程序设计【-8】
1.数制转换【X】
3.排序【X】
任务3:编写程序,实现题目要求
1.打渔还是晒网【X】
2.对称矩阵
3.比较字符串大小【X】
6.2提高实验任务【X】
1.字符统计
2.数字方阵
6.1基本实验任务
任务1:阅读程序【H】
1.
#include <stdio.h>
int main()
{
int a[] = { 1,2,3,4,5 }, i, j, s = 0;
j = 1;
for (i = 4; i >= 0; i--)
{
s = s + a[i] * j;
j = j * 10;
}
printf("s=%d\n", s);
return 0;
}
2.
#include <stdio.h>
int main()
{
char ch[7] = { "65ab21" };
int i, s = 0;
for (i = 0; ch[i] >= '0' && ch[i] <= '9'; i += 2)
s = 10 * s + ch[i] - '0';
printf("%d\n", s);
return 0;
}
3.
#include <stdio.h>
int main()
{
int i, j, x = 0, y = 0, m;
int a[3][3] = { 1,-2,0,4,-5,6,2,4 };
m = a[0][0];
for (i = 0; i < 3; i++)
{
for(j=0;j<3;j++)
if (a[i][j] > m)
{
m = a[i][j];
x = i;
y = j;
}
printf("(%d,%d)=%d\n", x, y, m);
}
return 0;
}
4.
#include <stdio.h>
int main()
{
int i;
char str[10], temp[10];
gets(temp);
for (i = 0; i < 4; i++)
{
gets(str);
if (strcmp(temp, str) < 0)
strcpy(temp, str);
}
printf("%s\n", temp);
return 0;
}
任务2:完成程序
1.数制转换【X】
2.矩阵运算【硬核】
#include <stdio.h>
#define M 10
int main()
{
int x[M][M];
int n, i, j;
long s = 1;
printf("输入矩阵行列数(<=10):\n");
scanf("%d", &n);
printf("按行输入矩阵数据:\n");
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
scanf("%d", &x[i][j]);
}
for (i = 0; i < n; i++)
{
for (j = i; j < n; j++)
s *= x[i][j];
}
;
printf("%d\n", s);
return 0;
}
3.排序【X】
任务3:编写程序,实现题目要求
1.打渔还是晒网【X】
2.对称矩阵
#include <stdio.h>
#define M 10
int main ( )
{
int x[M][M];
int n, i, j;
printf("输入矩阵行列数(<=10):\n");
scanf("%d", &n);
printf("按行输入矩阵数据:\n");
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
scanf("%d", &x[i][j]);
}
int flag = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
if (x[i][j] == x[j][i])
flag = 1;
}
if(1==flag)
printf("矩阵是对称的\n");
return 0;
}
3.比较字符串大小【X】
6.2提高实验任务【X】
1.字符统计
2.数字方阵
实验七 函数程序设计
7.1基本实验任务
任务1:阅读程序
01-函数栈帧的创建与销毁
#include <stdio.h>
int fun(int x, int y, int z)
{
z = x * x + y * y;
return z;
}
int main()
{
int a = 38;
fun(7, 3, a);
printf("%d\n", a);
return 0;
}
02-选择排序
#include <stdio.h>
sort(int a[], int n)
{
int i, j, t, p;
for (j = 0; j < n - 1; j++)
{
p = j;
for (i = j; i <= n - 1; i++)
if (a[i] < a[p])
p = i;
t = a[p];
a[p] = a[j];
a[j] = t;
}
}
int main()
{
int a[6] = { 9,6,8,7,11,12 }, i, j, t, p;
sort(a, 6);
for (i = 0; i < 6; i++)
printf("%3d", a[i]);
return 0;
}
3.
#include <stdio.h>
#include <stdio.h>
fun(int k)
{
if (k > 0)
fun(k - 1);
printf("%d", k);
}
int main()
{
int a = 5;
fun(a);
return 0;
}
4.
#include <stdio.h>
int a = 1;
fun(int b)
{
static int a = 5;
a += b;
printf("%d,a");
return(a);
}
int main()
{
int d = 3;
printf("%d\n", fun(d * fun(a + d)));
return 0;
}
任务2:完成程序【补】
1.幂运算
2.求平均分
3.数组元素累加和
任务3:编写程序,实现题目要求【补】
1.大小写转换函数
2.十进制到任意进制转换
3.商和余数
7.2提高实验任务【补】
1.素数的平方根之和
2.米字号转移
实验八 指针程序设计
8.1基本实验任务
任务1:阅读程序
01-对存取的基本理解
#include <stdio.h>
int main()
{
//&向下取地址;*向上解引用;
//表层是变量,底层是内存;
//变量从内存进行存(&)和取(*)操作;
int*p, a = 15, b = 5;
p = &a;//将a的地址存入指针变量p
a = *p + b;//*p为解引用,即从地址中取出a
printf("a=%d, %d", a, *p);
return 0;
//注意:指针变量p存放的是a的地址,a运算后,地址中的值也会相对应改变
}
02-【疑难点】指针的运算
#include <stdio.h>
int main()
{
int a[] = { 1,2,3,4,5,6 };
int* p, i;
p = a;//将数组存入指针变量
//数组名就是数组首元素的地址
//*p表示变量,已经解引用!!!
*(p + 4) += 3;//须加深理解,指针的运算
//这行代码将数组的第五个元素(由于数组索引从 0 开始,p + 4 指向第 5 个元素)增加了 3。
// 因此,数组 a 现在变为 {1, 2, 3, 4, 8, 6}。
printf("n1=%d,n2=%d\n", *p, *(p + 3));
//这会打印数组的第一个元素(*p,值为 1)和第四个元素(*(p + 3),值为 4)。
return 0;
}
03-大小写分离
#include <stdio.h>
int main()
{
char a[80], b[80], * p = "aAbcdDefgGH";
int i = 0, j = 0;
while (*p != '\0')
{
if (*p >= 'a' && *p <= 'z')
{
a[i] = *p;
i++;
}
else
{
b[j] = *p;
j++;
}
p++;
}
a[i] = b[j] = '\0';
puts(a);
puts(b);
return 0;
}
任务2:完成程序
01-数组元素求和
#include <stdio.h>
int main()
{
int a[6] = { 2,4,6,8,10,12 };
int s, i, * p;
s = 0;
p = a;
for (i = 0; i < 6; i++)
{
s += *(p + i);
}
printf("s=%d\n", s);
return 0;
}
02-字符串输入输出
#include <stdio.h>
int main()
{
char str[61], *p;
int i;
for (i = 0; i < 60; i++)
{
str[i] = getchar();
if (str[i] == '\n')
break;
}
str[i] = '\0';
p = str;//指针初始化
while (*p)
{
putchar(*p);
p++;//遍历字符数组
}
return 0;
}
任务3:编写程序,实现题目要求
01-简单排序:比较和交换操作是排序的核心。
记得回来看看,懵懵懂懂,变量与指针的空间想象???及交换过程的具象化
#include <stdio.h>
int main()
{
int a = 0, b = 0, c = 0;
int* pa = &a;
int* pb = &b;
int* pc = &c;
scanf("%d %d %d", &a, &b, &c);
if (*pa > *pb)
{
int t = *pa;
*pa = *pb;
*pb = t;
}
if (*pa > *pc)
{
int t = *pa;
*pa = *pc;
*pc = t;
}
if (*pb > *pc)
{
int t = *pb;
*pb = *pc;
*pc = t;
}
printf("%d %d %d", *pa, *pb, *pc);
return 0;
}
02-逆序输出【补】
8.2提高实验任务
01-冒泡法排序
冒泡排序的核心思想就是:两两相邻的元素进行比较
#include <stdio.h>
#define MAX_LENGTH 10
void Scanf(int*arr, int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
scanf("%d", arr + i);//记得取地址
//scanf("%d", &arr[i]);
}
}
int count = 0;
void Bubble_Sort(int* arr, int sz)
{
//1 2 3 4 5 6
//趟数sz-1
int i = 0;
for (i = 0; i < sz - 1; i++)//趟数就是冒泡的个数,最后一个不用冒泡,已经暴漏了,所以是sz-1
{
int flag = 1;//假设是有序
int j = 0;
for (j = 0; j < sz - 1 - i; j++)//为什么是sz-1-i,思想是两两相比较,已经冒泡的不用比较,所以要-i,对剩下的进行比较
{
count++;
if (arr[j] > arr[j + 1])//升序
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = 0;
}
}
if (1 == flag)
{
break;
}
}
}
void Printf(int* arr, int sz)//参数写成指针形式,接收数组首元素的地址
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", *(arr+i));//记得解引用
//printf("%d ", arr[i]);
}
}
int main()
{
int arr[MAX_LENGTH] = { 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
printf("请输入10个数据进行排序:\n");
Scanf(arr, sz);
Bubble_Sort(arr, sz);
printf("10个数据的顺序为:\n");
Printf(arr, sz);
printf("\n count = %d \n", count);
return 0;
}